D 1.0   D 2.0
About Japanese Translation

Last update Wed Apr 23 23:16:19 2008

用語集

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)
未定義動作は、不正なコードが実行されたときに発生します。 未定義動作の結果は、ランダムな値や、エラー的な挙動、 クラッシュ、失敗などなどになります。