D1 コードの D2 への移植
D言語に対して行われた変更の中で、 D1 から D2 へとソースコードを移行する際に影響するものは多くあります。 このドキュメントは、 どのようにコードを修正すればよいかのガイドです。 言語に対する変更点の一覧は、 >D 2.0 の新機能 のページをご覧下さい。
このドキュメントはまだ不完全です。
- 言語機能
- Phobos ライブラリ
新しい予約語
D2 には以下の予約語が追加されています: pure, nothrow, shared, immutable。 D1のコードがこれらの単語を使っていた場合は、リネームが必要です。 また、アンダースコア ( _ ) 2つで始まる変数名も、 すべてリネームが必要です。
グローバル変
グローバル変数は、デフォルトでは、スレッドローカル記憶域に保存されるようになりました。 これをグローバル領域に戻すには __gshared 記憶域クラスを指定します:
int foo = 7; // D1 のコード
__gshared int foo = 7; // D2 で同じ事をする場合
グローバル変数が暗黙に全てのスレッドで共有されるべきか、 各スレッド別の記憶領域に格納されるべきかは、 注意深く判断して下さい。
静的配列は値型
D1では、関数引数に静的配列を指定した場合、参照渡しが行われました。 つまり、その静的配列の先頭を指すポインタが、 実引数として渡されました。 これはすなわち、関数内で配列の内容に変更を加えた場合、 呼び出し側にもその変更が見えるということです。 D2 では、静的配列のコピーが実引数として渡されます。 関数内での配列内容への変更は、 別のコピーへの変更ですから、 呼び出し側には見えません。
D1と同じ意味を保った動作にするには、予約語 ref を引数宣言に追加します:
void foo(int[3] array); // D1 のコード
void foo(ref int[3] array); // D2 で同じ事をする場合
文字列リテラルは immutable
D1の文字列リテラルの型は char[] でしたが、 D2 では immutable(char)[] で、別名として string に alias されています。 コードの移植には、通常、ソースコード全体を検索して以下の置換を実行する必要があります:
from | to |
---|---|
char[] | string |
wchar[] | wstring |
dchar[] | dstring |
Thこれで問題の大部分は解決するでしょう。 解決しなかった部分、つまり実際に書き換え可能な文字列が必要な部分では、 いくらかの作業が必要です。