なお、long double型はdouble型と同じサイズである。 また、前処理とライブラリはgccのものが使われることを仮定している。
java coins.driver.Driver オプション指定 ソースファイル名「オプション指定」については 2.2. コンパイラ・ドライバの使い方 を参照されたい。
「ソースファイル名」は".c"で終わるものでなければならない。
それらが使えず、代わりにものがある場合、たとえば、
アセンブラとして"gas"でなく"as"が使える場合は
-coins:assembler=as
というオプション指定をすればよい。より詳しくは
ここの
-coins:preprocessor/assembler/linker
の記述を参照されたい。
Cの前処理系にはgccの前処理系cppを利用する。また、実行時ライブラリもgccのものを利用することにし、インタフェースをgccに合わせている。
-coins:hirOpt=fromcというオプション指定をすると、HIR生成時に次のような最適化を行う。
*&v --> v -(-v) --> v、 他
v + 0 --> v v - 0 --> v v * 0 --> 0 v * 1 --> v, 他
!(a<b) --> a>=b 定数A 比較演算子 定数B --> true または false, 他 e1 && e2 でe1がtrue --> e1の副作用,e2 r = (a=1)>0 ? 1 : 0; --> r = (a=1) , 1; 他
到達不能の式文/return/goto --> 削除 ジャンプ距離が0のgoto --> 削除 参照されないラベル --> 削除 連続するラベル --> ラベルの統合 空のブロック --> 削除 式文 --> 副作用だけ残して他の部分を削除
if(true) THEN部; else ELSE部; --> { THEN部; goto LABEL_END; ELSE部; LABEL_END:; }, 他
while(false) BODY部; --> { goto LABEL_BREAK; BODY部; LABEL_BREAK:; } for(INIT部;false;STEP部) BODY部; --> { INIT部; goto LABEL_BREAK; BODY部; STEP部; LABEL_BREAK:; } do BODY部; while(false); --> BODY部; 他
以下のものはFortran 77の規格の仕様には入っていないが、ベンチマークプログラム などでもよく使われているので、サポートしている。
java coins.driver.F77Driver オプション指定 ソースファイル名「オプション指定」については 2.2. コンパイラ・ドライバの使い方 を参照されたい。
「ソースファイル名」は".f"で終わるものでなければならない。ソースファイル名は "foo.f bar.f ..."のようにいくつか並べても良い。
なお、
-coins:printhir
というオプションを指定すると、FortranプログラムをHIRに変換した後で、HIRの木と
シンボルテーブルを出力する。
これは、coins.driver.F77Driverの中に、次のような記述があるからである。 このようにして、任意のオプションを追加することが出来る。
if (io.getCompileSpecification().getCoinsOptions().isSet("printhir")) {
hirRoot.programRoot.print(0);
io.printOut.print("¥n");
symRoot.symTable.printSymTableAllDetail(symRoot.symTableRoot);
symRoot.symTableConst.printSymTableDetail();
io.printOut.print("¥n");
}
その他に、実行時ライブラリとして"libf2c"が必要である。このライブラリは http://www.netlib.org/f2c/libf2c.zip をダウンロードして、その中にあるREADMEにしたがってインストールすれば良い。
UNIX系のOSの場合、解凍したlibf2cのディレクトリで
% cp makefile.u Makefile % makeを実行して得られる"libf2c.a"を適当なところにおいて、その置き場所を Fortran Driverに認識させれば良い。そのためには
libf2cLocation /directory/path/where/libf2c.a/existsのように、"libf2c.a"の置き場所を指定する行を含んだファイルを"settings"という名前で ライブラリ・ディレクトリに置けば良い。
ライブラリ・ディレクトリは、特に指定しない場合は、
~/coins/となっているので、そこに"settings"ファイルを置けば良い。
なお、cygwinの場合は、上記の手続きに少し修正が必要である。まず、上記のMakefileの中にある"a.out" を"a.exe"に変更する必要がある(2ヶ所)。また、cygwinでは、上記のライブラリ・ディレクトリを認識せず、 現在作業中のディレクトリを探すようであるので、"settings"ファイルは作業中のディレクトリに置いておく必要がある。
Fortran言語には、ENTRY文、assigned GOTO文など、最近の言語にはない ものとしてHIRには用意されてない機能がいくつかある。それらについては プログラム変換をしている。おおまかには、それと等値な働きをするCプログラムを 考えて、それのHIRに相当するものに変換している。
HIRへの変換過程は次のようになっている。
これらのモジュールはcoins.ffrontパッケージにある。そのディレクトリ内にある
詳しくは Fortran特有の機能に対する考慮、 Fortranコンパイラの設計、を参照されたい。
Javaではプログラムがソースプログラムとしてではなく、クラスファイルとして提供されることが多い。Javaソースプログラムを入力とする言語処理系を作ったとしても、クラスファイルを入力とするものも必要となる。そこで、COINSではJava言語を入力とするのではなく、それから作られたクラスファイルを入力としてHIRを生成する。JavaプログラムはHIRとLIRを経て機械語に変換されるが、それを実行する時には通常のJava仮想機械が持つ機能も必要になる。それらの機能を少ない人数で短期間に作ることは困難なので、gnu gcjの実行時ライブラリを利用することにし、インタフェースをそれにあわせた。
Javaの実現にあたっては、オブジェクトの生成と例外処理が大きい課題となる。オブジェクトのデータ構造はgcjにあわせる。例外処理の方法としては、表引き法、2返戻値法などがあるが。gcjは表引き法を採用している。これをHIRで表現するには、HIRに例外処理の機構を組み込む必要があり、それはHIRだけでなく、バックエンドなど、COINSのほぼ全体に対する改造が必要となる。そこで、Javaの例外処理の実現にあたっては、2返戻値法を使うことにして、メソッド呼び出し時にgcjの表引き法が必要とする情報を付加するつなぎの処理を挿入することにした。
PL0コンパイラのフロントエンドのJavaCCによる記述は http://www.coins-project.org/advanceduse/ll/coinsCompilerPL0.html を参照されたい。
Simpleコンパイラのフロントエンドのjayによる記述は http://www.coins-project.org/advanceduse/simple/coinsCompiler.html を参照されたい。