LLVMとは正確には何ですか?


464

私はいつもLLVMについて聞いています。それはPerlにあり、それからHaskellにあります、そして誰か他の言語でそれを使用していますか?それは何ですか?


45
ここにすべてをうまく説明している本の良い章があります:www.aosabook.org/en/llvm.html
David d C e Freitas

回答:


369

LLVMは、中間コードやバイナリマシンコードを構築、最適化、および生成するために使用されるライブラリです。

LLVMはコンパイラフレームワークとして使用でき、「フロントエンド」(パーサーとレクサー)と「バックエンド」(LLVMの表現を実際のマシンコードに変換するコード)を提供します。

LLVMはJITコンパイラーとしても機能できます-コンパイル速度を目的とした高速コード最適化により、x86 / x86_64およびPPC / PPC64アセンブリー生成をサポートします。

興味がある場合は、CまたはC ++コードから生成されたLLVMのマシンコードをデモページで試すことができますが、現在、デモページは2013年以降無効になっています。


39
それをいじり
LiraNuna

29
回答に記載されているリンクには、「LLVMデモページは現在無効になっています」と記載されています。
EngrStudent 2016

5
ellcc.org/demo/index.cgiは、LLVMを介してさまざまなターゲット(中間コードを含む)にC / C ++をコンパイルする方法の1つです
Tom Goodfellow

1
それが意味することの実際の例を挙げていただけますか?
Migrate2Lazarusプロフィールを見る

112

LLVMの良い要約はこれです:

ここに画像の説明を入力してください

フロントエンドにはPerlや他の多くの高水準言語があります。バックエンドには、マシン上で直接実行されるネイティブコードがあります。

中心には中間コード表現があります。すべての高水準言語がこのLLVM IR形式で表現できる場合、このIRに基づく分析ツールは簡単に再利用できます。これが基本的な根拠です。


39
画像は千の言葉の価値があります
👍– ipatch

3
したがって、LLVMはコンパイラ設計者にとって有用であるようです。プログラマーは、ソースコードとは独立して生成されたコードを分析する以外に、標準コンパイラーまたはLLVMベースのコンパイラーでコンパイルするかどうかを気にする必要がありますか?
jinawee

4
LLVMを使用してそのIRをコンパイルできる場合、IRを分析するために多くのツールが開かれる可能性があります。ただし、ツールがネイティブバイナリ(たとえばx86)しか分析できない場合は、LLVMが生成したバイナリか、gccが生成したバイナリか、インテルコンパイラーが生成したものか、違いはありません。
Peter Teoh

73

LLVM(「低レベルの仮想マシン」を意味するために使用されていましたが、今後は使用されません)は、C ++で記述されたコンパイラインフラストラクチャであり、記述されたプログラムのコンパイル時、リンク時、実行時、および「アイドル時」の最適化用に設計されています任意のプログラミング言語で。もともとC / C ++用に実装されたLLVMの言語に依存しない設計(および成功)は、Objective C、Fortran、Ada、Haskell、Javaバイトコード、Python、Ruby、ActionScript、GLSLなど、さまざまなフロントエンドを生み出しました、 その他。

詳細については、こちらをお読み
くださいUnladen Swallowもご覧ください。


13
..だから、ドキュメントが言っていること; 一方、LLVMは、の頭文字である低レベルの仮想マシン、プロジェクトは単に命名されLLVMではなく、完全に綴られた単語を。
Jochem Kuijpers

2
以前は省略形以上でしたが、後でen.wikipedia.org/wiki/LLVMを
VVB

2
コメントをまとめます。「低レベルの仮想マシン(LLVM)」は、「LLVM(プロジェクトの初期段階で「低レベルの仮想マシン」を意味する)のようなものである必要があります
。– ssokolow

52

「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に翻訳するフロントエンドを構築した」などの文で使用される場合、この意味を持ちます。


35

LLVMは基本的に、コンパイラーや言語指向ソフトウェアの構築に使用されるライブラリーです。基本的な要点は、おそらく最も一般的なコンパイラのスイートであるgccですが、再利用できるように構築されていません。gccからコンポーネントを取得し、それを使用して独自のアプリケーションを構築することは困難です。LLVMは、誰でもコンパイラーや言語指向ソフトウェアの構築に使用できる「モジュール式で再利用可能なコンパイラーおよびツールチェーンテクノロジー」のセットを構築することで、この問題にうまく対処しています。


6
では、LLVMはライブラリであり、Clangはコンパイラですか?
Abdul

11
ClangはLLVMのC / C ++フロントエンドコンパイラです。CコードをLLVMビットコードに変換します。これは、バックエンドコンパイラによってアセンブリ言語に変換されます。
Boris Mulder、

6

LLVMコンパイラインフラストラクチャは、コードの最適化と変換を実行するのに特に役立ちます。また、さまざまな用途に役立つ多数のツールで構成されています。llvm-profは、プログラムのホットスポットを特定するために実行のプロファイリングを実行できるプロファイリングツールです。Optは、さまざまな最適化パス(たとえば、デッドコードの除去)を提供する最適化ツールです。

重要なことに、LLVMは、独自のパスを作成するためのライブラリーを提供します。たとえば、プログラムの特定の関数に渡される特定の引数に範囲チェックを追加する必要がある場合は、単純なLLVMパスを作成するだけで十分です。

独自のパスを作成する方法の詳細については、http://llvm.org/docs/WritingAnLLVMPass.htmlを確認してください

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