LLVMとは
LLVMは、コンパイラ基盤です。
LLVMは、何かの略ではなく、この名称のコンパイラ基盤である、とされています。
インタプリタ言語として広く知られるJavaScriptやPythonなどとは違い、コンパイラが必要な言語は多数あります。
- C言語
- C++
- Rust
などです。
これらの言語では、人間が書いたソースコードを、コンパイラによりコンピュータが理解できる形に変換=コンパイルすることで、プログラムが実行可能になります。
コンパイラは、1つのプログラミング言語に対して複数あることも多いです。
コンパイラを作成する際に、LLVMといったコンパイラ基盤が活用されます。
普段、プログラミング学習などで色々な言語を使っているとLLVMの恩恵を直接感じることは少ないかもしれません。しかし、LLVMは現在のプログラミング環境に大きく貢献しています。
今日は、そんなLLVMが活躍している場所を紹介します。
様々なプログラミング言語に使われているLLVM
色々なプログラミング言語やコンパイラがLLVMをもとに作られています。
Rust
近年注目を集めている、RustのコンパイラはLLVMがベースとなっています。
Swift
Swiftの開発者の一人に、Chris Lattner氏がいます。
Chris Lattner氏は、LLVMの開発者としても知られており、SwiftにはLLVMのコンパイラ技術が活用されています。
Julia
科学計算領域をはじめとして近年使用されているプログラミング言語のJuliaは、その中核部分がLLVM基盤、C / C++、Schemeで開発されました。
Halide
画像処理に使用されるプログラミング言語HalideのコンパイラにもLLVMが使われています。
Haskell
関数型言語であるHaskellのコンパイラGHCには、LLVM基盤が使用されています。
Zig
2016年に公開された新しいプログラミング言語のZigのコンパイラには、LLVMが用いられています。
多様な場面で活躍するLLVM
特定のプログラミング言語そのものやコンパイラで直接LLVM基盤が使用される以外に、その周辺でもLLVM技術は活用されています。
Clang
コンパイラは一般的に、大きく2つの過程に分けられます。
- フロントエンド
- バックエンド
です。
人間が書いたソースコードを受け取るフェーズから始まるいくつかの工程を、コンパイラのフロントエンドと呼び、フロントエンドの工程からデータを受け取り、最終的にコンピュータが理解できる形に変換するまでがバックエンドです。
多くの場合、コンパイラのバックエンドとしてLLVM基盤が活用されます。
Clangは、C、C++、Objective-C向けのコンパイラのフロントエンドです。
フロントエンドのClang、バックエンドのLLVMという区分だったのですが、最近はLLVMの一部として公開されています。
Clangプロジェクトは、LLVMプロジェクトの一部であり、例えばC言語のコンパイラとしてClangを使用するときには、コンパイラフロントエンドとしてClangを、バックエンドとしてLLVMを使用していると考えることができます。
C、C++、Objective-Cのコンパイル環境において、LLVMの存在感は大きいと言えるでしょう。
Kotlin/Native
Kotlinは、Androidアプリ開発で広く用いられているプログラミング言語です。
Kotlinは、JVM言語であり、Java仮想マシン上で動作します。
Kotlin/Nativeは、仮想マシンなしで、Kotlinを様々な環境で動作させるための技術です。
この場合、コンパイルが必要になりますが、Kotlin/NativeのコンパイラとしてLLVM基盤が使用されています。
CUDA
CUDAは、半導体メーカーとして世界的に知られているNVIDIAが開発しているGPU向け並列コンピューティングのプラットフォームです。
NVIDIAは、NVCCという独自のコンパイラ(C / C++用)を開発しており、NVCCはLLVM基盤のコンパイラです。
このほかにも、LLVMプロジェクトには、複数のサブプロジェクトがあります。
例えば、
ディープラーニングでの活用が期待されるMLIRプロジェクト
あります。
プログラミング言語の基盤としてのLLVM
以上のような、幅広い影響を考えると、LLVMはプログラミング言語の基盤とも言えるプロジェクトの1つだと思います。
LLVMをより知りたい場合には、公式サイトに加えて、
- 手を動かせばできるLLVMバックエンド チュートリアル
- LLVMを始めよう! (プログラムモグモグ)
などが参考になるかと思います。
プログラミング学習で、色々な言語を扱う時には、LLVMプロジェクトや関連技術について意識することはあまりないかもしれません。
しかし、今日紹介したように
- C言語
- C++
- Rust
- Swift
- Julia
- Kotlin/Native
など多くの場面でLLVMは使用されています。
今後も、LLVMを用いて、新しいプログラミング言語やコンパイラなどが生み出されると思います。
プログラミングを支えるLLVMプロジェクトについて、気になった人は一度公式サイトを見てみるのもいいかもしれません。
コメント