はじめに
D言語は汎用システムプログラミング言語で、ネイティブコードにコンパイルされます。 Cライクな構文を持ち、静的に型付けされます。ガベージコレクションによる自動メモリ管理をサポートしますが、 手動でのメモリ管理にも対応しています。 ネイティブライブラリや実行可能ファイルを作成するために、D言語のプログラムは、 個別にコンパイルし外部ライブラリとリンク可能なモジュールとして構成されます。
このドキュメントは、プログラミング言語Dのリファレンスマニュアルです。 詳細な情報やその他のドキュメントについては , D言語のWebサイトを参照してください。
コンパイル
コンパイルは複数のフェーズに分かれます。各フェーズは、後続のフェーズから独立しています。 たとえば、構文解析スキャナーは意味解析の影響を受けません。フェーズの分離により、構文解析を行うエディターなどのツールを比較的簡単に作成できます。
- ソースファイルの文字セット
ソースファイルをチェックすることでエンコーディングが決定され、適切な解析スキャナーがロードされます。 7ビットのASCIIおよびUTFエンコーディングに対応しています。 - スクリプト行
最初の行が "#!" で始まる場合、その行はスクリプト行として無視されます。 - 字句解析
ソースファイルは一連のトークンに分割されます。 スペシャルトークン(Special tokens) は、他のトークンに置き換えられます。 スペシャルトークンシーケンス(SpecialTokenSequence) は、処理後に削除されます。 - 構文解析
トークンが順序通りに解析されて、構文ツリーが形成されます。 - 意味解析
構文ツリーから、変数の宣言、シンボルテーブルのロード、型の割り当て、およびプログラムの意味を決定します。 - 最適化
最適化は、意味的に同等でパフォーマンスが高くなるプログラムに書き換えるためのオプションパスです。 - コード生成
プログラムを実装するために、ターゲットアーキテクチャから命令が選択されます。 典型的な結果として、リンカへの入力に適したオブジェクトファイルになります。
メモリモデル
バイト はストレージの基本単位です。 各バイトは8ビットで、一意のアドレスに格納されます。 メモリロケーション は、スカラー型を保持するために必要な1バイト以上のシーケンスです。 複数のスレッドは、別々のメモリロケーションに干渉することなくアクセスできます。
メモリロケーションは3つのグループに分けられます:
- スレッドローカルなメモリロケーション は、一度に1つのスレッドからのみアクセスできます。
- immutable なメモリロケーション は、ライフタイム中は書き込むことができません。 immutable な メモリロケーションは同期せずに複数のスレッドから読み取ることができます。
- shared メモリロケーション は、複数のスレッドからアクセスできます。
スレッドローカルおよび immutable なメモリロケーションでの単一スレッドの実行は、順次一貫性があります。 これは、メモリ操作の集合的な結果が、プログラムに表示される順序で実行された場合と同じであることを意味します。
メモリロケーションへの参照が1つしかない場合は、メモリロケーションをスレッドローカルから immutable や shared に移すことができます。
メモリロケーションへの参照が1つしかない場合は、メモリロケーションを shared から immutable やスレッドローカルに移すことができます。
メモリ操作中に他のスレッドがメモリロケーションにアクセスするのを防ぐために同期が使用されている場合、 メモリロケーションを shared からスレッドローカルに、一時的に移すことができます。
オブジェクトモデル
オブジェクト は、次の状況で作成されます。
- 定義時
- NewExpression
- テンポラリ作成時
- unionのアクティブなフィールドの変更時
オブジェクトは、連続または不連続な一連のメモリロケーションに及びます。 ライフタイムは、コンストラクションからデストラクション、その間を含みます。 オブジェクトには、静的または実行時型情報によって決定される型があります。 オブジェクトのメモリロケーションには、スレッドローカル, immutable, sharedの任意の組み合わせを含めることができます。
オブジェクトは、構成されたオブジェクトに構成することができます。 構成されたオブジェクトを構成するオブジェクトはサブオブジェクトです。 他のオブジェクトのサブオブジェクトではないオブジェクトは、完結したオブジェクトです。 サブオブジェクトのライフタイムは、それが属する完結したオブジェクトのライフタイム内に常にあります。
オブジェクトのアドレスは、そのオブジェクトの最初のメモリロケーションの最初のバイトのアドレスです。 1つのオブジェクトが他のオブジェクト内にネストされていない限り、オブジェクトアドレスは区別されます。
四則演算
整数の四則演算
整数の四則演算は、2の補数 演算を使用して実行されます。整数のオーバーフローはチェックしません。
浮動小数点数の四則演算
浮動小数点数の四則演算は、 IEEE-754 浮動小数点演算を使用して実行されます。