開発 順序 | 言語と 開発状況 | 処理系の 大きさ | 可読性 | 実用性 | 個人的な感想と評価 | 本開発における 記述言語 |
1 | VTL 【java版 制作完了】 制作完了】 【C言語版 検討中】 | ◎ | × | × | とにかく小さい。オリジナルのMC6800版で768バイト! しかし、エラー処理が全くないので実用的でない。 塚越さんの文献ではVTLを大幅に拡張しているが、 そうすると、Tiny BasicやFORTHの方が魅力的だと感じる。 VTLの拡張は最小限にして使用したほうが むしろその特徴が発揮出来ると思う。 本開発ではアセンブラとマイクロエディタの制作に使用。 | (1)Java アセンブラ) (2)C言語 (3)機械語 |
2 | Tiny BASIC 【開発中止】 | 〇 | △ | △ | オリジナルのi8080版で2kバイト弱。 エラー処理があるので小さいプログラムなら、小回りがきく。 変数名が一文字とゆう制約があるため、 大きなプログラムの記述には向いてない。 | VTL |
3 | 仮想アセンブラ (仮称) 【β版完了】 | △ | FORTHを参考にして私(JH8CHU)が定義した
オリジナル言語。 原理的には比較的大規模なプログラムが記述出来る。 FORTH処理系を記述することが主な目的。 本開発ではH8版VTLの制作にも使用。 仮想機械(VM)上で動作する。 | VTL | ||
4 | FORTH 【β版完了】 | △ | △ | 〇? | たいへん柔軟性のある言語で、個人的には好きです。 FORTHの欠点のひとつはFATなど既存のファイル・システムとの 相性が悪いこと。また、コンパイルしたプログラムにアドレス依存性 があるなど、個性が強すぎる(?)ことです。 大きさはZ-80版で、8kバイト弱。 | 仮想機械 アセンブラ |
5 | SIMPL | △? | 〇 | 〇 | 知名度とゆう点では全くないと思いますが、 本開発案件の中では最も平均点が高いと考えています。 この後、応用プログラム開発は原則SIMPLを 使用することを想定しています。 | (1)FORTH (2)SIMPL |
6 | Tiny prolog (仮称) | 〇 | ? | △ | 特定用途(人工知能)の言語とゆう印象が強いかと思います。 ロボットへの応用のために将来的には開発予定です。 | SIMPL |
7 | Tiny LISP (仮称) | 〇? | ? | △? | LISPも特定用途(人工知能)の言語とゆう一面もあるようですが emacsなどにも仕様が組み込まれているので、汎用的な使い方も 可能ではないかと考え、開発を検討しています。 | SIMPL |
8 | Tiny C | × | 〇? | ◎? | 現段階では本当に開発するか、多少流動的です。 確かに知名度も高く、柔軟性も高いですが、C言語は 文法が汚いため処理系を相当大きくしないと実用的に ならないと思われます。 | SIMPL |
9 | Object- SIMPL (仮称) | ? | ? | ? | SIMPL言語にオブジェクト指向の仕様を追加します。 ネタは小暮裕明さんの「オブジェクト指向のすべて」 です。まだイメージの段階で具体的な実現方法の アイデアは少ないです。 | SIMPL VM-OS/4 |
No. | 記事 | 出版社 | 著者 | 原始言語 | 目的言語 | 記述言語 | 備考 |
1 | マイクロコンピュータ のプログラミング(1978) | 共立出版 | 石田晴久編 | Tiny BASIC | 【インタプリタ】 | 8080アセンブラ | - |
2 | コンパイラのうちとそと (1979) | 共立出版 | 島内、広瀬、 中田、筧、 佐久間 | bit-ALGOL | 仮想機械語 | bit-ALGOL | - |
3 | やさしいコンパイラ の作り方(1980) | 共立出版 | 中西正和、 大野義夫 | SIMPL | 仮想機械語 (BITCOM) | SIMPL | - |
4 | コンパイラ(1981) | 産業図書 | 中田育男 | ? | 仮想機械語 | Pascal風 | 難しくて私には さっぱり(^^; |
5 | マイコンピュータNo.3 すぐ動くFORTH(1981) | CQ出版社 | 原道宏 佐藤清忠 | FORTH | 【インタプリタ】 または スレーテッド・ インタプリティブ 言語 | FORTH、 Z80アセンブラ | コンパイラが自作 可能であることを この文献で知りました |
6 | 作りながら学ぶ マイコン設計 トレーニング(1983) | CQ出版社 | 神崎康宏 | Tiny BASIC | 【インタプリタ】 | Z80アセンブラ | No.1の機能拡張版 BASIC |
7 | コンパイラ(1985) | 昭晃堂 | 疋田輝雄 | Pascal-T | PDP-11 機械語 | Pascal | - |
8 | マイコンピュータNo.15 リスト処理とLISP の研究(1985) | CQ出版社 | 岡田哲哉 | LISP サブセット | 【インタプリタ】 | C言語 | - |
9 | 標準FORTH(1985) | 共立出版 | 井上外志雄 | FORTH | 【インタプリタ】 または スレーテッド・ インタプリティブ 言語 | FORTH、 8086アセンブラ | - |
10 | BASICで学ぶ PROLOGシステム (1986) | 啓学出版 | 市川新 | PROLOG | 【インタプリタ】 | BASIC | - |
11 | コンパイラの 理論と実現(1988) | 共立出版 | 疋田輝雄、 石畑清 | C言語 サブセット | 仮想機械語 (スタックマシン) | C言語 | - |
12 | オリジナル言語入門 (1988) | 電波新聞社 | 塚越一雄 | 拡張VTL98 | 【インタプリタ】 | 8086アセンブラ | オリジナルVTLは 究極 の極小仕様 インタプリタ |
13 | コンパイラ T、U(1990) | サイエンス社 | A.V.エイホ R.セシィ J.D.ウル フ 原田賢一訳 | C言語 Pascal(?) | 仮想機械語 (スタックマシン) | C言語 Pascal(?) | コンパイラの権威的な 文献らしい 2分冊だしぶ厚いので 易しいかとおもえば そんなことないと思う |
14 | オブジェクト指向 のすべて(1990) | CQ出版社 | 小暮裕明 | obj C | C言語 【プリプロセッサ】 | C言語 | C言語の プリプロセッサ |
15 | コンパイラ(1996) | 昭晃堂 | 辻野嘉宏 | Pascal風 言語Passy | MC680X0風 仮想機械語 | C言語 | - |
16 | コンパイラと バーチャルマシン (2004) | オーム社 | 今城、布広、 岩澤、千葉 | C言語 サブセット | Java VM | Java | - |
17 | スモールコンパイラ の制作で学ぶ プログラムのしくみ(2004) | 技術評論社 | 石田綾著 中田育男監修 | Cell (オリジナル) | Cell/VM (中間言語) | Java | - |
18 | いまどきの プログラム言語の 作り方(2005) | 毎日コミュニ ケーションズ | randy著 | (オリジナル) | 【インタプリタ】 | Java | - |
19 | コンパイラ入門(2006) | ソフトバンク | 冨沢高明著 | Pascalライク | マクロアセンブラ | C# | - |
20 | ふつうのコンパイラを つくろう(2009) | ソフトバンク クリエイティブ | 青木峰朗著 | C言語 サブセット | java | 8086 アセンブラ(?) | - |
21 | はじめてのコンパイラ 原理と実践(2007) | 共立出版 | 宮本衛市著 | C言語 サブセット | 仮想 マシン語 | C言語 | - |
22 | 明快入門コンパイラ インタプリタ開発(2010) | ソフトバンク クリエイティブ | 林晴比古著 | C言語 サブセット | 仮想スタック マシン | C言語 | - |
23 | 2週間でできる! スクリプト言語の作り方(2012) | 技術評論社 | 千葉滋著 | Java | 【インタプリタ】 | Stone | - |
24 | タイニーBASIC をCで書く(2016) | ソシム | 鈴木哲哉著 | BASIC | 【インタプリタ】 | C言語 | - |
25 | 関数型ブログラング の基礎(2016) | リックテレコム | 長瀬嘉秀監修 立川察理著 | ? | 【インタプリタ】 | JavaScript | - |
26 | まつもとひろゆき 言語のしくみ(2016) | 日経BP | まつもとひろゆき | Stream(未完成?) | 【インタプリタ】 | 【調査中】 |
著者は 言わずと知れた Rubyの制作者 |
27 | コンパイラ 作りながら学ぶ(2017) | オーム社 | 中田育男 | PL/0' | 仮想スタックマシン | C言語 |
1995年発行の改訂版 |
No. | 記事 | 出版社 | 著者 | 特徴 | 備考 |
1 | マイコンピュータNo.3 すぐ動くFORTH(1981) | CQ出版社 | 原道宏 佐藤清忠 | - | コンパイラが自作 可能であることを この文献で知りました |
2 | FORTH入門(1984) | 工学社 | レオ・ブロディー 原道宏訳 | - | - |
3 | パソコンのための FORTH(1985) | 啓学出版 | S・オーケイ 石井稔訳 | - | - |
4 | 標準FORTH(1985) | 共立出版 | 井上外志雄 | 実数演算 ラインエディタ 8080アセンブラ などのワード定義有り | - |
No. | 記事 | 出版社 | 著者 | 特徴 | 備考 |
1 | ガベージコレクション のアルゴリズム と実装(2010第3版) | 秀和システム | 中村成洋著 相川光著 竹内郁雄監修 | - | - |
項目 | 標準的なVTL | 本開発のVTL | 説明・記述例 | |
コマンド | リストの出力 | 0<Enter> | 0<Enter> | |
プログラムの削除 | &=<ユーザエリアの 先頭アドレス><Enter> | 【検討中】 | ||
プログラムの実行開始 | #=<行番号><Enter> | #=<行番号><Enter> | #=1 でBASICのRUNに相当する。 プログラムの途中から実行したい場合は、 その行番号を指定する。 | |
ディスクへのセーブ | (なし) | s | 変数pからの4kバイトを 変数qで示される論理セクタに 格納する。 | |
ディスクからのロード | (なし) | l (Lの小文字) | 変数qで示される論理セクタから 4kバイトを読み込み、 変数pで示されるメモリに格納する。 | |
リストの出力(拡張仕様) | (なし) | o (オウの小文字) | 変数[で示す行番号から変数]で示す 行番号までをリスト出力する。 | |
プログラム1行の構成 | <行番号><スペース1文字><文> | 1行の長さはシステムにより異なる。 | ||
行番号 | 1〜65535 | 1〜65535 | 0はリストの出力に使用される。 | |
文の構成 | <変数>=<式> | VTLはエラーチェックがないので =の部分は何でもよい。 | ||
変数 | 単純変数 | A〜Zの各1文字26種類 | ||
配列変数 | 次の形式で1次元配列が1種類使用できる。 :<添字>) | (例1) 代入 :5)=100 (例2) 参照 ?=:5) | ||
変数の型 | 2バイトの符号なし整数のみ。 | |||
文字の使用 | input | <変数>=$ | <変数>=$ 【仕様変更予定】 | |
output | $=<変数> | $=<変数> | 10進数表現による1文字のASCIIコードを CRTに表示 | |
文字列の使用 | 文字列を"で囲うことにより文字列を表現 できる。操作はCRTへの表示だけ。 | (例) ?="文字列" | ||
式 | ・優先順位は存在しない。 ・評価は、左から順に行われる。 ・()は優先される。 | (例1) | ||
算術演算 | 四則 | +-*/ | +-*/ | |
比較 | =,>,< | =,>,< | 1.>は≧のこと。 2.<は≦のこと。 3.結果は真なら1、偽なら0。 | |
文 | ? | ? | 文字列に限り;で改行を阻止できる。 ?=" " 改行させるのに使用 ?=*-& プログラムの大きさを知るのに使用 | |
INPUT | <変数>=? | <変数>=? | ||
GOTO | #=<行番号> | #=<行番号> | ||
サブルーチン | 呼び出し #=<行番号> リターン #=! | 呼び出し #=<行番号> リターン #=! | 呼び出しはGOTOと変わらない。 | |
IF | #=<行番号>*(<条件式>) | #=<行番号>*(<条件式>) | ||
乱数 | ' | ' | このシステム変数を参照すると 0〜65535の乱数が得られる。 | |
マシン語サブルーチン | >=<行番号> | 【検討中】 | ||
DATA | (なし) | DATA文の指定 ,=<行番号> DATAの読み出し <変数>=, | DATAは任意の1文字を区切り 文字として記述します。 【例】<行番号> 12,34,56 実行例はこちら。 | |
システム変数 | サブルーチンから 戻るときの行番号 | ! | ! | |
文字列を囲う | " | " | ||
行番号 | # | # | ||
文字用入出力 ターミナル | $ | $ | ||
除算の剰余 | % | % | ||
プログラム末 ポインタ | & | & | ||
乱数 | ' | ' | ||
メモリの最終番地 | * | * | ||
ユーザターミナル | ? | ? | ||
キャリッジ リターンなし | ; | ; | ||
マシン語サブルーチン の呼び出し | < | 【検討中】 | ||
(1)文字列入力の際の バッファのアドレス (2)配列をバイト アクセスする際の ポインタ | (なし) | ^ |
(例1) (例2) | |
配列をバイト アクセスする際の バイトデータ | (なし) | \ | (例)配列要素100に123を バイト・ライトする場合 ^=100 \=123 配列要素100のバイトデータを 変数Aに読み込む場合 ^=100 A=\ 実行例はこちら。 | |
s,lコマンドでメモリの 先頭番地を指定 | (なし) | p | ||
s,lコマンドで論理 セクタの番号を指定 | (なし) | q | ||
oコマンドでリスト出力の スタート行番号を指定 | (なし) | [ | ||
oコマンドでリスト出力の 最終行番号を指定 | (なし) | ] |
キーワード | 省略形 | 形式 | 機能 |
NEW | N. | NEW | プログラムをすべて消す |
LIST | L. | LIST[n] | プログラムを表示する |
RUN | R. | RUN | プログラムを実行する |
<文の並び> | <文>[; <文の並び>] | ||
キーワード | 省略形 | 形式 | 機能 |
LET | L. | [LET]<代入リスト> | 代入 |
P. | PRINT[<表示リスト>[ , ] | 表示 | |
INPUT | I. | INPUT<入力リスト> | 入力 |
GOTO | G. | GOTO<式> | 分岐 |
GOSUB | GOS. | GOSUB<式> | サブルーチンを呼出す |
RETURN | R. | RETURN | メインルーチンに戻る |
IF | IF | IF<式><式の並び> | 判定 |
FOR | F. | FOR<代入>TO<式>[STEP<式>] | ループ |
NEXT | N. | NEXT<変数> | ループ |
STOP | S. | STOP | 終了 |
REM | REM | REM<任意の文字列> | コメント |
<表示リスト> | <表示要素>[; <表示リスト>] | |
<表示要素> | <式> <ストリング> #<式> ← | 値を表示 文字列を表示 桁数を決める 同じ行の先頭から表示 |
<代入演算子> | 形式 |
キーワード | 省略形 | 形式 | |
RND | R. | RND(<式>) | 乱数を発生(1〜<式>) |
ABS | A. | ABS(<式>) | 絶対値 |
SIZE | S. | SIZE | メモリの残り(バイト) |
PEEK | P. | PEEK(<式>) | <式>で示すアドレスの内容を与える |
<変数> | <単純変数>|<配列> | |
<配列> | @(<式>) | 0≦<式>≦SIZE/2 |
<単純変数> | A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z |
組込み述語名 | 形式 | 説明 | |
入出力述語 | 入力 | inp(変項) | 項は変数。項に入力結果が代入される。 |
出力 | prt(変項) | 項は定項または変項。定項はそのまま、 変項は代入されているのが出力される。 | |
【検討中】 | 【検討中】 | ロボットへの応用のため入出力は拡張予定 | |
制御述語 | strong cut | ! | 評価中に後戻りが起きたとき、直ちに、これを 生成した述語自体を統一化したとする。 |
fail | fail | 無条件に統一化失敗とし、後戻りを起す。 | |
比較演算述語 | 数値比較 | eqn(項1,項2) |
項は数値に限る。=の数値比較をする。 得られた結果(真または偽)が述語の値となる。 |
nen(項1,項2) |
項は数値に限る。≠の数値比較をする。 得られた結果(真または偽)が述語の値となる。 | ||
ltn(項1,項2) |
項は数値に限る。<の数値比較をする。 得られた結果(真または偽)が述語の値となる。 | ||
len(項1,項2) |
項は数値に限る。≦の数値比較をする。 得られた結果(真または偽)が述語の値となる。 | ||
gtn(項1,項2) |
項は数値に限る。>の数値比較をする。 得られた結果(真または偽)が述語の値となる。 | ||
gen(項1,項2) |
項は数値に限る。≧の数値比較をする。 得られた結果(真または偽)が述語の値となる。 | ||
文字比較 | eqa(項1,項2) |
項は文字列に限る。=の内部の文字コードによる比較をする。 得られた結果(真または偽)が述語の値となる。 | |
nea(項1,項2) |
項は文字列に限る。≠の内部の文字コードによる比較をする。 得られた結果(真または偽)が述語の値となる。 | ||
lta(項1,項2) |
項は文字列に限る。<の内部の文字コードによる比較をする。 得られた結果(真または偽)が述語の値となる。 | ||
lea(項1,項2) |
項は文字列に限る。≦の内部の文字コードによる比較をする。 得られた結果(真または偽)が述語の値となる。 | ||
gta(項1,項2) |
項は文字列に限る。>の内部の文字コードによる比較をする。 得られた結果(真または偽)が述語の値となる。 | ||
gea(項1,項2) |
項は文字列に限る。≧の内部の文字コードによる比較をする。 得られた結果(真または偽)が述語の値となる。 | ||
算術演算子 | 加算 | add(項1,項2,項3) |
項1と項2は数値、項3は変項に限る。 項1と項2に指定された算術演算がなされ、 その結果が項3に代入される。 |
減算 | add(項1,項2,項3) | ||
乗算 | add(項1,項2,項3) | ||
除算 | add(項1,項2,項3) | ||
剰余 | add(項1,項2,項3) |
コマンド名 | パラメータ | 説明 |
save | ファイル名 | プログラム(ホーン節)をファイルに書き出す。 |
load | ファイル名 | ファイルからプログラムを読み込み、付け加える |
list | なし 節番号 | 最初のホーン節から20番目までを表示する。 節番号のホーン節から20番目までを表示する。 |
new | なし | プログラム領域を初期化する。 |
trace | 1 2 3 4 5 |
評価過程をトレースしない 探査の深さのトレースを表示する。 評価の結果を表示する。 統一化に成功したホーン節を表示する。 評価過程中の全ゴール節のトレースを表示する。 |
free | なし | ガーベジ・コレクションの起動および 空き領域の表示をする。 |
quit | なし | PROLOGの実行を終了する。 |
関数 | 機能 | 備考 |
car | リストを入力として与えると、 そのリスト最初の要素を取り出す | |
cdr | リストの最初の要素(つまり、car) を取り除いたリストを返す | |
cons | 片方をcar部、もう一方をcdr部とするリストを 出力する | |
atom | 入力がアトムかどうか調べる。 yesはt、noはnilで表される。 | |
equal | 2個の入力を取り、それらが等しければt、 異なるならばnilを返す | |
append | 与えられた引数を接続したリストを返す | |
null | 引数がnilならばt、そうでなければnilを返す | |
listp | 引数がリスト(空リストnilを除く)ならばtを返し、 そうでなれればnilを返す | |
nth | 2番目の引数として与えられたリストのn番目 (nは一番目の引数として与えられる)の要素を取り出す | |
reverse | 与えられたリストを逆順にしたリストを返す | |
length | リストの長さを数値で返す | |
eval | 引数をプログラムとみなしてそれを実行する | |
+, -, *, / | 加減乗除を行う | |
% | 割った余りを返す | |
min | 引数のうちで最小のものを返す | |
max | 引数のうちで最大のものを返す | |
abs | 引数の絶対値を返す | |
>, >=, !=, ==, <=, < | 数値同士の大小比較を行う |