初出時には第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)言語のような、特定の用途にとっては意味を成すだろう。
最近のコメント
名前
しゅごい
Jane Doe
FYI Avoid Annoying Unexpe…
Jane Doe
ご存じとは思いますが、whileには、”~の間”と…
peta_okechan
針金みたいなパーツを引っ張ると外れます。 他の方の…
虎徹ファン交換
虎徹の標準ファンを外す際に、どのようにして外されま…
花粉症対策2019 – 日曜研究室
[…] 花粉症対策についてはこれまで次の記事を書いてきました。https://…
花粉症対策2019 – 日曜研究室
[…] 花粉症対策についてはこれまで次の記事を書いてきました。https://…
花粉症対策2019 – 日曜研究室
[…] 花粉症対策についてはこれまで次の記事を書いてきました。https://…
花粉症対策2019 – 日曜研究室
[…] 花粉症対策についてはこれまで次の記事を書いてきました。https://…
花粉症対策2019 – 日曜研究室
[…] 花粉症対策についてはこれまで次の記事を書いてきました。https://…