コンパイラはどのように機能しますか?[閉まっている]


16

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

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

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


4
広すぎる、少なくとも「仕組み」の部分。そのトピックについて書かれた本全体があります。
Oded

1
en.wikipedia.org/wiki/Compilerは、見つけるのは簡単なWikipediaリンクですが、具体的にはどう思いますか?質問は十分に広範であるため、「コンパイラはコードをある言語から別の言語に翻訳します」というスマートなアレック応答を提供したいと思います。それには本当に何が関係していますか。
JBキング

1
はい、私はそれがかなりよく答えられたと思います。
ジェレミー

1
コンパイラの動作の説明は、広すぎるか複雑すぎるかのいずれかです。それは複雑な主題であり、コンパイラークラスは私がこれまでに受けた最も難しいコンピューター関連のコースでした。
デヴィッドソーンリー

1
@Davidもちろんコンパイラは複雑であり、ここでどのように動作するかの詳細をすべて説明することはできません。ただし、コンパイラーコースを受講する前に、コンパイラーとは何か、またはコンパイラーがどのように機能するかについて、基本的な高レベルの理解があったと確信しています。
ディマ

回答:


23

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

通常、ソースコードは高レベルのプログラミング言語(Pascal、C、C ++、Java、Perl、C#など)で記述されています。実行可能コードは、CPUによって直接実行できる一連のマシン命令でも、仮想マシンで解釈される中間表現(たとえば、Javaバイトコード)でもかまいません。

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

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

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

繰り返しますが、これは非常に簡単な説明であることを強調します。最新のコンパイラーは非常に賢く、その結果、非常に複雑です。


2
実際、言語を別の言語に変換します。初期のC ++コンパイラはCにコンパイルしていました。Valaコンパイラも同様です。Javaコンパイラは、JVMのJITコンパイラがなければ実行できないバイトコードにコンパイルします。
deadalnix

1
@deadalnix私見、ポイントは、非実行可能コードから実行可能コードに移行することです。私は、C-frontはコンパイラではなく、Cコンパイラのフロントエンドであると主張します。または、コンパイルプロセスの段階(必要な場合)。もちろん、仮想マシンは「実行可能」と「非実行可能」の境界を曖昧にします。ここでは、実行可能コードは、バイトコードのように仮想マシンに入力されるものであり、JITのようにVM内で実行されるものはすべて抽象化するものと考えます。
ディマ

1
@Dima、非実行可能コードから実行可能コードまでである必要はありません。たとえば、WindowsマシンでJVMバイトコードを直接実行することはできません。

1
@ThorbjørnRavn Andersen:しかし、バイトコードはJVMによって実行可能です。「仮想マシン」の全体のポイントは、プログラマにとって実際のマシンのように見えませんか?
ディマ

2
私は、ディマが言ったように、伝統的にコンパイラが人間が読める形式から機械が読める形式にプログラムを変換したと主張します。C ++からCへのCfrontの変換や、Javaからバイトコードへのjavacの変換などのバリエーションは、基本的な伝統的な概念を知らない人に説明するまで残される可能性のある、より高度なトピックです。
カーソン63000年

5

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

コンパイラは、高レベル言語のソースプログラムと基礎となるハードウェアをブリッジします。コンパイラには以下が必要です。

  1. プログラムの構文の正確さを判断する
  2. 正しく効率的なオブジェクトコードの生成
  3. ランタイム組織
  4. アセンブラーやリンカーの規則に従って出力をフォーマットします。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.