web-dev-qa-db-ja.com

コンパイラはどのように機能しますか?

注:これが以前に尋ねられたことがないことに驚いています。もしそうであれば、検索でそれを見つけることができませんでした。

私はたくさんのウェブサイトにアクセスし、たくさんの記事を読んだり、たくさんの説明を聞いたりしました。それらのほとんどは良かったが、それらはすべて、広すぎるか、または複雑すぎるか、または単なるひどいものでした。だから私の質問は、コンパイラはどのように機能するのですか?

これが難しい、幅広い質問の場合は教えてください。そうでない場合は、質問に答えてください。

17
Dynamic

コンパイラは、別のプログラムのソースコードをプログラミング言語から実行可能コードに変換するプログラムです。

ソースコードは通常、高水準プログラミング言語(Pascal、C、C++、Java、Perl、C#など)です。実行可能コードは、CPUが直接実行できる一連のマシン命令である場合と、仮想マシンによって解釈される中間表現である場合があります(例:Javaバイトコード)。

つまり、コンパイラはプログラムを人間が読める形式から機械が読める形式に変換します。

コンパイラがどのように機能するかについては、それは確かに複雑です。この主題についての本と大学のコースがあります。プロセスの主要な段階の概要を簡単に説明しますが、これは非常に大まかな概要です。

  1. Lexing-プログラムのテキストを「トークン」に分割します。トークンは、識別子(キーワード、変数名、関数名など)や演算子(=、*、&など)などのプログラミング言語の「単語」です。
  2. 解析-トークンのシーケンスを解析ツリーに変換します。解析ツリーは、型宣言、変数宣言、関数定義、ループ、条件、式などのさまざまな言語構成を表すデータ構造です。
  3. 最適化-定数式を評価し、未使用の変数または到達できないコードを最適化し、可能であればループを展開します。
  4. 解析ツリーをマシン命令(またはJVMバイトコード)に変換します。

繰り返しますが、これは非常に簡単な説明です。最新のコンパイラーは非常にスマートで、その結果、非常に複雑です。

24
Dima

コンパイラは、プログラミング言語(ソース言語)で記述されたソースコードを別のコンピュータ言語(ターゲット言語、多くの場合、オブジェクトコードと呼ばれるバイナリ形式を持つ)に変換するコンピュータプログラム(または命令セット)です。ソースコードを変換する最も一般的な理由は、実行可能プログラムを作成することです。

コンパイラーは、高水準言語のソース・プログラムを基礎となるハードウェアと橋渡しします。コンパイラーには以下が必要です。

  1. プログラムの構文の正しさの判断
  2. 正しく効率的なオブジェクトコードの生成
  3. 実行時の編成
  4. アセンブラやリンカの規則に従って出力をフォーマットします。
5
Mario Stylianou