回答:
LLVMは、中間コードやバイナリマシンコードを構築、最適化、および生成するために使用されるライブラリです。
LLVMはコンパイラフレームワークとして使用でき、「フロントエンド」(パーサーとレクサー)と「バックエンド」(LLVMの表現を実際のマシンコードに変換するコード)を提供します。
LLVMはJITコンパイラーとしても機能できます-コンパイル速度を目的とした高速コード最適化により、x86 / x86_64およびPPC / PPC64アセンブリー生成をサポートします。
興味がある場合は、CまたはC ++コードから生成されたLLVMのマシンコードをデモページで試すことができますが、現在、デモページは2013年以降無効になっています。
LLVMの良い要約はこれです:
フロントエンドにはPerlや他の多くの高水準言語があります。バックエンドには、マシン上で直接実行されるネイティブコードがあります。
中心には中間コード表現があります。すべての高水準言語がこのLLVM IR形式で表現できる場合、このIRに基づく分析ツールは簡単に再利用できます。これが基本的な根拠です。
LLVM(「低レベルの仮想マシン」を意味するために使用されていましたが、今後は使用されません)は、C ++で記述されたコンパイラインフラストラクチャであり、記述されたプログラムのコンパイル時、リンク時、実行時、および「アイドル時」の最適化用に設計されています任意のプログラミング言語で。もともとC / C ++用に実装されたLLVMの言語に依存しない設計(および成功)は、Objective C、Fortran、Ada、Haskell、Javaバイトコード、Python、Ruby、ActionScript、GLSLなど、さまざまなフロントエンドを生み出しました、 その他。
詳細については、こちらをお読み
くださいUnladen Swallowもご覧ください。
「LLVMコアライブラリの概要」の本(c)によれば、
実際、LLVMという名前は次のいずれかを指している可能性があります。
LLVMプロジェクト/インフラストラクチャ:これは、フロントエンド、バックエンド、オプティマイザー、アセンブラー、リンカー、libc ++、compiler-rt、およびJITエンジンなど、一緒に完全なコンパイラーを形成するいくつかのプロジェクトの傘です。「LLVM」という単語には、たとえば次の文でこの意味があります。「LLVMは複数のプロジェクトで構成されています」。
LLVMベースのコンパイラ:これは、LLVMインフラストラクチャで部分的または完全に構築されたコンパイラです。たとえば、コンパイラはフロントエンドとバックエンドにLLVMを使用し、GCCおよびGNUシステムライブラリを使用して最終的なリンクを実行する場合があります。LLVMは、たとえば、「LLVMを使用してCプログラムをMIPSプラットフォームにコンパイルしました」など、この意味を持っています。
LLVMライブラリ:これは、LLVMインフラストラクチャの再利用可能なコード部分です。たとえば、LLVMの文には次のような意味があります。「私のプロジェクトでは、LLVMを使用して、ジャストインタイムのコンパイルフレームワークを通じてコードを生成しています」。
LLVMコア:中間言語レベルで行われる最適化とバックエンドアルゴリズムにより、プロジェクトが開始されたLLVMコアが形成されます。LLVMは次の文でこの意味を持っています:「LLVMとClangは2つの異なるプロジェクトです」。
LLVM IR:これはLLVMコンパイラの中間表現です。LLVMは、「自分の言語をLLVMに翻訳するフロントエンドを構築した」などの文で使用される場合、この意味を持ちます。
LLVMは基本的に、コンパイラーや言語指向ソフトウェアの構築に使用されるライブラリーです。基本的な要点は、おそらく最も一般的なコンパイラのスイートであるgccですが、再利用できるように構築されていません。gccからコンポーネントを取得し、それを使用して独自のアプリケーションを構築することは困難です。LLVMは、誰でもコンパイラーや言語指向ソフトウェアの構築に使用できる「モジュール式で再利用可能なコンパイラーおよびツールチェーンテクノロジー」のセットを構築することで、この問題にうまく対処しています。
LLVMコンパイラインフラストラクチャは、コードの最適化と変換を実行するのに特に役立ちます。また、さまざまな用途に役立つ多数のツールで構成されています。llvm-profは、プログラムのホットスポットを特定するために実行のプロファイリングを実行できるプロファイリングツールです。Optは、さまざまな最適化パス(たとえば、デッドコードの除去)を提供する最適化ツールです。
重要なことに、LLVMは、独自のパスを作成するためのライブラリーを提供します。たとえば、プログラムの特定の関数に渡される特定の引数に範囲チェックを追加する必要がある場合は、単純なLLVMパスを作成するだけで十分です。
独自のパスを作成する方法の詳細については、http://llvm.org/docs/WritingAnLLVMPass.htmlを確認してください