PL/0(t-code version) -- LSI C 寄生型 PL/0 コンパイラ ●はじめに このソフトウェアはオケゲムさんの作られた Public PL/0 コンパイラ (8086 用ネイティブコードバージョン)を元に改造を施したものです。 ちなみに t-code とは LSI C が採用している中間言語の名前であり、決 して呪文のような日本語入力コードの事ではありません。 :-) ●特徴 ◎ LSI C に寄生している。 本ソフトウェアは LSI C の C パーサ(CF)の代わりに PL/0 パーサを 走らせるという構成になっています。コードジェネレータは LSI C の ものをそのまま用います。結果として、次の特徴があります。 ・LSI C と同程度の良質なコード生成(^_^;)。 ・LSI C の関数とリンク可能(制限あり)。 ・LSI C-86 と LSI C-80 の両方に寄生可能。つまり 8086 のコード と 8080 のコードの両方を生成できる。 ●必要なシステム ◎ LSI C-86 動作確認は V3.30a(製品版)でしか行っておりません。しかし V3.30 (試食版)でも動作するはずです。LSI C-86 が正しく動作するような 環境を仮定しています。また make コマンドも LSI C-86 付属の make を仮定しています。 ◎ km-yacc V2.0(FPL の DL2 に登録してある版)で動作確認しています。 ●インストール方法 ◎ _PL0T.LZH ファイルを解凍したら、km-yacc に付属の yaccpar.c をカ レントディレクトリにコピーしてください。そして、 make と入力すると、pl0.exe と pcc.exe を作ります。前者が PL/0t パーサ で、後者は LSI C の LCC に改造を施したコンパイラ・ドライバです。 ◎上のステップが完了したら、次にサンプルプログラムをコンパイルしま す。 make samples と入力して下さい。 ●文法上の相違点 ◎本処理系が許す文法はオリジナルの PL/0 とは異なります。また、以前 に私が FPL で公開した拡張版 PL/0(これもオケゲムさんの作品をベー スにしたもの)とも異なりますのでご注意下さい。以下はオケゲムさん による Public PL/0 との相違点を示します。ただし余り詳しく述べる ことはしません。サンプルプログラムや pl0.y を見て調べてみて下さ い。 1) 関数が許される。 キーワード PROCEDURE の代わりに FUNCTION を用います。 関数から値を返すには「return 式」という構文の return 文を用 います。return 文を実行するとオペランドの式の値を関数の返り 値として即座に関数から脱出します。 2) 手続き・関数には値渡しの引数が許される。 なお、無引数の場合には引数を囲む括弧は付けません。たとえ関数 でも不要です。 3) 手続き・関数の内側には手続き・関数は宣言できない。 ブロックは1レベルしかネストできません。これはスタティックリ ンクの管理をするためのコード生成をするのが面倒だったからです。 4) 外部手続き・関数が許される。 プログラムの先頭(大域変数宣言の前)で次のような形式で外部手 続き・関数を宣言できます。 external procedure foo, function bar(x), procedure zot(a, b); これらの手続き・関数は C で書かれ、別なモジュールとして独立 コンパイルされたものです。 ・仮引数は個数しかチェックしていません。external 宣言におけ る仮引数の名前は特に意味を持ちません。 ・C のソース側では、すべての引数(がもしあれば、それ)の型は int と宣言してください。また C の関数の戻り値型は、function の場合 int に、procedure の場合には void にしてください。 それ以外には特に制限はありません。 ・PL/0 側の main レベルで宣言された変数は記憶クラスが static で外部リンケージを持つ変数となります。したがって C ソース で extern 宣言を行うことによって、C から参照も値のセットも できます。しかし、PL/0 側では変数の external 宣言の機能は 無いため、逆に C 側で宣言した変数を PL/0 からアクセスする ことはできません。 ・PL/0 で宣言した手続き・関数は、その必要があれば C から呼び 出す事も可能です。 ・PL/0 側は常に main を含む形でコンパイルされます。このため、 PL/0 記述のモジュールは常にただ1つだけリンクする事ができ ます。一方、C のモジュールは 0 個以上任意の個数リンク可能 です。 5) PRINT 文は廃止した。 4)で述べたように、C 記述の関数をリンクできるようになったた め、PRINT 文に相当する機能はそちらでまかなう事にしました。 ●コンパイラ・ドライバ(pcc) ◎ pcc は LSI C-86 の lcc というドライバを修正し、.pl0 という拡張 子を持つファイルに対しては cpp → pl0 → cg86 → r86(asm) という 経路でコンパイルを行うようにしたものです。従来同様 .c を始めとす るファイルを自由に混在して指定できます。 ◎ PL/0 ソースも cpp でプリプロセスされます。このため、C 風のコメ ントや #include や #define などのプリプロセッサ指令を利用する事 が可能です。 ◎なお、今回公開する版は LSI C-86 とペアになるように設定されていま すが、LSI C-80(MS-DOS クロス)と PL/0 パーサを組み合わせて用い ると i8080 用のコードが生成でき、動作することは確認しています。 ●著作権・免責 ◎以下で「作者」とは「きだ」のことを指します。 ◎ LSI C の t-code の仕様に関しては作者が個人的に調べた範囲の知識 で利用しています。したがって、なんらかの問題・障害が潜在している ことは十分に考えられますのでご注意下さい。また、当然ながら将来 LSI C が t-code の仕様を変更した場合には対応できなくなります。 ◎作者は、このプログラムに関して自己の著作部分に対する一切の権利を 放棄します。ベースとなったソフトウェアはオケゲムさんによって Public domain 宣言されていますから、本ソフトウェアも ◎このソフトウェアは現状渡し(AS IS)、無保証です。作者は、本ソフ トウェアの運用の結果、直接あるいは間接にもたらされた損害に対して いっさいの責任を有せず、なんらの補償もしない事にご注意下さい。 ●終わりに ◎ LSI C-86 の試食版の公開を決断されると同時に、lcc コンパイラ・ド ライバのソースの著作権を放棄された LSI Japan Co., Ltd. の皆様と、 km-yacc を公開された森公一郎さんに篤くお礼申し上げます。 ◎オケゲムさんには興味深いソフトウェアを Public Domain Software と してリリースしてくださったことに対して感謝致します。 SDI00379 (FPL) きだ あきら