読者です 読者をやめる 読者になる 読者になる

レトロコンピュータで Scheme 処理系を動かす

レトロというには性能が高すぎるが PC-9801プログラミング言語 Scheme の処理系を動かすことを考えてみる。 このとき拡張メモリはないものと想定する。 つまり、 OS 込みでコンベンショナルメモリ内だけで動作させられるだろうか。 Scheme 処理系としては軽量である TinyScheme (バージョン 1.41) を利用することにした。 単に軽量であるというだけでなくソースコードの構成が単純なのでビルドプロセスを実行するために特別にツールを導入する必要がなく楽だという理由もある。

私が TinyScheme をコンパイルするのに使ったのは Windows 版の Open Watcom C/C++ だ。 (ここではコンパイラの導入方法の説明はしない。)

http://www.openwatcom.org/

Open Watcom compiler suite は DOS 版、 Linux 版、 OS/2 版、 Windows 版が存在して御互いにクロスコンパイルすることもできる。 今回は Windows 版を用いる。 DOS の世界ではファイル名が 8 文字以内という制限があり、 TinyScheme のソースコードの一部はそれより長いファイル名を使っているので書換えるのが面倒だからだ。

当初は Turbo C (フリー版) を使おうかとも思ったが C99 に対応していないので TinyScheme をコンパイルするのには不足だった。

TinyScheme を DOS 用 (16-bit code) にコンパイルするにあたってソースコードを一箇所だけ書換える必要があった。 差分を示す。

--- scheme.c.org	2013-04-15 05:08:34 +0900
+++ scheme.c	2016-01-05 10:50:24 +0900
@@ -4387 +4387 @@
-#define INF_ARG 0xffff
+#define INF_ARG INT_MAX

INF_ARG は手続きのアリティの上限を示すのに使われる定数だ。 引数の数に制限がないような手続きに対して「充分に大きい値」を上限とすることで代用していて、その値が 0xffff であるということである。 しかし、 16 ビットの int では 0xffff は表現不能なので切り詰められてマイナスの値になってしまいまともに動作しなくなるので int の最大値である INT_MAX に置換えている。

あとは以下のようにコマンドを与えれば実行ファイルが生成される。

> wcc scheme.c -fpi87 -oh -ol -om -os -4 -zq -d0 -bt=dos -fo=.obj -ml -DUSE_DL=0 -DUSE_MATH=1 -DUSE_ASCII_NAMES=0 -DUSE_STRLWR=0
> wlink name scheme system dos op stack=16k op q file scheme.obj

ここで生成された scheme.exe と init.scm を適当な方法で PC-9801 環境にもっていけば動作させることが出来る。 init.scm はカレントディレクトリから読まれるということに注意すること。

f:id:SaitoAtsushi:20160105135121p:plain

PC-9801 であれば TinyScheme くらいの軽量な処理系は余裕をもって動作可能であることがわかった。 もっとメモリが少なく速度の遅いコンピュータでも大丈夫だろう。 実用するにはいくらか手続きを追加する必要がある場面もあるだろうが、レトロコンピュータで使うプログラミング言語として Scheme は充分に選択肢に入ると思う。

Document ID: 37c729e92f127e83e6adbbe44a53e49b