コンパイラは開発以外で使用されていますか?


14

私の理解では、コンパイラは開発者がコードを実行可能(マシンコード)ファイルにコンパイルするためのものです。コンパイラは、クライアントのマシンまたはエンドユーザーシステムには拡張されません。

代わりに、開発者はコンパイラを使用してコードをマシンコードに変換し、アプリケーションとして使用するために他のマシンに転送します。

コンパイラには、このプロセス以外の機能がありますか?その場合、いつ使用されますか?


21
はい、コンパイラはコードをコンパイルします。
トムスクワイアズ

@Tom:Cコンパイラがゲーム機を含むさまざまなマシンにインストールされていることをどこかで読みました。これは、Cでコードを記述し、これらのデバイスに出荷され、コンパイラーによってコンパイルされ、インタープリターによって実行されることを意味しますか?
Pankaj Upadhyay

3
@Pankaj Upadhyay:コードマシンに送信され、内部プロセスによってコンパイルされる可能性があります。デバイスのユーザーがこれを確認したり、そのことを知ることはまずありません。特定のハードウェア向けにコードの一部をコンパイルする必要がある場合や、実行時にハードウェアをテストするソリューションが遅すぎる場合に実行される可能性があり、インストール中にコードを配布してコンパイルする必要が生じます。たぶん ...
FrustratedWithFormsDesigner

3
@Pankajコンパイラに付属するゲームコンソールはありませんが、一部のゲームコンソールはインストールできます。Sonyは、たとえばPS2にインストールできるバージョンのLinuxおよびGCCを提供しました。他の人々は、他のOSやソフトウェアをコンソールに取り込む方法をクラック/ハッキングしています。
IronMensan

4
@Stargazer:「いいえ、コンパイラはソース言語からターゲット言語に翻訳します」という意味ですか?コンマを省略すると、文が意図した意味の反対になります。
ダニエル・プライデン

回答:


19

はいといいえ。はい、古典的なシナリオは、コンパイラを使用してソースコードからマシンコードを生成し、マシンコードをユーザーに配布する開発者です。

あります。このかかわらには、いくつかの例外が。まず、多くのオープンソースプロジェクトは、主に分散(あるいは排他的に)ソースコード形式で、などのコマンドのカップルでタイピングすることによって、それらをインストールするには、エンドユーザーが期待されmake、その後、make intall。これにより、コンパイラ、リンカーなどが呼び出され、そのユーザーのコンピューターのソースコードからマシンコードが生成されます。ただし、これらの場合、ビルドとインストールのプロセスは、ソースコードのみのパッケージを以前にインストールしたことがないという事実を超えて、ユーザーがその知識をほとんど必要としない程度に自動化されます(少なくとも意図されています) 、彼らのパッケージマネージャーは通常、本当に関心のあるアプリケーションをインストールするための前提条件として、いくつかの「開発」パッケージをリストします(ただし、一部のユーザーはこれをエンドユーザーにとって使いにくいと見なしています)

別の例外(暗示されているが、私が見た他の回答ではあまり説明されていない)は、ジャストインタイム(JIT)コンパイラーです。JITコンパイラーのいくつかの明らかな例は、Microsoft共通言語ランタイム(CLR)とJava仮想マシン(JVM)です。これらの場合、通常、ソースコードをマシンコードに変換するのに関与する2つの完全に別個のコンパイラがあります。1つは開発者が使用します。ただし、マシンコードを直接生成するのではなく、マシンに依存しないバイトコードを生成します。次に、CLR / JVMには、これらのバイトコードをターゲットコンピューター用のマシンコードに変換する2つ目のコンパイラーが含まれています。

2番目のコンパイラは厳密には必要ではないことを付け加えます。JVMの初期バージョン(1つの例)は、バイトコードをコンパイルする代わりに解釈しました。ただし、これにはかなり深刻なパフォーマンスの低下が伴うことが多いため、実稼働での使用を目的とした最近のほとんどのJVMにはJITコンパイラが含まれています。


24

はい、コンパイラは主に開発者によって使用されますが、いくつかの顕著な例外があります。エンドユーザーは、コードを変更しなくても、コンパイラを使用して最新のオープンソースソフトウェアをコンパイルおよびインストールすることがあります。また、一部のプログラミング言語にはコンパイラがありません。代わりに、その場で「コンパイル」するインタープリターを使用します。その場合、エンドユーザーは自分のマシンにインタプリタをインストールする必要があります。


4
「コンパイラ」の定義を実行可能ファイルを生成するプログラムを意味するように制限する場合、これは適切な答えです。ただし、それは単に「コンパイラ」の真の定義のサブセットです。
riwalk11年

16
@Jan Soltis:私は同意しません。ソースからLinuxカーネルをコンパイルしました。それは、Linuxカーネル開発者であることを意味ますか?Linuxカーネルコードを変更したり、パッチを提出したことはありません。つまり、私はカーネル開発者ではないということです。さらに、Gentooを主要なオペレーティングシステムとして使用していた数年間、マシン上のすべてのソフトウェアをコンパイルしました。しかし、それらの大部分はPortageパッケージ管理システムによって自動的にコンパイルされました。その場合、私は開発者としてではなく、エンドユーザーとして行動していたと主張ます。
ダニエル・プライデン

8
@Jan Soltis:それがあなたの意見であることは承知しています。私は丁重に同意しません。あなたは支持されない主張を続けている間、私は私の立場を支持する反論を提供しました。「開発者」と「エンドユーザー」の間には鋭い線があると思うようですが、それは存在しないと思います。
ダニエルプライデン

6
ソースをダウンロードしてから「make install」を実行することは開発者ではありません。これは間違いなくエンドユーザーの操作です。
クリストファージョンソン

