[Contents]   [Back]   [Prev]   [Up]   [Next]   [Forward]  


GCCと移植性

GCCの主要な目標は、 GNUシステムが実行環境としてターゲットとするクラスのマシン用に、 良質で高速なコンパイラを提供することでした。 GNUシステムがターゲットとしているのは、 8ビットのバイト単位にアドレス付けを行い、 いくつかの汎用レジスタを持つ32ビット・マシンです。 エレガンス、 理論上の能力、 単純さなどは、 いずれも二次的な目標でしかありません。

GCCは、 ターゲットとなるマシンに関する情報のほとんどを、 マシン記述(machine description)から取得します。 マシン記述は、 そのマシンの個々の命令に関する代数的な公式(algebraic formula)を提供するものです。 これは、 ターゲットに関する情報を記述する方法としては、 非常にすっきりしたものです。 しかし、 この方式では表現することが困難な情報をコンパイラが必要とする場合には、 マシン記述において、 場当たり的にパラメータを定義することを躊躇したりはしませんでした。 移植性の本当の目的は、 コンパイラを作るのに必要となる総作業量を減らすことにあります。 移植性それ自身には関心がありませんでした。

GCCには、 マシンに依存するコードは含まれていませんが、 エンディアンの種類 (MSB(most significant byte)が、 1ワードを構成するバイトのうち最高位のアドレスのものであるか、 最低位のアドレスのものであるか) や自動インクリメント・アドレッシング(autoincrement addressing)の利用可能性のような、 マシン・パラメータに依存するコードは含まれます。 RTLを生成するパスにおいては、 特定の構文ツリーに対するコードを生成するために、 複数のストラテジ(strategy)を持つ必要のあることがしばしばあります。 ここでの複数のストラテジとは、 異なるパラメータの組み合わせに対して使用することのできるストラテジ群です。 多くの場合、 可能なすべての組み合わせを取り扱えるようにはなっていなくて、 一般的によくある組み合わせや私自身が遭遇したことのある組み合わせだけが取り扱えるようになっています。 その結果、 新しいターゲットでは、 追加のストラテジが必要になることがあるかもしれません。 追加のストラテジが必要であるということはすぐ分かります。 コンパイラがabortを呼び出すからです。 幸運なことに、 新しいストラテジは、 マシンに依存しない方式で追加することが可能であり、 かつ、 それを必要とするターゲット・マシンに対してのみ影響を与えます。


[Contents]   [Back]   [Prev]   [Up]   [Next]   [Forward]