私の理解では、コンパイラは開発者がコードを実行可能(マシンコード)ファイルにコンパイルするためのものです。コンパイラは、クライアントのマシンまたはエンドユーザーシステムには拡張されません。
代わりに、開発者はコンパイラを使用してコードをマシンコードに変換し、アプリケーションとして使用するために他のマシンに転送します。
コンパイラには、このプロセス以外の機能がありますか?その場合、いつ使用されますか?
私の理解では、コンパイラは開発者がコードを実行可能(マシンコード)ファイルにコンパイルするためのものです。コンパイラは、クライアントのマシンまたはエンドユーザーシステムには拡張されません。
代わりに、開発者はコンパイラを使用してコードをマシンコードに変換し、アプリケーションとして使用するために他のマシンに転送します。
コンパイラには、このプロセス以外の機能がありますか?その場合、いつ使用されますか?
回答:
はいといいえ。はい、古典的なシナリオは、コンパイラを使用してソースコードからマシンコードを生成し、マシンコードをユーザーに配布する開発者です。
あります。このかかわらには、いくつかの例外が。まず、多くのオープンソースプロジェクトは、主に分散(あるいは排他的に)ソースコード形式で、などのコマンドのカップルでタイピングすることによって、それらをインストールするには、エンドユーザーが期待されmake
、その後、make intall
。これにより、コンパイラ、リンカーなどが呼び出され、そのユーザーのコンピューターのソースコードからマシンコードが生成されます。ただし、これらの場合、ビルドとインストールのプロセスは、ソースコードのみのパッケージを以前にインストールしたことがないという事実を超えて、ユーザーがその知識をほとんど必要としない程度に自動化されます(少なくとも意図されています) 、彼らのパッケージマネージャーは通常、本当に関心のあるアプリケーションをインストールするための前提条件として、いくつかの「開発」パッケージをリストします(ただし、一部のユーザーはこれをエンドユーザーにとって使いにくいと見なしています)
別の例外(暗示されているが、私が見た他の回答ではあまり説明されていない)は、ジャストインタイム(JIT)コンパイラーです。JITコンパイラーのいくつかの明らかな例は、Microsoft共通言語ランタイム(CLR)とJava仮想マシン(JVM)です。これらの場合、通常、ソースコードをマシンコードに変換するのに関与する2つの完全に別個のコンパイラがあります。1つは開発者が使用します。ただし、マシンコードを直接生成するのではなく、マシンに依存しないバイトコードを生成します。次に、CLR / JVMには、これらのバイトコードをターゲットコンピューター用のマシンコードに変換する2つ目のコンパイラーが含まれています。
2番目のコンパイラは厳密には必要ではないことを付け加えます。JVMの初期バージョン(1つの例)は、バイトコードをコンパイルする代わりに解釈しました。ただし、これにはかなり深刻なパフォーマンスの低下が伴うことが多いため、実稼働での使用を目的とした最近のほとんどのJVMにはJITコンパイラが含まれています。
はい、コンパイラは主に開発者によって使用されますが、いくつかの顕著な例外があります。エンドユーザーは、コードを変更しなくても、コンパイラを使用して最新のオープンソースソフトウェアをコンパイルおよびインストールすることがあります。また、一部のプログラミング言語にはコンパイラがありません。代わりに、その場で「コンパイル」するインタープリターを使用します。その場合、エンドユーザーは自分のマシンにインタプリタをインストールする必要があります。
はい
コンパイラは、ある言語のコードを別の言語に翻訳するプログラムとして定義されます(Wikipediaを参照)。コンパイラの最も一般的な使用法は、ソース言語を機械語に翻訳することですが、これは「コンパイラ」という言葉を定義します。
たとえば、Pythonはモジュールをインポートするときにバイトコードを生成し、コンパイラの定義に適合します(ソース言語のPythonからターゲット言語のPythonバイトコードに変換するため)。
別の例は、V8 JavaScriptエンジンです。JavaScriptをx86マシンコードに変換するため、コンパイラの定義にも適合します。V8はコンパイラの定義に適合するだけでなく、Chromeに含まれており、クライアントマシンで非常に広く使用されています。
1つのケースは、実行時にコードを動的に生成し、生成されたコードを実行するアプリケーションの場合です。このコードは実行時にコンパイルする必要があります。
編集:他の例外がありますが、それらはすでに他の回答で言及されていました。
コンパイラは、開発者がプログラミング言語のコードを実行可能(マシーンコード)ファイルにコンパイルするためのものです。
「コンパイラは開発者にとって主要なものです...」と言います。しかし、プログラムがオンザフライで新しいプログラミング言語コードを生成するため、エンドユーザーのマシンにコンパイラをインストールする必要がある例を見てきました。これは、エンドユーザーが単独でコンパイラーを操作する必要があるという意味ではありません。
このプログラム設計の考えられる理由:
パフォーマンス:ルールが何らかのエンドユーザーデータストアに保存され、それらのルールによって処理される大量のデータがあるルール駆動型アプリケーションを考えてください。規則を何度も解釈する代わりに、プログラムは最初に処理コードを生成し、それをコンパイルして、処理されるデータに対して実行します
エンドユーザーが何らかの数式を追加でき、プログラムの開発者がこのために独自のパーサー/インタープリターを実装することを望まないプログラムを考えてください。代わりに、プログラムはこの式を取り、それを有効なプログラムコードに変換するためにいくつかの追加を行い、コンパイラーにコンパイルさせて、後で実行します。
そうです-コンパイラは、ソースコードを実行可能形式にコンパイルし、その後、リンカーによって実行可能バイナリファイルにリンクされます。ソースコードは、多くのコマンドラインシェル(Cシェル、bash、zshなど)、awk、sedなどのいずれかのインタープリターによって直接実行することもできます。
ディスカッションを特定の製品に限定しない限り、「開発者」と「エンドユーザー」の間に明確な線を引くのは難しい場合があります。開発者はすべて、使用するツールの「エンドユーザー」であり、「エンドユーザー」には、コンパイラやインタープリターなどの開発ツールがマシンにインストールされている場合があります。
一部のプログラムはメタプログラムです。実行中に、他のプログラム(またはソースコード)を生成してコンパイルし、何らかの方法で実行する場合があります。多段階プログラミングについてもお読みください。
したがって、この種のプログラムを使用するには、ユーザーが自分でプログラムする方法を知らない場合でも、コンパイラが必要になります(コンピューターがコンパイルする必要のあるコードを生成するため)。
例については、MELT(GCCを拡張するC ++コードを生成する)またはJ.PitratのCAIA人工知能システム(組み合わせ問題を解決するためにCコード(特に独自のコード)を生成する)を参照してください。
また、一部の言語および一部の実装では、コンパイラをどこにでも(その言語および実装でコーディングされたすべてのプログラムで)存在させる必要があります。まず、いくつかのWebブラウザーにはJavascript JITエンジン(V8など)が含まれています。また、ほとんどのCommon Lisp実装(例:SBCL)にはコンパイラーが含まれています(式を生成および評価する可能性のあるアプリケーションの実行にも役立ちます)。ホモイコニック言語とQineプログラムについてもお読みください。