WICS
テンプレート:Infobox プログラミング言語 テンプレート:プログラミング言語 WICS(Integer Interpreter Compiler System)は、BASICライクなMZ-80K及びMZ-80B/2000シリーズで主要に使われていた、同時代のZ80システム用の整数型プログラミング言語。
概要
WICSはBASIC[1]に似た表記方法を採用した、インタプリタ兼コンパイラ型高級言語である。処理速度とRAM領域が限られた8ビットパソコンで、容易に高速なアプリケーション、特にゲームを作成する目的で開発された。
工学社のI/O誌1981年9月号より連載記事の形で発表され、アセンブラ言語BASE-80[2]によるソースコードが公開された。後に発刊された「I/O別冊 WICS・BASEプログラム集」では、MZ-2000向けのインタプリタ(BASEアセンブラによる記述)・コンパイラ(WICSによる記述[3])の全ソースコードが掲載された(MZ-80B向けでは、I/O本誌連載時にコンパイラのみソースコード掲載)。
製品版は、カセットテープ2巻(インタプリタとランタイム、コンパイラ)でキャリーラボから販売された。
MZシリーズのアプリケーション作成ツールの主流の一つとなったが、他のプラットフォームの処理系は、キャリーラボからの発売のみか、発売されていないものさえあった。 例えば、NEC各機種(PC-6001、PC-8001、PC-8801)やMZシリーズ各機種用は販売されていたが、X1用は販売されておらず、キャリーラボ製のゲームで使用されているのみである。
また、WICS/BASEシステムのディスク版として、C-DOSがCarry labより販売されていたが、これはCP/M等と異なりシステム構成としてはF-DOSに近いものであった。 C-DOSも、販売されていたのはSHARP MZ-80B/MZ-2000とNEC PC-8801用のみであったが、PC-8801SR対応版もMZ-2500の3.5インチドライブ対応版も販売されなかった。 C-DOSは、X1、FM-7、PC-9801用等も開発されておりゲームに組み込まれているため、WICSはZ80の主要機種、C-DOSとBASEは当時の主要機種すべてに移植されていたようである。 後にC-DOS IIがPC-8801とX1turboで大成功したが、旧C-DOSはまったく違うものである。
言語仕様
WICSによるHello world
10 PRMODE 0 20 PRINT "HELLO, WORLD!" 30 END
BASIC言語から実数演算と文字列処理の機能を除き、代わりにメモリ操作やビット操作、画面表示関係などの命令が追加されている。
定数は16ビット範囲の10進整数または16進数、及び1文字分の8ビット文字コードのみが許可されている。変数は16ビットのみで、これら定数を代入できる(8ビット文字コードを変数に代入すると上位8ビットが0でパディングされ、変数を文字として出力する場合等では上位8ビットは捨てられる)。
配列は8ビット配列と16ビット配列とがあり、使用するメモリ領域先頭の実アドレスを変数に与えて、(C言語等でいう)ポインタのように用いる。配列を操作する標準のステートメントは、適切に使用しないとバッファオーバーランを起こす。
文字列は、特定のステートメント及び関数の引数としてのみ使用できる(文字列をポインタに型変換するような機能は提供されていない)。
BASICの基本的な構文の他、Pascal風のREPEAT - UNTIL文を備える。PRMODE文(同一の出力命令をディスプレイとプリンタとで切り替えるステートメント)で標準出力の概念が取り入れられており、上記のHello worldはPRMODE 1に変更するとプリンタに印字される。
また、BASICと異なりUSR(機械語プログラム呼出し)が関数[4]になっており、HLレジスタに引数を設定するだけでなく、HLレジスタの値を戻値として参照できる。
処理系
インタープリタでも発表当時に存在した他の処理系と比較してかなり高速な上、コンパイラを使えばさらに高速実行が期待できた。
インタープリタは、BASICと同等の操作で使用できる。標準のメモリマップではインタープリタが使用する変数・スタック領域が2304バイトしかなく、一定以上のプログラムを作成する際にはメモリ割り当て(ソース格納開始位置)を変更する必要がある。スタックサイズは512バイトで、変更できない(スタックサイズ変更を前提にしたソースプログラムは、インタプリタでテストできない)。
ソースプログラムのステートメントや関数からは、コンパイル時にほぼ1対1に対応する機械語が生成され、前後のステートメントにわたっての最適化はなされない。ランタイム呼出しやサブルーチン呼出しでは、HLレジスタやスタックを操作する機械語が多くで生成される。他の処理系と比較して高速であったために、コンパイラを複雑化させる最適化が試みられなかったとも考えられるが、この点において、WICSコンパイラは高級言語処理系というより、高機能なマクロアセンブラであったといえよう。なお、局所的にはJPとJRの最適化は行われたが、これはキャリーラボが既にBASE-80に実装している[5]。
コンパイラが生成した目的プログラムは、ディスプレイのリフレッシュレートとの同期を行わない。このため、BASICの感覚で画面出力ステートメントを記述すると、実行時に画面上にノイズが現れることがある。
ランタイムは、インタープリタ、コンパイラ、目的プログラムのいずれもが共通に使用する。2560バイト~4608バイトと小型であり、各種の標準ルーチンと、機械語モニタを含んでいるが、 MZ-80B/2000用等では、他に5376バイトのTSモニタを必要とする。
コンパイラが生成した目的プログラムは、ランタイムのみを使用する(インタープリタ本体は使用しない)。このため、インタープリタに上書きして目的プログラムを生成することにより、ランタイムと目的プログラムを併せた連続占有メモリを小さくできる。
利用の実際
BASICに似た文法構造のため、BASIC経験者にとっては修得が容易であった。
それまでMZ-80シリーズのゲーム開発で人気があった、ハドソン製のFORM(整数型Tiny FORTRAN)に代わり、ゲーム開発用言語として一定の人気を博した。前述のI/O及びその姉妹誌では、発表されるプログラムの作成ツールでは主流となった。
一つの仕様の言語が、インタープリタとコンパイラとに共通で適用できることにも魅力があった。処理系がコンパイラのみの場合、OSのない当時のPCでは、目的プログラムのテストランは失敗時にハードウエア・リセット以外の復旧方法がない。MZシリーズではカセットテープからの再読込が必要となる。この問題に対してWICSでは、コンパイル予定のプログラムを、比較的安全にインタープリタ上でテストランできる。
インタープリタの設計がテストランを意識している傍証として、VLISTコマンド(プログラム停止時の変数の値を列挙する)の存在を挙げることができる。
その他
- 開発元のキャリーラボだけではなく、他社からもWICSで開発されたゲームが複数タイトル発売された。但し、キャリーラボはランタイムを含めた目的プログラムの製品版開発に関してフリーとしていたわけではない。WICS製品版に同包されたマニュアルには、機種によってはランタイムと目的プログラムをまとめてセーブする方法が記載されているものもあるが、製品利用に関して自由に使用できないことが明記されたものもある。
- アセンブラで作成された当時の一定規模のソフトウエアとしては、非常にバグが少なかった。
脚注
- ↑ 本記事での「BASIC」は、WICS発表当時に一般的であったBASIC処理系を指す。
- ↑ 佐々木、山本はWICS発表当時、キャリーラボに所属しており、BASE-80はWICSより先にキャリーラボが開発し発売していた。
- ↑ インタプリタを使用した自身のコンパイラの生成は、他のBASIC処理系でも用いられた方式。コンパイラコンパイラと称していた(一般的なコンパイラコンパイラとは違うものである)。但し、記述自体はWICSによるが、ソースコードの中でバイナリコードの直接記述の機能を使用しており、これはインタプリタでは対応していないため、インタプリタでの実行はできない。
- ↑ BASICではUSR類似の機能はステートメントであり、戻値が参照できないものが多い。
- ↑ BASE-80は、Z80の複数のジャンプ命令をGOTOニーモニックで統一し、分岐先に応じてJPかJRかを生成する。