コンパイル

Dプログラミングで最もよく使用される2つのツールは、テキストエディタコンパイラであることがわかった。Dプログラムはテキストエディタで記述される。

Dのようなコンパイル言語を使用する場合は、コンパイルの概念とコンパイラの機能についても理解しておく必要がある。

マシンコード

コンピュータの頭脳は、マイクロプロセッサ(またはCPU、中央処理装置の略)だ。CPUに何をすべきかを指示することをコーディングと呼び、その際に使用する指示をマシンコードと呼ぶ。

ほとんどのCPUアーキテクチャは、そのアーキテクチャ固有のマシンコードを使用する。これらのマシンコード命令は、アーキテクチャの設計段階でハードウェアの制約下で決定される。最も低いレベルでは、これらのマシンコード命令は電気信号として実装される。このレベルではコーディングの容易さは主要な考慮事項ではないため、CPUのマシンコードの形式で直接プログラムを書くことは非常に困難な作業だ。

これらの機械語命令は、CPUがサポートするさまざまな操作を表す特別な数値だ。例えば、架空の8ビットCPUでは、数値4はロード操作、数値5は保存操作、数値6は加算操作を表す。左端の3ビットが操作番号、右端の5ビットがその操作で使用される値であると仮定すると、このCPUの機械語によるサンプルプログラムは次のようになる。

操作意味
10011110LOAD 11110
10110100STORE 10100
11010100INCREMENT 10100
00000000PAUSE

ビットの概念については、後の章で説明する。ここでは、マシンコードがどれほど扱いにくいものかを示すために、この例を紹介した。マシンコードはハードウェアに非常に近いので、トランプや 学生の成績表のような高レベルの概念を表現するには適していない。

プログラミング言語

プログラミング言語は、より高レベルの概念を表現できる、CPUを効率的にプログラミングするための手段として設計されている。プログラミング言語は、ハードウェアの制約を気にする必要はなく、その主な目的は使いやすさと表現力にある。プログラミング言語は、人間にとって理解しやすく、自然言語に近い。

if (a_card_has_been_played()) {
   display_the_card();
}
D

ただし、プログラミング言語は、どの自然言語よりもはるかに厳格で形式的なルールに従っている。

インタプリタ

インタプリタは、ソースコードから命令を読み取り、それを実行するツール(プログラム)だ。例えば、上記のコードの場合、インタプリタは、まずa_card_has_been_played()を実行し、次に条件に応じてdisplay_the_card()を実行することを理解する。プログラマの観点からは、インタプリタによる実行は、ソースコードを記述してインタプリタに渡すという2つのステップだけで完了する。

インタプリタは、プログラムが実行されるたびに命令を読み取り、理解する必要がある。そのため、インタプリタでプログラムを実行する速度は、同じプログラムのコンパイル済みバージョンを実行する速度よりも通常遅くなる。さらに、インタプリタは実行前にコードの分析をほとんど行わない。その結果、ほとんどのインタプリタは、プログラムの実行を開始してから初めてプログラミングエラーを発見する。

Perl、Python、Rubyなどの言語は、非常に柔軟で動的な設計のため、コードの解析が困難だ。これらの言語は伝統的にインタプリタと組み合わせて使用されてきた。

コンパイラ

コンパイラは、プログラムの指示をソースコードから読み取る別のツールだ。インタプリタとは異なり、コードを実行するのではなく、別の言語(通常はマシンコード)で書かれたプログラムを生成する。この生成されたプログラムが、プログラマーが書いた指示の実行を担当する。プログラマーの立場から見ると、コンパイラで実行するには3つのステップがある:ソースコードの記述、コンパイル、生成されたプログラムの実行。

インタプリタとは異なり、コンパイラはソースコードをコンパイル時に一度だけ読み込み、理解する。このため、一般的にコンパイルされたプログラムは、インタプリタで実行する場合よりも高速に実行される。コンパイラは通常、コードに対して高度な分析を行い、高速なプログラムの生成や、プログラムの実行開始前にプログラミングエラーを検出するのに役立つ。一方、プログラムを変更するたびにコンパイルしなければならないことは、複雑化の原因となり、人為的なミスが発生する可能性も高まる。さらに、コンパイラによって生成されたプログラムは、通常、特定のプラットフォームでしか実行できない。別の種類のプロセッサやオペレーティングシステムで実行するには、プログラムを再コンパイルする必要がある。また、コンパイルが容易な言語は、通常、インタープリタで実行される言語よりも動的ではない。

安全性やパフォーマンスの理由から、コンパイルされるように設計された言語も存在する。AdaCC++Dなどがその例だ。

コンパイルエラー

コンパイラは言語の規則に従ってプログラムをコンパイルする際に、違法な命令に遭遇するとすぐにコンパイルを停止する。違法な命令とは、言語の仕様外のものだ。カッコのミスマッチ、セミコロン欠落、キーワードのスペルミスなど、これらの問題はすべてコンパイルエラーを引き起こす。

コンパイラは、エラーを引き起こす可能性はあるが必ずしもエラーではない疑わしいコードを見つけた場合、コンパイル警告を発行することもある。ただし、警告はほとんどの場合、実際のエラーや悪いスタイルを示しているため、ほとんどの警告またはすべての警告をエラーとして扱うのが一般的な慣行だ。dmdコンパイラで警告をエラーとして有効にするスイッチは、-wだ。