web-dev-qa-db-ja.com

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

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

401
bodacydo

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

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

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

興味がある場合は、 デモページ でCまたはC++コードから生成されたLLVMのマシンコードを試してみてください。

315
LiraNuna

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

詳細についてはこちらをご覧ください
また、チェックアウト nladen Swallow

62
N 1.1

LLVMの概要は次のとおりです。

enter image description here

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

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

59
Peter Teoh

「LLVMコアライブラリ入門」 本(c)によると:

実際、LLVMという名前は次のいずれかを指す場合があります。

  • LLVMプロジェクト/インフラストラクチャ:これは、フロントエンド、バックエンド、オプティマイザー、アセンブラー、リンカー、 libc ++、compiler-rt、およびJITエンジン。 「LLVM」という言葉には、たとえば次の文でこの意味があります。「LLVMは複数のプロジェクトで構成されています」。

  • LLVMベースのコンパイラ:これは、LLVMインフラストラクチャで部分的または完全に構築されたコンパイラです。たとえば、コンパイラはフロントエンドとバックエンドにLLVMを使用しますが、GCCとGNUシステムライブラリを使用して最終リンクを実行します。 LLVMには、次の文でこの意味があります。たとえば、「LLVMを使用してCプログラムをMIPSプラットフォームにコンパイルしました」。

  • LLVMライブラリ:これはLLVMインフラストラクチャの再利用可能なコード部分です。たとえば、LLVMの文には、「私のプロジェクトはLLVMを使用して、ジャストインタイムコンパイルフレームワークを介してコードを生成します」という意味があります。

  • LLVM core:中間言語レベルで発生する最適化とバックエンドアルゴリズムは、プロジェクトが開始されたLLVMコアを形成します。 LLVMには、次の文でこの意味があります。「LLVMとClangは2つの異なるプロジェクトです」。

  • LLVM IR:これはLLVMコンパイラの中間表現です。 LLVMは、「自分の言語をLLVMに翻訳するフロントエンドを構築しました」などの文で使用すると、この意味を持ちます。

47
Ittrin

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

32
redbandit

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

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

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

5
Hashim Sharif