18

LLVMと通常のコンパイラの違いは何ですか?
それはより動的であり、したがって通常は非常に動的な言語(つまりJavascript)を静的バイナリコードにコンパイルするために使用できますか?作成の背後にある原則は何ですか?
コンパイラ用のDragonBookは知っていますが、LLVM用にそのようなものはありますか?

編集:私はこの興味深いプロジェクトを見つけました。

4

3 に答える 3

26

LLVMと「通常のコンパイラ」にはいくつかの違いがあります。これは「gcc」を意味すると思います。

  • LLVMは、プログラム全体の分析(リンク時分析とも呼ばれます)用に設計されているため、オプションでコードを「ビットコード」にコンパイルできます。これは、後で再分析できる形式です。
  • LLVMは、JVMと同じように、実行中にプログラムを再分析できるように、ジャストインタイムコンパイラ(JIT)を提供します。
  • LLVMは非常によく設計されています:
    • そのコンポーネントはモジュール式であり、十分に分離されています。
    • 中間表現には3つの形式(テキスト、バイナリ、およびメモリ内表現)があり、これらは同等です。
    • その中間表現はSSA形式を使用します。
    • その中間表現には型システムがあります。

Javascriptやその他の動的言語に関しては、動的言語コミュニティのLLVMで多くの興味深いものが見られ、PythonとRubyの実装で試されています。ただし、これらは静的コンパイラーになろうとはしていません。彼らはJITの使用に焦点を合わせています。特に、は「混合モードインタープリター」を使用して長時間実行実行可能ファイルを最適化します。このインタープリターでは、最初にプログラムを解釈し、実行時にLLVMを使用してコンパイルします。LLVMを使用したJavaScriptエンジンは見たことがありませんが、おそらく1つあります。異常な状況を除いて、またはJavascriptのバージョンを削減した場合を除いて、静的実行可能ファイルは作成されません。

LLVMが作成された理由としては、Vikram Adveの研究グループによる生涯にわたるコンパイル(つまり、JITとリンク時間の最適化)に関する作業の一環として開始されました。博士号を取得した後、Chris LattnerはAppleに移り、プロジェクトを大きく前進させています(おそらく、これはBSDライセンスであり、過去にGPLであるgccで問題を引き起こしていたためです)。

于 2009-09-14T19:19:11.050 に答える
5

通常のコンパイラではありません。作成の主な理由は、コンパイラ研究用のプラットフォームを作成することでした。したがって、それは非常にモジュール化されるように設計されているので、あなたはあなたの研究を扱うコンパイラのその部分で作業することができ、コンパイラの他の部分について心配する必要はありません。LLVMブックがないのと同じように、ドラゴンコンパイラもありません(ドラゴンブックまたは他のコンパイラブックで読んだ理論は、直接適用できるはずです)。実際、私はしばらくLLVMを調べていませんが、ドキュメントはかなり貧弱でした。

于 2009-09-14T11:14:29.703 に答える
2

私はまったく開発者ではありませんが、gplが80年代にNeXtにObjCランタイムの公開を強制したとしても、Appleが別のコンパイラー(GPLかどうか)に資金を提供する主な理由は、IDEと統合する意志です。GCCはこの領域で慣性が大きすぎることが判明し、GCCはコードパーツの再利用を可能にするほどモジュール化されていません(xcodeの「修正」機能)。それは私が私の読書から理解したことです

于 2011-08-01T17:08:27.593 に答える