WICS、正式名称はInteger Interpreter Compiler Systemは、主にシャープが販売していた
MZ-80シリーズ(
MZ-80K、
MZ-80B、
MZ-2000、MZ-2200など)を中心に普及した
プログラミング言語、およびその処理系です。同時代の
Z80マイクロプロセッサを搭載したパーソナル
コンピュータ向けに開発され、表記法は当時のマイクロ
コンピュータで広く使われていた
BASIC言語に類似していました。
概要
WICSは、
高水準言語としての表記のしやすさと、限られたハードウェア資源の中で高い実行速度を実現することを両立させることを目指して設計されました。特に、当時の8
ビットパソコンでは開発が難しかった高速なアプリケーション、中でもゲームの作成を容易にすることを主な目的としていました。その処理系は、対話的な開発が可能な
インタプリタと、より高速な実行プログラムを生成する
コンパイラの両方を提供していた点が特徴です。
WICSは、
工学社が発行していた雑誌「I/O」の
1981年9月号から連載記事として、
MZ-80K/C版の
インタプリタ(バージョン1.1)の
ソースコードが
Z80アセンブラであるBASE-80で、
コンパイラ(バージョン1.2)の
ソースコードがWICS自身で記述された形で公開されました。後に刊行された「I/O別冊 WICS・BASEプログラム集」では、
MZ-2000向けの
インタプリタおよび
コンパイラの全
ソースコードが掲載されています。
製品版としては、
インタプリタ、ランタイム、
コンパイラが一組となり、カセットテープ2本組として
キャリーラボから販売されました。WICSはMZシリーズにおけるアプリケーション開発ツールの主要な選択肢の一つとなりましたが、他のプラットフォーム向けの処理系は、
キャリーラボからの発売にとどまるか、全く発売されないケースもありました。
例えば、NECのPC-6001、PC-8001、PC-8801やMZシリーズの各機種向けは製品版が販売されていましたが、X1用は販売されておらず、
キャリーラボ製のゲームで内部的に使用されているのみでした。
また、WICS/BASEシステムと連携するディスク
オペレーティングシステムとして、C-DOSが
キャリーラボから販売されていました。ただし、これはCP/Mのような汎用DOSとは異なり、シャープのF-DOSに近いシステム構成でした。C-DOSも製品版はシャープ
MZ-80B/
MZ-2000用とNEC PC-8801用のみが販売され、後期のPC-8801SRや
MZ-2500(3.5インチドライブ対応版)には対応しませんでした。しかし、C-DOSやそれに含まれるBASEは、X1やFM-7、PC-9801用なども開発され、ゲームに組み込まれて使用されたことから、WICS自体は
Z80搭載の主要機種に、C-DOSとBASEは当時の主要なパソコンの多くに移植されていたと考えられます。
後にPC-8801やX1turboで成功したC-DOS IIは、旧C-DOSとは全く異なるシステムです。
言語仕様
WICS言語は、ステートメント(文)と関数によって構成されます。
BASICに似た単純な文法を持ちますが、いくつかの特徴的な違いがあります。
以下のコードは、WICSでの「Hello, World!」の出力例です。
wics
10 PRMODE 0
20 PRINT "HELLO, WORLD!"
30 END
数値型は8
ビットまたは16
ビットの整数のみを扱え、浮動小数点数や本格的な
文字列編集機能はありませんでした。これは、簡易な
BASICであるTiny
BASICなどに見られる機能制限と類似しています。その代わりに、メモリ操作や
ビット操作、画面表示に関する機能が充実しており、ハードウェアに近い低レベルな操作が可能でした。
リテラルとしては、16
ビットの範囲の十進数や十六進数、そして1文字を表す8
ビット文字コードが使用できます。変数は16
ビット幅のみで、8
ビット文字を変数に代入すると上位8
ビットはゼロで埋められます。変数を文字として出力する際は、通常上位8
ビットは無視されます。
配列は8
ビット配列と16
ビット配列の2種類がありましたが、実体としては配列データの先頭アドレスを変数に代入する方式でした。これは実質的にポインタとして機能するため、アドレス管理を誤るとメモリ上の任意のデータを破壊する危険性がありました。
文字列は、特定のステートメントや関数の引数としてのみ使用でき、
文字列からポインタを得るような機能は提供されていませんでした。
制御構造は、
BASICの基本的なGOTO, IF-THEN, FOR-NEXT, GOSUB-RETURNなどに加え、
PascalのようなREPEAT-UNTILループを備えていました。
入出力に関しては、
標準ストリーム的な考え方が導入されており、`PRMODE`ステートメントを使用することで、`PRINT`のような出力命令の出力先をディスプレイとプリンタの間で切り替えることができました。上記の
Hello world|Hello_worldの例で`PRMODE 0`を`PRMODE 1`に変更すると、出力先がプリンタになります。
多くの
BASICとは異なり、機械語プログラムを呼び出す`USR`命令が関数として実装されていたため、機械語ルーチンからの戻り値を取得することが容易でした。`USR`呼び出し時には引数がHLレジスタにセットされ、機械語ルーチンは戻り値をHLレジスタに入れて戻るという規約が用いられていました。
処理系
WICSの処理系は、発表当時としては
インタプリタでも他の多くの言語処理系と比較して高速でしたが、
コンパイラを利用することでさらに高い実行速度を実現できる点が大きな強みでした。
インタプリタは、
BASICと同様の対話的な操作で使用できます。しかし、標準のメモリマップでは
インタプリタが使用する変数やスタック領域が2304バイトと少なく、大規模なプログラムを作成する際には、
ソースコードの格納開始位置などのメモリ割り当てを変更する必要がありました。スタックサイズは512バイトで固定されており、変更できないため、スタックサイズ変更を前提としたプログラムは
インタプリタで完全にテストできないという制約もありました。
コンパイラは、ソースプログラムの各ステートメントや関数に対して、ほぼ1対1に対応する機械語コードを生成しました。前後のステートメントにわたるような高度な最適化は行われず、特にランタイム呼び出しやサブルーチン呼び出しでは、HLレジスタやスタック操作に関する機械語が多く生成される傾向がありました。他の処理系と比較して既に高速だったため、複雑な最適化が不要と判断されたのかもしれません。この点において、WICS
コンパイラは高級言語の
コンパイラというよりは、高機能なマクロアセンブラに近い性格を持っていたと言えます。ただし、
キャリーラボが開発したBASE-80アセンブラで既に実装されていたように、JP命令とJR命令の局所的な最適化は行われていました。
コンパイラが生成する実行プログラムは、ディスプレイのリフレッシュレートと同期を取らない特性を持っていました。そのため、
BASICのように安易に画面出力命令を使うと、実行時に画面にちらつきやノイズが発生することがありました。
インタプリタ、
コンパイラ、そして
コンパイラが生成した目的プログラムは、共通のランタイムルーチンを使用しました。ランタイムは約2560バイトから4608バイトと比較小型で、各種標準ルーチンや機械語モニタを含んでいましたが、
MZ-80B/2000用などでは、さらに5376バイトのTSモニタを別途必要としました。
コンパイラが生成した目的プログラムは、ランタイムのみを使用して動作するため、
インタプリタ本体は不要でした。この特性を利用し、
インタプリタがロードされていたメモリ領域に目的プログラムを生成することで、ランタイムと目的プログラムが占める連続メモリ領域を小さく抑えることが可能でした。
利用の実際
WICSは文法構造が
BASICに似ていたため、当時のパソコンユーザーに多かった
BASICの経験者にとって、比較的容易に習得できる言語でした。
それまで
MZ-80シリーズのゲーム開発で一定の人気を誇っていた
ハドソン製のFORM(整数型Tiny FORTRAN)に代わり、WICSはゲーム開発言語として主流の一つとなりました。特に「I/O」誌とその姉妹誌に掲載されるプログラムリストでは、WICSで作成されたものが多く見られるようになりました。
一つの言語仕様に対して、
インタプリタと
コンパイラの両方の処理系が提供されていたことも魅力でした。
オペレーティングシステムが存在しないことが一般的だった当時のパソコン環境では、コンパイル後のプログラム実行中に問題が発生した場合、ハードウェアリセット以外の手段で復旧することが困難でした。カセットテープ環境では、プログラムの再読み込みに時間がかかるという問題もありました。WICSでは、コンパイルを予定しているプログラムを、比較的安全な
インタプリタ上で事前にテスト実行できるため、デバッグ効率が大幅に向上しました。プログラム停止時に変数の値を一覧表示する`VLIST`コマンドも、
インタプリタ上でのテスト実行をサポートする機能として設計されていたと言えます。
その他
WICSで開発されたゲームは、開発元である
キャリーラボだけでなく、他のソフトウェアハウスからも複数タイトルが発売されました。ただし、
キャリーラボはランタイムを含めた目的プログラムの製品版販売を完全に無償・自由としていたわけではありません。製品版WICSに付属するマニュアルには、ランタイムと目的プログラムをまとめてセーブする方法が記載されている機種もありましたが、製品利用に関する制限が明記されているものも存在しました。
当時のアセンブラで作成されたソフトウェアと比較して、WICSは比較的規模が大きいにも関わらず、リリースされたバージョンにはバグが非常に少なかったことでも知られています。