用語集
- BLIT (Block Transfer)
- BLT とも呼ばれます。blit は、 メモリをバイト毎にコピーすることを指します。 C では、memcpy という名前で呼ばれています。 この名前は DEC PDP-10 コンピュータの BLT 命令に由来します。
- CTFE (Compile Time Function Evaluation)
- D の普通の関数を、 実行時ではなくコンパイル時に実行する機能のことを言います。
- COW (Copy On Write)
- COW はメモリ割り当て戦略の一種で、 配列に変更が加えられそうになったらコピーを行うというものです。
- ファンクタ (Functor)
- ユーザー定義型 (struct または class) で、関数呼び出し演算子 (Dの場合opCall) が定義されており、関数と同じように使えるようなもののことを言います。
- GC (Garbage Collection)
- ガベージコレクション(ごみ集め)とは、 高尚に言うと自動メモリ管理のことです。メモリを割り当てて使って、 もう参照されなくなると、GCが自動的にそのメモリ領域を解放します。 対照的に、明示的メモリ管理を採用した場合は、 プログラマがメモリ割り当てとメモリ解放の対応関係に ちゃんと注意しなければなりません。
- 高階関数 (Higher-order function)
- 他の関数を引数として受け取ったり、 返値として返したり、あるいはその両方を行う関数。
- 不正(Illegal)
- あるコードが不正であるとは、 Dの言語仕様に従っていないことを意味します。 例えコンパイラや実行時ライブラリがエラーを検出できなかったとしても、 不正なものは不正です。
- 実装定義の動作(Implementation Defined Behavior)
- D言語の動作のうち、 定義は言語処理系の実装者に任されているもののことを言います。 実装定義の動作の例としては、ポインタのサイズがあります: 32bitマシンではポインタは4byteで、 64bitマシンでは8byteになるでしょう。 言語の実装定義の動作の部分を最小に押さえることで、 コードのポータビリティが最大になります。
- NRVO (Named Return Value Optimization)
-
NRVO は、(この名前がついたのはもっと後ですが) 1991年頃に Walter Bright によって発明された、 構造体のコピー回数を最小化する技術です。 関数は通常、返値をレジスタで返します。 しかし、構造体の場合、ほとんどはレジスタに入らないサイズです。 これに対する普通の解決策は、 呼び出し側のスタックフレームにある構造体への 隠しポインタ を関数に渡して、 返値はそこにコピーするという方法です。 例えば:
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 の目的は返値を提供することであり、result の参照は全て *hidden で置き換えられると判断することです。 foo はこのとき、次のように書き換えられます:
S* foo(S* hidden) { hidden.a = 3; return hidden; }
foo の呼び出し側でさらに強力な最適化を加えることで、 もう1つのコピーも消えて無くなり:
void test() { S s; foo(&s); }
他のインスタンスを作って持ち回る代わりに、 結果は直接 s へと書き込まれるようになります。
- 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を使って作成します。
- SFINAE (Substitution Failure Is Not An Error)
- テンプレートの推論の結果 valid でない型が出てきた場合は、 コンパイルエラーとするのではなく、 単にその推論を失敗とする、という方針のことを言います。 SFINAE 参照。
- TMP (Template Metaprogramming)
- TMP は言語のテンプレート機能を使って、 実行時ではなくコンパイル時に処理を行うことをいいます。
- 未定義動作 UB (Undefined Behavior)
- 未定義動作は、不正なコードが実行されたときに発生します。 未定義動作の結果は、ランダムな値や、エラー的な挙動、 クラッシュ、失敗などなどになります。