Improve this page
Github へのログインが必要です。
簡単な修正は、ここから fork、オンライン編集、pull request ができます。
大きな修正については、
通常の clone で行って下さい。
Page wiki
関連するWikiページを参照・編集
English
このページの英語版(原文)
用語集
- BLIT (Block Transfer)
- BLT とも呼ばれます。blit は、 メモリをバイト毎にコピーすることを指します。 C では、memcpy という名前で呼ばれています。 この名前は DEC PDP-10 コンピュータの BLT 命令に由来します。
- CTFE (Compile Time Function Evaluation)
- D の普通の関数を、 実行時ではなくコンパイル時に実行する機能のことを言います。
- code point
- Unicode の用語で、code point は論理的な一文字を指します。コードポイントの範囲は 0 から 0x10FFFF までです。dchar 型だけがコードポイントをそのまま格納できます; char や wchar の配列は可変長のエンコーディング UTF-8 や UTF-16 を使っています。
- COW (Copy On Write)
- COW はメモリ割り当て戦略の一種で、 配列に変更が加えられそうになったらコピーを行うというものです。
- データ レース (Data Race)
- あるスレッドがあるメモリ上の位置に対して読み書きしているときに、 同時に別のスレッドが同じ箇所を読み書きすること。
- ファンクタ (Functor)
- ユーザー定義型 (struct または class) で、関数呼び出し演算子 (Dの場合) が定義されており、関数と同じように使えるようなもののことを言います。
- GC (Garbage Collection)
- ガベージコレクション(ごみ集め)とは、 高尚に言うと自動メモリ管理のことです。メモリを割り当てて使って、 もう参照されなくなると、GCが自動的にそのメモリ領域を解放します。 対照的に、明示的メモリ管理を採用した場合は、 プログラマがメモリ割り当てとメモリ解放の対応関係に ちゃんと注意しなければなりません。
- 高階関数 (Higher-order function)
- 他の関数を引数として受け取ったり、 返値として返したり、あるいはその両方を行う関数。
- IFTI (Implicit Function Template Instantiation)
- 関数テンプレートを、 テンプレート型引数を明示して渡さずともインスタンス化できる能力のことを指します。 この場合は、 実行時引数から自動的に型が推論されます。
- 不正(Illegal)
- あるコードが不正であるとは、 Dの言語仕様に従っていないことを意味します。 例えコンパイラや実行時ライブラリがエラーを検出できなかったとしても、 不正なものは不正です。
- 入力レンジ (Input range)
- メンバ関数 empty, head, next が定義された型 (つまり、構造体やクラス): 入力レンジは狭義の1パス処理です: レンジのコピーの中にイテレーションの 状態を保存することはできません。range 参照。
- 実装定義の動作(Implementation Defined Behavior)
- D言語の動作のうち、 定義は言語処理系の実装者に任されているもののことを言います。 実装定義の動作の例としては、ポインタのサイズがあります: 32bitマシンではポインタは4byteで、 64bitマシンでは8byteになるでしょう。 言語の実装定義の動作の部分を最小に押さえることで、 コードのポータビリティが最大になります。
- NRVO (Named Return Value Optimization)
NRVO は、(この名前がついたのはもっと後ですが) 1991年頃に Walter Bright によって発明された、 構造体のコピー回数を最小化する技術です。 関数は通常、返値をレジスタで返します。 しかし、構造体の場合、ほとんどはレジスタに入らないサイズです。 これに対する普通の解決策は、 呼び出し側のスタックフレームにある構造体への hidden pointer を関数に渡して、 返値はそこにコピーするという方法です。 例えば:
struct S { int a, b, c, d; } S foo() { S result; result.a = 3; return result; } void test() { S s = foo(); }
これが下のように変換されます:
S* foo(S* hidden) { S result; result.a = 3; *hidden = result; return hidden; } void test() { S tmp; S s = *foo(&tmp); }
この書き換えでは、余分な構造体オブジェクト tmp が一つできて、 構造体の中身は2回コピーされます。 NRVO が行うのは、変数 result の参照は全て *hidden で置き換えられると判断することです。 foo はこのとき、 次のように書き換えられます:
S* foo(S* hidden) { hidden.a = 3; return hidden; }
foo の呼び出し側でさらに強力な最適化を加えることで、 もう1つのコピーも消えて無くなり:
void test() { S s; foo(&s); }
他のインスタンスを作って持ち回る代わりに、 結果は直接 s へと書き込まれるようになります。
- narrow strings
- char, wchar やその修飾付きバージョンの配列は、 すべて narrow string に分類されます。(string と wstring も含まれます。) 標準ライブラリ内のレンジに基づく関数は、 narrow string を特別に扱い、 UTFでエンコードされた文字の列として自動的にデコードします。
- opApply
- コレクションの要素を順々に処理するための特別なメンバ関数です。 この関数は ForeachStatement で使用されます。
- opApplyReverse
- コレクションの要素を逆順に処理するための特別なメンバ関数です。 この関数は ForeachStatement で使用されます。
- POD (Plain Old Data)
- とは、隠しメンバを持たず、 仮想関数を持たず、継承もしておらず、 デストラクタもなく、 単純なビットごとのコピーで初期化や複製ができるデータ構造のことです。 D の構造体は POD です。
- Predicate
- Booleanの結果を返す関数やdelegateのこと。述語は、 零項 (nullary, 引数なし), 単項 (unary, 引数1つ), 二項 (binary, 引数2つ), n項 (n-ary, 引数n個) などの種類があります。 述語という名前は、 述語を引数として受け取る高階関数の説明によく登場します。
- RAII (Resource Acquisition Is Initialization)
- RAII とは、クラスオブジェクトのスコープが終わるところで 呼ばれるデストラクタを利用するテクニックです。 その呼ばれたデスクトラクタが、 そのオブジェクトが確保したリソースを解放します。 RAII は、短い区間でのみ使うリソースか、 解放される時点が明確である必要のあるリソースに対して用います。 D では、RAIIオブジェクトは scope 記憶域クラスを使って作成します。
- Sequential Consistency
- あるスレッドである順序で書き込まれたデータが、 別のスレッドからは同じ順序で観測可能になること。
- SFINAE (Substitution Failure Is Not An Error)
- テンプレートの推論の結果 valid でない型が出てきた場合は、 コンパイルエラーとするのではなく、 単にその推論を失敗とする、という方針のことを言います。 SFINAE 参照。
- TMP (Template Metaprogramming)
- TMP は言語のテンプレート機能を使って、 実行時ではなくコンパイル時に処理を行うことをいいます。
- TLS (Thread Local Storage)
- TLS とは、グローバルなデータ用の記憶領域を各スレッド毎に別々に割り当てたもののことを言います。 Wikipedia も参照のこと。
- UB (未定義動作 (Undefined Behavior))
- 未定義動作は、不正なコードが実行されたときに発生します。 未定義動作の結果は、ランダムな値や、エラー的な挙動、 クラッシュ、失敗などなどになります。 バッファオーバーフローが未定義動作の例です。