地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

【LLVM】入門する

LLVMとは

llvm.org

LLVMは、コンピュータプログラムのコンパイルと最適化のためのオープンソースプロジェクトであり、低レベルの仮想マシン(Low Level Virtual Machine)を意味します(今公式を見にいくとThe name "LLVM" itself is not an acronym; it is the full name of the project.となっているので今はそうではない?)。LLVMは、さまざまなプログラミング言語で書かれたコードを効率的にコンパイルし、最適化するための多様なツールとライブラリのコレクションです。

github.com

  • モジュラー設計:LLVMは、再利用可能なコンパイラコンポーネントのセットとして設計されています。これにより、異なるプログラミング言語やターゲットアーキテクチャ用のカスタムコンパイラを比較的容易に構築できます。
  • 中間表現(Intermediate Representation, IR):LLVMは、異なるプログラミング言語からのコードを一般化された中間表現に変換します。このIRは、プラットフォームに依存しない形式であり、様々な最適化を行うのに適しています。
  • 豊富な最適化ツール:LLVMは、コードのパフォーマンスを向上させるための多くの最適化手法を提供します。これには、インライン展開、デッドコードの除去、ループの最適化などが含まれます。
  • バックエンドのサポート:LLVMは多くのプロセッサアーキテクチャに対応しており、生成されたIRを特定のマシンコードに変換することができます。
  • 広範な使用:LLVMは、AppleXcode、多くのAndroidアプリケーション、Rust、Swiftなどのプログラミング言語でのコンパイラとして使用されています。

触ってみる

llvmをインストール

$ brew install llvm

こんなcppファイルを用意

#include <iostream>

int main() {
    std::cout << "Hello, World!" << std::endl;
    return 0;
}

LLVM IRに変換するオプションをつけてclangを実行。hello.llというLLVMの言語で書かれたファイルができる。

$ clang++ -S -emit-llvm hello.cpp
$ ls
hello.cpp hello.ll

$ llc hello.ll
$ ls
hello.cpp hello.ll  hello.s

$ clang++ hello.s
$ ls
a.out     hello.cpp hello.ll  hello.s
$ ./a.out
Hello, World!

面白かった記事

zenn.dev

予めLLVMを用いて静的型付き言語としてコンパイルして高速化を実現している

参考

qiita.com