技術

8.2.3. 言語特有の最適化

初出時には第8章でしたが現在(2017/09/16時点)では原文のほうで新たに8章と9章が追加され、本章は10章となっているようです。
内容は初出時のまま残しておきますが原文へのリンクだけ10章のものを指すよう更新しました。

LLVMによるプログラミング言語の実装チュートリアル日本語訳
第8章 万華鏡: まとめとLLVMのその他の便利な点
第2.3節 言語特有の最適化

多くの人を萎えさせているLLVMの特徴のひとつは、世の中の全ての問題をひとつのシステムで解決出来ないという点である。
人々は具体的な不満点として、高レベルの言語特有の最適化を行う能力がLLVMにはないという点を挙げる。(LLVM「しらんがな!」)

不幸にも、LLVMは”クリス・ラトナーのコンパイラ設計に関する理論」の完全なバージョンを実現する場所ではない。
その代わりに、ちょっと所見を述べてみる。
訳注: クリス・ラトナー(Chris Lattner)は、Appleの人でLLVMとその関連プロジェクトの主要な開発者。

まず、LLVMが情報をなくすという点についてあなたの考えは正しい。
例えば、今これを書いてる時点で、ILP32な計算機において、SSA値がCの”int”由来なのか、Cの”long”由来なのかを、LLVM IR上で区別する方法がない。(デバッグ情報を除く)
両方ともコンパイルによって、”i32″の値になり、それが何由来なのかに関する情報は失われる。
ここにおけるもっと一般的な問題は、LLVMの型システムが、”名称同値(name equivalence)”ではなく”構造同値(structual equivalence)”を使用している事である。
これによって、”同じ構造を持つ2つの構造体(例えば2つの別の構造体が、ひとつのintフィールドを持つ)”を持つ高レベルな言語を処理した際に驚かされることになる。
それらの型は、コンパイルによってひとつのLLVMの型に変換されてしまい、それが何由来だったのか知ることは不可能となる。
訳注: ILP32な計算機 = intとlongとポインタがどれも32bitになる計算機

次に、LLVMは情報をなくす代わりに、ターゲットを固定しない。
我々はこれを、あらゆる方法で強化し改良し続けている。
新しい機能(LLVMは最初から例外やデバッグ情報をサポートしてたわけではない)を追加する事に加えて、最適化のための重要な情報を取り込めるようIRもまた拡張している。(例えば、関数の引数が符号拡張されるか否かや、ポインタエイリアシングについての情報等々)
多くの強化はユーザ主導である。
人々は、LLVMに具体的な機能を含めたいと思うので、LLVMを拡張する。

さらに、言語特有の最適化を追加するのは可能であるし簡単であるし、それをどうやって行うかという選択肢も多数ある。
簡単な例としては、ある言語のためのコンパイル済みのコードに対して”知っている”ような、言語特有の最適化パスを追加するのは簡単であるということが挙げられる。
C系の言語の場合だと、標準Cライブラリ関数について”知っている”最適化パスがある。
main()の中でexit(0)を呼ぶ場合、その最適化パスは、exit(0)をreturn 0に安全に最適化可能な事を知っている。
なぜなら、exit関数が何を行うのかCが明示するので。

簡単なライブラリの知識に加えて、その他に言語特有の情報を、LLVM IRに色々埋め込むことが出来る。
もし、何か必要なものがあり困ってるなら、その話をllvmdevメーリングリストに持ってくるとよい。
LLVMを”だたのコード生成器”として扱い、独自のフロントエンドに、言語特有のAST上で高レベルな最適化機能を実装するのは、まさに最悪な事である。

コメントを残す

メールアドレスが公開されることはありません。



※画像をクリックして別の画像を表示