コンテンツにスキップ

英文维基 | 中文维基 | 日文维基 | 草榴社区

「LLVM」の版間の差分

出典: フリー百科事典『ウィキペディア(Wikipedia)』
削除された内容 追加された内容
Tetsuyak (会話 | 投稿記録)
m Clang: アップルをWikipediaページにリンク
Cewbot (会話 | 投稿記録)
40行目: 40行目:
=== Clang ===
=== Clang ===
{{main|Clang}}
{{main|Clang}}
しかし、LLVMへの興味が広がるにつれ、まったく新しいフロントエンドを多数のプログラミング言語向けに開発しようという動きが出てきた。もっとも注目されているのはC、C++、Objective-C、Objective-C++をサポートする新しいコンパイラ[[Clang]]である。主に[[アップル (企業)|アップル]]のサポートを受け、ClangはGCCシステムのC/C++/Objective-C/Objective-C++コンパイラを[[統合開発環境]]と統合でき[[マルチスレッド]]をサポートした現代的なシステムで置き換えることを目指している<ref>[http://llvm.org/devmtg/2007-05/09-Naroff-CFE.pdf New LLVM C Front-end (Steve Naroff)]</ref>。GCCでのObjective-C/Objective-C++の開発は衰退気味で、アップルが施した変更は別個にメンテナンスされている。アップルにとっては、自社でコンパイラを開発することにより、第一のObjective-C/Objective-C++実装であり続けながら、LLVMがすでに達成している統合開発環境への統合やその他の現代的な機能への対応といった問題を解決することができる。
しかし、LLVMへの興味が広がるにつれ、まったく新しいフロントエンドを多数のプログラミング言語向けに開発しようという動きが出てきた。もっとも注目されているのはC、C++、Objective-C、Objective-C++をサポートする新しいコンパイラ[[Clang]]である。主に[[Apple]]のサポートを受け、ClangはGCCシステムのC/C++/Objective-C/Objective-C++コンパイラを[[統合開発環境]]と統合でき[[マルチスレッド]]をサポートした現代的なシステムで置き換えることを目指している<ref>[http://llvm.org/devmtg/2007-05/09-Naroff-CFE.pdf New LLVM C Front-end (Steve Naroff)]</ref>。GCCでのObjective-C/Objective-C++の開発は衰退気味で、アップルが施した変更は別個にメンテナンスされている。アップルにとっては、自社でコンパイラを開発することにより、第一のObjective-C/Objective-C++実装であり続けながら、LLVMがすでに達成している統合開発環境への統合やその他の現代的な機能への対応といった問題を解決することができる。


== 標準C++ライブラリ ==
== 標準C++ライブラリ ==

2021年5月20日 (木) 11:52時点における版

LLVM
開発元 LLVM Developer Group
初版 2003年 (21年前) (2003)
最新版 19.1.4[1] ウィキデータを編集 - 2024年11月19日 (2日前)
リポジトリ ウィキデータを編集
プログラミング
言語
C++
プラットフォーム クロスプラットフォーム
種別 コンパイラ基盤
ライセンス イリノイ大学/NCSAオープンソースライセンス
LLVM例外付きApache License 2.0 (バージョン9.0.0以降[2])
公式サイト llvm.org
テンプレートを表示

LLVM(エルエルヴィーエム、 またはエルエルブイエム)とは、コンパイル時、リンク時、実行時などあらゆる時点でプログラムを最適化するよう設計された、任意のプログラミング言語に対応可能なコンパイラ基盤である。当初は、LLVMの名称の由来は、Low Level Virtual Machine (低水準仮想機械) のであるとしていたが[3]、現在は、何の頭文字でもないとしている[4]

概要

LLVMは、JavaJava VMの関係のように、まず仮想機械をターゲットとした中間コード(ビットコード)を生成し、その仮想機械向けコードを特定のマシンの機械語に変換する。この時言語やプラットフォームとは独立した最適化を行う。この方法によってLLVMは言語からもアーキテクチャからも独立しており、それぞれに特化した、プログラミング言語固有のモジュールと、マシン向けコード生成部を用意することにより様々な言語アーキテクチャーに対応する。LLVMは積極的にプロシージャ間最適化を行うとともに、静的コンパイラとしてもJITコンパイラとしても使え、開発の様々な段階で使える多数の部品を持っている(JavaバイトコードCILフロントエンド、Pythonフロントエンド、グラフ彩色式のレジスタ割り付けモジュール、など)。JITコンパイラの場合、実行時に不要な静的分岐を最適化する機能があり、これはプログラムが様々な実行時オプションを持っている場合、強力な最適化手法(部分評価)となる。このため、Mac OS X v10.5ではこれを使ってハードウェア機能がない場合にOpenGLパイプラインを実現している。

LLVM自体はC++で書かれており、イリノイ大学2000年に開発が開始されたものである。ライセンス条件はイリノイ大学/NCSAオープンソースライセンス[5]であり、これはBSDライセンスによく似たOSI認証ライセンスである。バージョン9.0.0からはライセンスがLLVM例外付きApache License 2.0に変更された[2]

ビットコード

LLVMは言語から独立した命令セット型システムを持つ。命令の多くは3番地コード形式に似ている。各命令はまた静的単一代入形でもあり、変数(型付きレジスタ)は一回代入されるとその後は変更されない。このため、変数間の依存関係の解析が単純化される。

型変換は、どういう形式であっても明示的に cast 命令を使って行われる。LLVMの持つ基本型はいくつかの固定長の整数型であり、派生型としてポインタ配列(任意のデータ型を格納可能な配列)、ベクトル(整数浮動小数、ポインタのみ格納可能な配列)、構造体関数の5つがある。具体的な言語で構築される型は、LLVM上ではこれらの型を組み合わせて表現される。例えば、C++におけるクラスは、構造体と関数と関数へのポインタの配列を組み合わせて表現される。

フロントエンド

dragonegg

LLVMは、もともと既存のGCCスタック用のものより積極的な最適化を行う高性能のシステムとして開発され、GCCフロントエンドがLLVMと動作するように修正された。現在では、GCC 4.6から派生したフロントエンド(dragonegg)を用いてC言語C++FORTRANAdaをサポートし、Objective-C、Objective-C++、Goがおおむね動くとしている。

Clang

しかし、LLVMへの興味が広がるにつれ、まったく新しいフロントエンドを多数のプログラミング言語向けに開発しようという動きが出てきた。もっとも注目されているのはC、C++、Objective-C、Objective-C++をサポートする新しいコンパイラClangである。主にAppleのサポートを受け、ClangはGCCシステムのC/C++/Objective-C/Objective-C++コンパイラを統合開発環境と統合できマルチスレッドをサポートした現代的なシステムで置き換えることを目指している[6]。GCCでのObjective-C/Objective-C++の開発は衰退気味で、アップルが施した変更は別個にメンテナンスされている。アップルにとっては、自社でコンパイラを開発することにより、第一のObjective-C/Objective-C++実装であり続けながら、LLVMがすでに達成している統合開発環境への統合やその他の現代的な機能への対応といった問題を解決することができる。

標準C++ライブラリ

GNUはlibstdc++という標準C++ライブラリを開発しているが、LLVMも独自のlibc++という標準C++ライブラリを開発している。

参照

  1. ^ "LLVM 19.1.4"; 閲覧日: 2024年11月20日; 出版日: 2024年11月19日.
  2. ^ a b LICENSE.TXT”. llvm.org. 2019年9月24日閲覧。
  3. ^ The LLVM Compiler Infrastructure Project”. 2004年5月3日時点のオリジナルよりアーカイブ。2019年1月16日閲覧。
  4. ^ The LLVM Compiler Infrastructure Project”. llvm.org. 2019年1月16日閲覧。
  5. ^ The University of Illinois/NCSA Open Source License (NCSA) - Open Source Initiative
  6. ^ New LLVM C Front-end (Steve Naroff)

関連項目

外部リンク