VTL系言語の歴史

現在ではインターネット上で検索しても資料が見つかりませんが、私の知って いる範囲でVTL系言語の仕様をまとめてみました。表の最初にある拙作の rvtl 以外は不正確な部分もあるかもしれません。 基本的には BASIC ですが、コマンドが記号に代入する形式となっています。

オリジナルは VTL (Very Tiny Language) という768バイトで書かれた ALTAIR 680b 用の Tiny BASIC です。日本では, 1980年前後に GAME III (General Algorithmic Micro Expressions) というVTL系言語が流行しました。 メモリが 4 キロバイト程度しかない環境でも BASIC という高級言語を使って みたいという切実な思いが背景にあったと思います。どれもエディタ機能まで も持っていました。

おそらく VTL は、1976年9月頃に使われ始めた 8080で動作する CASUAL (Chicago Area Small Users Algorithmic Language) を参考にして開発された ものと思われます。VTL のソースを入手することは困難ですが、CASUAL (の移植版) は今でも Simtel CP/M User's Group Volumes 18 (cpmug018.ark) の中に見ることができます。

cpmug018.ark は https://www.retroarchive.org/cpm/cdrom/SIMTEL/CPMUG/CPMUG018.ARK
https://custom.lab.unb.br/pub/emulators/cpm/cpmug/cpmug018.arkから 入手可能です。CP/M で使われていたらしい ark 形式のアーカイブは ark101.zip という MS-DOS で動作するプログラムで解凍することができます。 「ark101.zip」を Google で 検索 すると簡単に見つけることができます。

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

表中で A は変数、e と n は式を、x.x はファイル名を表しています。

言語 rvtl64 rvtl CASUAL VTL VTL/K GAME III VTL98
CPU x86-64
Arm64
RISC-V
80386+
ARM
PowerPC
8080 6800 6800 6800他 8086+
OS Linux Linux   altair Mikbug 多種 PC-98
発表年 2010-2024 2002-2005 1976 1976? 1978 1978 1988
プログラムサイズ(KB) 10 - 28 8 - 16 1.6 0.75 1.25 1.5 3.4
行番号 1-21億 1-65534 1-65535 1-65535 1-65535 1-65535
コメント : .=e ) ) \ Line#X ;
ラベル ^ABC          
単純変数 A-Za-z A-Z A-Z A-Z A-Z A-Za-z+
単純変数ビット数 64 32 16 16 16 16 16
単純変数範囲 -900京~
+900京
-21億~
+21億
0-65535 0-65535 0-65535 0-65535 0-65535
単純変数スタック PUSH +ABC         ]ABC
単純変数スタック POP -CBA         [ABC
文字定数 'Abcdefgh' 'Abcd'       'A' 'A'
16進定数 $     ] $ $
1バイト配列 (8bit) A(0) '[0]     A:0) A(0)
2バイト配列 (16bit) A{0} "[0] :0) :0) A(0) A[0]
4バイト配列 (32bit) A[0]          
8バイト配列 (64bit) A;0] or A;0;            
数値入力 A=? A=? A=? A=? A=? A=?
数値出力 10進左詰 ?=e ?e ?=e ?=e ?=e ?=e
数値出力 10進右詰n桁 ?(n)=e       ?(n)=e  
数値出力 10進右詰 0埋め ?[n]=+e          
数値出力 16進2桁 ?$=e       ?$=e ?B=e
数値出力 16進4桁 ?#=e       ??=e ?W=e
数値出力 16進8桁 ??=e          
数値出力 16進16桁 ?%=e            
数値出力 無符号10進 ?*=e          
数値出力 8進n桁 ?{n}=e          
数値出力 2進n桁 ?!n!=e          
文字入力 A=$       A=$ A=?'
リアルタイム文字入力 A=@          
文字出力 $=e   $=e $=e $=e ?'=e
文字出力 2byte $$=e          
文字出力 4byte $#=e          
文字出力 8byte $%=e          
文字列出力 "STR" ?/STR/ ?="STR" ?="STR" "STR" "STR"
改行 /   ?=" "   /  
改行の阻止   ; ; ;    
ページ移行       <=   #=
GOTO #=e .=e #=e #=e #=e #=e
GOSUB !=e $=e #=e   !=e #=e
MACHINE GOSUB     >= >= >= >=
RETURN ] .=$ #=!   ] !
STOP #=-1 .=-1 #=MAX+ #=MAX+ #=-1 .
IF ;=n       ;=n  
FOR A=1,10       A=1,10  
NEXT @=n+1       @=n+1  
DO @       @  
UNTIL @=(n)       @=(n)  
PEEK 配列 !   A=@(n) 配列 配列
POKE 配列 &=e   @(n)=e 配列 配列
SLEEP _=n          
NEW &=0 N &=0 &=0 &=0 }={
LIST 0
20-
20+
L 0 0 0 0
式の優先順位 無 () 有 () 無 () 無 () 無 () 有 ()[]
算術演算子 + - * / +-*/ +-*/ +-*/^ +-*/ +-*/
& \ ^ |     .(AND)    
>> <<     .(OR)    
単項演算子 - + < - +   - - -+%# - ! &
比較演算子 = < > = < > = < > = < > = < > = < >
>= <= #     >= <= >= <=
<>       <>  
変数のアドレス           &
システム (return address)   $ !     ^
システム (剰余) % % % % % %
システム (セグメント)           = 配列
システム (行番号) # .     #  
システム (ページポインタ) =     < = {
システム (テキスト先頭) ,     <   -
システム (テキスト末) &   &     }
システム (RAM末) *(可変)   *   * +
システム (乱数) `   '   ' ~
システム (ファイル先頭) {          
システム (ファイル最終+1) }          
システム (秒, マイクロ秒) _ %          
システム (エラーコード) |          
システム (ウィンドウサイズ) .          
実行 #=1 R #=1 #=1 #=1 #=1
編集 10! 行 行置換 行置換 行置換 行置換 Screen
ソースファイル入力 >="x.x"          
ソースファイル出力 <="x.x"          
外部コマンドの実行 ,="x.x"          
プログラム終了 ~          
ファイル読み込み )="x.x"          
ファイル書き出し (="x.x"          


参考文献

ほとんど入手不可能かも知れませんが、一応。