[HOME] [VTL系言語の歴史] [RVTL]

GAME86 Compiler for MS-DOS 1.00C

1999/4/5 Jun Mizutani (mizutani.jun@nifty.or.jp)
2003/7/29更新


ダウンロード:game86c.lzh (19k) for MS-DOS/Windows95/98

1980年前後に流行した言語GAME(General Algorithmic Micro Expressions) のMS-DOS用のコンパイラです. GAMEで記述されたソースから COM形式の 実行ファイルを生成します.ランタイムライブラリ以外はGAME80コンパイラ をTurboPascalに書きなおし,8086のコードを生成するように変更したも のです.短いプログラムでは,1Kバイト程度と非常にコンパクトな実行フ ァイルが生成できます.

GAME-IIIは1978年7月号の月刊アスキーで6800用のインタプリタ(機能的に はBASIC)として大西博氏によってアセンブラソースとともに公開されまし た.バイナリのサイズが約1.5Kバイトと小さく,サイズの割に高機能でソ ースがあることから,8080, z80, 6809, 6502と多くのCPUに移植されまし た.さらに中島 聡氏によってGAME自身で記述された 8080用のGAMEコンパイラがアスキー誌上で発表され, コンパイラも多くの機種で動作するようになりました.

GAMEは,ALTAIR 680b用のたった768バイトで書かれたTinyBASICであるVTL の文法を拡張した記号言語です. ほとんどの機能が代入文で実現されて いるため,言語の解析部(parser)が非常に簡単になることから拡張機能も 容易に組み込むことが(ソースレベルで)出来ます.

GAME86 Compiler for MS-DOS 1.00C ではランタイムライブラリだけで *768バイトも* 使ってしまいました ;-)

1999年現在,TinyBASIC系のDOS用の言語処理系の実用的な価値はほとんど ないと思いますが,1980年代の「趣味」で言語処理系を作成するブームを 作るきっかけになった「小さな言語処理系のサンプル」として歴史的な価 値があると思います.私は日本で言語処理系の作成に関する書籍の発行は 1980年代が最も多かったのではないかと思っています.(統計をとったわ けではありませんが) もしかすると,今でも「小さな言語処理系」にも活用できるアイデアが生 まれるかも知れないと思って公開してみました.

DOS用GAME86コンパイラ1.00Bは1989年に書いたものですが,MS-Windows で実行しやすいように少し手を加えてバージョンは 1.00Cとしています.

【ファイル】

コンパイラ本体

GAME86.EXE
GAME86コンパイラ実行形式(MS-DOS/MS-Windows用).

以下のファイルはGAME86.EXEのソースです.

GAME86.PAS
GAME86コンパイラソース(TurboPascal v.4,5,5.5,6,7)
RT2.ASM
ランタイムライブラリソース(MASM,TASM用)
RT2.OBJ
ランタイムライブラリオブジェクトファイル
GAME86.EXEに内蔵されます.

拡張子が GM のファイルは GAME86のサンプルソースです.

SIEVE.GM
素数を見つけるエラトステネスのふるいの例
SYNTAX.GM
GAMEの文法の使用例

【使用法】

GAMEソースファイルの拡張子は .GM としてください.

GAMEソースファイルが sieve.gm の場合の実行例:

(コンパイル)

 E:\GAME86>game86 sieve.gm
 GAME86 Compiler  MS-DOS  v.1.00C by Jun 4/4/99


     Load  300 byte

  Line No: 220  Address. = 1079

  PROGRAM SIZE: 1105

    ---> E:\GAME86\SIEVE.COM

  END

またはWindowsでsieve.gmのアイコンをGAME86.EXEのアイコンにドラッグ アンドドロップします.

(実行)

 E:\GAME86>sieve
 START
 1894PRIMES
 END

ここで生成された SIEVE.COM は単独で実行可能です. SIEVE.COMは,80286@8MHzのときは49.7秒かかっていましたが, Celeron300A@450MHz では 0.15秒程度です.330倍!!

【文法】

オリジナルの GAME-III のうちインタプリタ特有の命令(編集,リスト,プログ ラムのロードやセーブ)はサポートしていません.

以下にGAME86の文法を簡単に示します. 文法的には基本的に代入文しかありません.システム変数に値を代入,読み出し することで入出力, 制御文の機能を実現します. 演算には優先順位がありません.左から順に計算されます.

    <行番号>   1 〜 32767
    <10進定数> 0 〜 65535
    <16進定数> $0000 〜 $FFFF
    <文字定数> "文字"
    <変数名>   A 〜 Z または冗長形(ABC等 先頭1文字が有効)

    <1バイト配列> ::= 変数名 ( <式> )
                      変数の値 + 2 * 式の値 のアドレスの内容を値とする.

    <2バイト配列> ::= 変数名 : <式> )
                      変数の値 + 式の値 のアドレスの内容を値とする.

    <定数> ::= <10進定数> | <16進定数> | <文字定数>

    <変数> ::= <変数名> | <1バイト配列> | <2バイト配列>

    <式> ::= <項> | <項> <二項演算子> <項>

    <項> ::= <定数> | <変数> | <配列> |( <式> )| <単項演算子> <項>

    <二項演算子> ::= + | - | * | / | = | <> | < | > | <= | >=
                    比較演算 は 真:1, 偽:0の値を取る.

    <単項演算子> ::= - | + | % | ' | #
                     + は絶対値, % は直前に実行した除算の余り,
                     ' は乱数, #は否定.
    <行> ::= <行番号> スペース <文> [ 空白 <文> ] 改行
             | <行番号> スペース以外の文字 コメント 改行

    <文>
        <変数>=<項>     変数への代入
        #=<項>            <項>の値の行番号の文にジャンプ(GOTO)
                          行番号がなければ行番号より大きい最初の行へジャンプ
        #=-1              プログラムの終了(END)
        !=<項>            <項>の値の行番号のサブルーチンへジャンプ(GOSUB)
        ]                 サブルーチンから戻る(RETURN)
        ;=式              式の値が真の場合は次の文に進み,
                          偽の場合は次の行を実行.
        @                 DO
        @=(式)            UNTIL
        変数=初期値,ステップ FOR
        @=式              NEXT
        /                 改行出力
        "文字列"          文字列出力
        ?=<項>            <項>の結果を数値出力 左詰め
        ??=<項>           <項>の結果を数値出力 16進4桁
        ?$=<項>           <項>の結果の下位1バイトを数値出力 16進2桁
        ?(n)=<項>         <項>の値の数値出力 n桁で右詰め
        $=<項>            <項>の値の下位バイトを文字コードとする1文字を出力
        .=<項>            <項>の値の下位バイトの数だけ空白を出力
        '=<項>            <項>の値で乱数シードを設定
        <変数>=?          10進数値を入力して変数に代入
        <変数>=$          1文字を入力して変数に代入

【参考文献】

【使用条件と配布条件】

本ソフトウェアの配布と改変に特に制限はありません. 万一,本ソフトウェアを使用したことで損害が発生した場合でも,私(水谷 純, mizutani.jun@nifty.or.jp)に責任を負う義務はありません.


[HOME] [VTL系言語の歴史] [RVTL]
ご意見・ご感想は,こちらまで.