技術

8.2.1. ターゲット非依存(Target Independence)

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

LLVMによるプログラミング言語の実装チュートリアル日本語訳
第8章 万華鏡: まとめとLLVMのその他の便利な点
第2.1節 ターゲット非依存(Target Independence)

万華鏡は”ポータブルな言語”の例である。
万華鏡で書かれたどのプログラムも、どのターゲット上でも同じように動く。
この特徴を備える言語は他にもたくさんある。
例えば、lisp、java、haskell、javascript、python等々。(これらの言語はポータブルではあるが、そのライブラリ全てがポータブルとは限らない事に注意。)

LLVMの素晴らしい側面のひとつとして、多くの場合IRをターゲット非依存に保つことが出来るという点が挙げられる。
コンパイルされた万華鏡プログラムとしてLLVM IRを得ることができ、そしてLLVMがサポートするどんなターゲット上でもそれを動かすことが出来る。
または、LLVMがネイティブにサポートしてないターゲット向けには、Cコードを生成しそのターゲット上でコンパイルすることも出来る。
コード生成時にターゲット特有の情報について必要としない点からみても、万華鏡のコンパイラが、ターゲット非依存なコードを生成することが自ずと解る。

コンパクトさ、ターゲット非依存性、コードの表現をLLVMが提供するという事実は、多くの人を熱狂させている。
しかし不幸にも、彼らが言語のポータビリティについて質問するとき、彼らは普段CやCライクな言語について考えている。
これは実に不幸なことである。
なぜなら、ソースコードをターゲットに合わせる以外に、(完全に一般的な, full general)Cコードをポータブルにする方法はほんとにないからである。(もちろん、Cのソースコードは実際に一般的にポータブルではない。実際に古い32bitアプリケーションを64bit化したことがあるか?)

Cの場合(しつこいが、完全に一般的なC)の問題は、ターゲット特有の仮定に重度に依存していることである。
以下のようなひとつの簡単な例によって、プリプロセッサはしばしば元のコードからターゲット非依存性を破壊的に取り除いてしまう。

#ifdef __i386__
  int X = 1;
#else
  int X = 42;
#endif

このような問題について、かなり複雑な解法を考えることはできるが、これを完全に一般的に解決するよりも、ソースコードを実際にそのターゲットに持っていったほうが楽である。

とはいっても、ポータブル化可能な、興味深いCのサブセットはある。
プリミティブな型を固定サイズ(intは32bit、longは64bitなど)に修正する気があり、既存のバイナリとのABI互換性を気にせず、幾つかのマイナーな機能を諦める気があるなら、ポータブルなコードを得ることは出来るだろう。
これは、インカーネル(in-kernel)言語のような、特定の用途にとっては意味を成すだろう。

コメントを残す

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



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