Next: , Previous: , Up: Engine   [Contents][Index]


15.1 Portability

Gforth プロジェクトの重要な目標の一つは、 様々なPCで使えることです。 fig-Forth と、 程度は低いですが F83 は、 当時人気のあったいくつかのプロセッサ向けにエンジンをアセンブリ言語で手動でコーディングすることで、 この目標を達成しました。 このアプローチは非常に労働集約的であり、 コンピュータ・アーキテクチャの進歩につれ短命に終わってしまいます。

たとえば Mitch Bradley (cforth)や、 Mikael Patel (TILE)や、 Dirk Zoller (pfe) など、 C 言語でコーディングすることでこの問題を回避したモノもあります。 UNIX マシンのアーキテクチャは多種多様であるため、 このアプローチは UNIX ベースの Forth で特に人気があります。 残念ながら、 C 言語での実装は、 効率の目標や、 従来の手法の使用とうまく調和しません。 間接または直接のスレッド化は C 言語では表現できず、 C 言語で利用できる最速の手法であるスイッチ・スレッディングは大幅に遅くなります。 C 言語 のもう 1 つの問題は、 2倍長整数の演算を表現するのが非常に面倒なことです。

幸いなことに、 これらの制限のない移植可能な言語が存在します。 それは、GNU C 言語コンパイラによって処理される C 言語のバージョンである GNU Cです(see Extensions to the C Language Family in GNU C Manual)。 値としてのラベル機能(see Labels as Values in GNU C Manual)により、 直接および間接的なスレッド化が可能になり、 その long long 型(see Double-Word Integers in GNU C Manual)は、 多くのシステムで Forth の 2倍長整数に対応します。 GNU C は、 すべての重要な(および多くの重要でない) UNIX マシン や VMS や MS-DOS を実行する 80386 や Amiga や Atari ST で無料で利用できるため、 GNU C で書かれた Forth はこれらすべてのマシンで実行できます。

ポータブルな言語で記述すると、 アセンブリよりも遅いコードが生成されるという評判があります。 Forth エンジンでは、 コンパイラーによって生成されたコードを繰り返し確認し、 ソース・コードを適切に変更することで、 コンパイラーによって引き起こされる非効率性のほとんどを排除しています。

しかしながら、 プログラマはレジスタ割り当てに移植可能な影響を及ぼすことができないため、 レジスタが不足しているマシンでは非効率が発生します。 一部のマシンでは速度を向上させるために、 明示的なレジスタ宣言を使用しています(see Variables in Specified Registers in GNU C Manual)。 これらは、 構成フラグ --enable-force-reg (gcc スイッチ -DFORCE_REG) を使用してオンにします。 残念ながら、 この機能はマシンだけでなくコンパイラのバージョンにも依存します。 一部のマシンでは、 特定の明示的なレジスタ宣言が使用されると、 一部のコンパイラ・バージョンでは不正なコードを生成します。 したがって、 デフォルトでは -DFORCE_REG は使用されません。