見出し画像

LLVM IR ってなんなの

LLVM IR ってなんなの、というのをたとえ話で説明します

プログラムを動かす仕組みの話をしていると「LLVM IR」という言葉がよく出てきます。名前がいかついので身構えますが、やっていることは単純です。翻訳の話に置き換えると分かりやすいです。

日本語・英語・中国語の本を、フランス語・ドイツ語・スペイン語に訳したいとします。組み合わせごとに翻訳者を用意すると、3かける3で9人必要です。ところが、真ん中に「みんなが分かる共通語」を1つ決めて、まずそこに訳し、そこから各国語に訳す形にすると、3人+3人の6人で済みます。しかも言語が増えても、その共通語との行き来だけ用意すればいい。

LLVM IR はこの共通語の役です。絵にするとこうなります。

左からいろいろな言語が入ってきて、まんなかで一度ぜんぶ同じ形になり、そこから右のいろいろな CPU 向けに出ていく。この形にしておくと、言語が増えても CPU が増えても、まんなかとの行き来を1本足すだけで済みます。

名前のとおり、中間にある表現

IR は Intermediate Representation の略で、日本語では中間表現と言います。人が書くプログラムと、CPU が読む機械語の、ちょうど中間にある形だからです。

2つの数を足すだけのプログラムだと、こんな見た目になります。

define i32 @add(i32 %a, i32 %b) { %sum = add i32 %a, %b ret i32 %sum }

i32 は32ビットの整数、add は足し算、ret は答えを返す、という意味です。人の書く言語ほど自由ではないし、機械語ほど読めなくもない。ちょうど間くらいの窮屈さになっています。

はさむと何が嬉しいのか

ひとつは翻訳の話と同じで、新しい言語を作る人は「LLVM IR に変換するところまで」を書けば済みます。あとは既にある部品が、Intel 向けや Apple Silicon 向けに仕上げてくれるわけです。CPU ごとの細かい違いを全部覚えなくていい。

もうひとつは、プログラムを速くする工夫が一か所で済むことです。使われていない計算を消すとか、同じ処理をまとめるとか、そういう工夫を真ん中でやっておけば、どの言語から来たものにも、どの CPU 向けにも効きます。言語ごと・CPU ごとに同じものを作り直さなくていい。

Rust も Swift も、C/C++ の Clang も、実際にこの仕組みの上で動いています。

このあと自作ツールの話を書くときに、この「中間表現」という言葉が前提として出てきます。その下地として先に置いておきます。

#LLVM #LLVMIR #中間表現 #コンパイラ #プログラミング #Rust #Swift #Clang #低レイヤ #技術解説

いいなと思ったら応援しよう!