3
@Jan:パッケージをコンパイルするGentooのようなディストリビューションを使用すると、少なくともパワーユーザーになりますが、それは明らかにユーザーの一種です。他の人のコードを変更、追加、または読むことなくコンパイルしても、開発者にはなりません。
Carson63000

10

はい

コンパイラは、ある言語のコードを別の言語に翻訳するプログラムとして定義されます(Wikipediaを参照)。コンパイラの最も一般的な使用法は、ソース言語を機械語に翻訳することですが、これは「コンパイラ」という言葉を定義します。

たとえば、Pythonはモジュールをインポートするときにバイトコードを生成し、コンパイラの定義に適合します(ソース言語のPythonからターゲット言語のPythonバイトコードに変換するため)。

別の例は、V8 JavaScriptエンジンです。JavaScriptをx86マシンコード変換するため、コンパイラの定義にも適合します。V8はコンパイラの定義に適合するだけでなく、Chromeに含まれており、クライアントマシンで非常に広く使用されています。


4

1つのケースは、実行時にコードを動的に生成し、生成されたコードを実行するアプリケーションの場合です。このコードは実行時にコンパイルする必要があります。

編集:他の例外がありますが、それらはすでに他の回答で言及されていました。


+1はちょうどJIT
gnat

1
ChromeのV8エンジンは奇妙な例外ではありません。
リウォーク

明確にするために更新されました。他にも例外があることを理解しています。
モーガンハーロッカー

3

コンパイラは、開発者がプロ​​グラミング言語のコードを実行可能(マシーンコード)ファイルにコンパイルするためのものです。

「コンパイラは開発者にとって主要なものです...」と言います。しかし、プログラムがオンザフライで新しいプログラミング言語コードを生成するため、エンドユーザーのマシンにコンパイラをインストールする必要がある例を見てきました。これは、エンドユーザーが単独でコンパイラーを操作する必要があるという意味ではありません。

このプログラム設計の考えられる理由:

  • パフォーマンス:ルールが何らかのエンドユーザーデータストアに保存され、それらのルールによって処理される大量のデータがあるルール駆動型アプリケーションを考えてください。規則を何度も解釈する代わりに、プログラムは最初に処理コードを生成し、それをコンパイルして、処理されるデータに対して実行します

  • エンドユーザーが何らかの数式を追加でき、プログラムの開発者がこのために独自のパーサー/インタープリターを実装することを望まないプログラムを考えてください。代わりに、プログラムはこの式を取り、それを有効なプログラムコードに変換するためにいくつかの追加を行い、コンパイラーにコンパイルさせて、後で実行します。


うーん.... これは、エンドユーザーが単独でコンパイラーを操作する必要があるという意味ではありません。それはほとんど説明し、明確にします。
Pankaj Upadhyay

2

そうです-コンパイラは、ソースコードを実行可能形式にコンパイルし、その後、リンカーによって実行可能バイナリファイルにリンクされます。ソースコードは、多くのコマンドラインシェル(Cシェル、bash、zshなど)、awk、sedなどのいずれかのインタープリターによって直接実行することもできます。

ディスカッションを特定の製品に限定しない限り、「開発者」と「エンドユーザー」の間に明確な線を引くのは難しい場合があります。開発者はすべて、使用するツールの「エンドユーザー」であり、「エンドユーザー」には、コンパイラやインタープリターなどの開発ツールがマシンにインストールされている場合があります。


2
ここでコンパイラについて多くの誤解があるので、私はこれを-1にするつもりです。コンパイラは、ソース言語のコードをターゲット言語に翻訳します。マシンコードを生成すると言うのは、車両に4つの車輪があるということと似ています(はい、ほとんどの車両には4つの車輪がありますが、オートバイも車両です。同様に、ほとんどのコンパイラはマシンコードを生成しますが、C#-> VBコンバーターはコンパイラーも)
riwalk

1
@ Stargazer712、誤解がないことを保証します-コンパイラが何をするのか、私はとてもよく知っています、ありがとう。知らない誰かが車があるものを私に尋ねた場合でも、私はおそらく車があるという事実にもかかわらず、四輪を持っていることを言うだろう、いくつかはしないでください。教訓的な定義は、概念を理解しようとする人に説明する以上に混乱させることがよくあります。「コンパイラ」は仕事の説明でもありますが、ここでそれを言及しても役に立ちません。
カレブ

1

管理者は、スクリプトを記述する際にプログラミング言語を使用して、さまざまな自動化されたタスクを実行する必要がある場合もあります。たとえば、90日後にサーバーから古いログファイルを削除して、ディスク領域を解放するスクリプトを作成します。スクリプトの記述に使用される言語は、システムで実行できるように解釈またはコンパイルする必要があります。


1

一部のプログラムはメタプログラムです。実行中に、他のプログラム(またはソースコード)を生成してコンパイルし、何らかの方法で実行する場合があります。多段階プログラミングについてもお読みください。

したがって、この種のプログラムを使用するには、ユーザーが自分でプログラムする方法を知らない場合でも、コンパイラが必要になります(コンピューターがコンパイルする必要のあるコードを生成するため)。

例については、MELTGCCを拡張するC ++コードを生成する)またはJ.PitratのCAIA人工知能システム(組み合わせ問題を解決するためにCコード(特に独自のコード)を生成する)を参照してください。

また、一部の言語および一部の実装では、コンパイラをどこにでも(その言語および実装でコーディングされたすべてのプログラムで)存在させる必要があります。まず、いくつかのWebブラウザーにはJavascript JITエンジン(V8など)が含まれています。また、ほとんどのCommon Lisp実装(例:SBCL)にはコンパイラーが含まれています(式を生成および評価する可能性のあるアプリケーションの実行にも役立ちます)。ホモイコニック言語Qineプログラムについてもお読みください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.