2

C / C ++には存在しますが、他のプログラミング言語についてはよくわかりません。リンカーがすべてのコンパイル済みプログラミング言語に存在するのか、それともすべての言語作成者がコードのコンパイル方法を決定するのか、私は興味がありますか?

Benjの場合:つまり、ネイティブ言語であり、CLRのようなマネージコードはありません。

4

5 に答える 5

7

厳密に言えば、リンカーは言語の一部ではなく、言語の実装の一部です。(また、言語は本質的に「コンパイル」または「解釈」されません。これらはどちらも実装の機能です)。

リンカーを使用すると、言語実装者は「個別のコンパイル」を実装できます。個別のコンパイルは、プログラムの個別の部分を物理的に切り離したり、部分的なビルドを可能にしたりするために非常に重要な機能です (これにより、合計ビルド時間を短縮できます)。このため、ネイティブ バイナリを出力する言語のほとんどの実装では、実装の一部としてリンカーが使用されます。

とはいえ、リンカは言語のコンパイル実装の必須部分ではなく、一部の言語実装ではリンカを使用しないことが想像できます (言語を作成して実装する学生プロジェクトを考えてみてください。この言語が大規模なプログラムでの使用が想定されていない場合、リンカーの実装/統合に費やす時間は価値がないと見なされる可能性があります)。

于 2012-05-01T13:07:59.893 に答える
3

たとえば、Javaには(厳密に言えば)「リンカー」と呼ばれるツールはありませんが、同様の概念があります。

基本的に、実行可能コードがばらばらのオブジェクトファイル(または同等のもの)で構築されている場合、実行する必要があるときまでにそれらをまとめる何かが常に存在する必要があります。

于 2012-05-01T12:56:17.980 に答える
3

いいえ、リンカーを使用しないコンパイル済み言語が多数あります。たとえば、Forth、Lisp、およびある程度 Java では必要ありません。

同じ作業 (異なるコンパイル ユニットにお互いを知らせる) を行う必要がありますが、それはリンク ステップ以外の方法で行うことができます。たとえば、ルックアップは実行時に実行できます。

于 2012-05-01T13:06:57.040 に答える
2

歴史的に、いかなる種類のリンクも使用しないコンパイル済み言語がいくつかありました。{$I filename}おそらく最も有名なのは Turbo Pascal で、最も初期のバージョン (4.0 より前) では、ソース ファイル (ディレクティブが使用されている場合はソース ファイル) を 1 回通過し、出力コードを直接生成し、修正リスト (フロッピー ドライブを宛先として使用してもコンパイラが適切に動作したため、他のコンパイルが完了した後に、書き込まれたオブジェクト ファイルにフィックスアップが適用されたと思います)。

于 2012-05-01T13:06:41.697 に答える
1

「リンカー」の意味を定義します。個別のコンパイルがある場合はいつでも、コンパイルの出力が何であれ、「リンク」するステップがどこかにある必要があります。ただし、別の方法でコンパイルされたオブジェクト コードにアドレスを入力するだけの "リンク" を検討する場合 (従来のリンカが行うこと)、より多くの最新のシステムは "リンク" しません。コンパイラの出力は何らかの中間形式になり、最終ステップでこれを 1 つのエンティティにまとめてからマシン コードを生成します。

もちろん、これらはすべて、動的リンクとジャスト イン タイム コンパイルの問題を無視しているため、問題がさらに曖昧になります。

したがって、リンクの定義が十分に曖昧な場合、個別のコンパイルを使用するすべての言語がそれをサポートし、十分に厳密なバージョンの場合、多くの最新のコンパイラはどの言語に対しても「リンク」しないと言えます。

于 2012-05-01T13:10:27.013 に答える