JH8CHUのホームページ>Tiny コンパイラ/インタプリタ

Tiny コンパイラ/インタプリタ


時代錯誤とは知りつつ、コンパイラの自作に挑戦(2005/09/03)
Tiny Cの開発を一時凍結し(やっぱりな)、FORTHの立上げ検討(2006/11/25)
第一世代FORTHコンパイラの概略処理フロー作成(2006/11/30)
FORTH言語仕様としてプリミティブ一覧を掲載(2006/12/02)
Tiny BASIC処理系が小さいことを再評価し、開発項目に追加(2007/03/16)
再び、BASIC、FORTHの問題点に悩みSIMPLの採用を検討(2007/05/08)
FORTH立上げ計画を変更。(世代分けをやめ、仮想機械のアセンブラを利用(2008/11/14)
Tiny prologの組込み関数・コマンド仕様を記載(2009/07/10)
Tiny Lispの組込み関数仕様を記載(2009/07/18)
参考文献を更新(2009/08/29)
FORTHエディターワードの仕様掲載(2009/10/31)
参考文献追加。SIMPLの開発を止めて、FORTHでC言語処理系の開発を目指す。(2010/05/09)
Tiny Cの検討課題記載。システム記述、組込み用言語としてはやはり力不足。(2010/06/05)
参考文献を更新(2012/07/20)
開発計画を記載(2013/02/02)
VTLの言語仕様を記載(2013/02/06)
VTLの開発計画を修正(記述言語にVBAを追加)。(2013/12/29)
VTLのメモリ・マップを記載。言語の拡張仕様を追記(2014/06/14)
VBAでは処理が遅過ぎてTiny Basicが動作しないことが判明。開発中断し、計画見直し。(T_T) (2014/07/05)
VTLの開発計画を修正(記述言語をjavaに変更)。(2015/07/04)
VTLの仕様にDATA文実現のため、変数「,」を追加。(2015/09/12)
VTLの仕様に配列のバイト・アクセスのための変数「^」、「\」を追加。(2015/10/13)
Tiny BASICの制作を中止。アセンブラとエディタはVTLで記述することに変更。(2016/05/01)
VTLによるマイクロ・エディタ(β版)のソース公開。(2016/05/14)
開発ロードマップ修正。(2016/09/05)
参考文献を更新。。(2016/09/30)(2017/01/22)
開発ロードマップ修正。FORTH立ち上げ計画更新(2018/07/07)
進捗を反映(I2C-ROM接続完了。仮想機械版VTL制作完了。DRAM立ち上げ着手)(2018/09/08)
進捗を反映(H8マイコンDRAM起動完了。マイクロ・エディタ制作着手)(2019/05/04)
開発ロードマップ修正。H8版VTLは性能の問題からC言語に修正予定。(2020/12/17)
参考文献を追加。(2021/08/12)
  1. 開発計画

    1. 開発言語一覧
      (2013/12/29改)(2015/07/25改)(2016/05/01改)(2016/09/05進捗反映)
      以下の開発の中でVTLと仮想機械は他のツールで開発する必要があります。
      なお、VTLと仮想機械は同じ言語で記述する必要はありません。
      VTLは性能よりも作りやすさとコンパクトさが最重点となるので、今回はVBAjavaを用いて 開発しました。
      また、H8マイコン用のVTLはパソコン上で仮想機械で記述し、アセンブルした後、機械語で移植します。
      仮想機械はフィージビリ・スタディ用の版はC言語で記述しました。
      開発
      順序
      言語と
      開発状況
      処理系の
      大きさ
      可読性実用性 個人的な感想と評価本開発における
      記述言語
      1VTL
      【java版
       制作完了】
      【仮想機械版
       制作完了】

      【C言語版
      検討中】
      ×× とにかく小さい。オリジナルのMC6800版で768バイト!
      しかし、エラー処理が全くないので実用的でない。
      塚越さんの文献ではVTLを大幅に拡張しているが、
      そうすると、Tiny BasicやFORTHの方が魅力的だと感じる。
      VTLの拡張は最小限にして使用したほうが
      むしろその特徴が発揮出来ると思う。
      本開発ではアセンブラとマイクロエディタの制作に使用。
      (1)VBA
      (1)Java
      (2)(仮想機械
      アセンブラ)

      (2)C言語
      (3)機械語
      2Tiny BASIC

      【開発中止】
      オリジナルのi8080版で2kバイト弱。
      エラー処理があるので小さいプログラムなら、小回りがきく。
      変数名が一文字とゆう制約があるため、
      大きなプログラムの記述には向いてない。
      VTL
      3仮想アセンブラ
      (仮称)
      【β版完了】
       〇 △FORTHを参考にして私(JH8CHU)が定義した オリジナル言語。
      仮想アセンブラ以降の言語から、
      原理的には比較的大規模なプログラムが記述出来る。

      FORTH処理系を記述することが主な目的。
      本開発ではマイクロ・エディタの制作にも使用。
      本開発ではH8版VTLの制作にも使用。
      仮想機械(VM)上で動作する。
      Tiny BASIC
      VTL
      4FORTH

      【β版完了】
      〇? たいへん柔軟性のある言語で、個人的には好きです。
      FORTHの欠点のひとつはFATなど既存のファイル・システムとの
      相性が悪いこと。また、コンパイルしたプログラムにアドレス依存性
      があるなど、個性が強すぎる(?)ことです。
      大きさはZ-80版で、8kバイト弱。
      仮想機械
      アセンブラ
      5SIMPL△?知名度とゆう点では全くないと思いますが、
      本開発案件の中では最も平均点が高いと考えています。
      この後、応用プログラム開発は原則SIMPLを
      使用することを想定しています。
      (1)FORTH
      (2)SIMPL
      6Tiny prolog
      (仮称)
      特定用途(人工知能)の言語とゆう印象が強いかと思います。
      ロボットへの応用のために将来的には開発予定です。
      SIMPL
      7Tiny LISP
      (仮称)
      〇?△? LISPも特定用途(人工知能)の言語とゆう一面もあるようですが
      emacsなどにも仕様が組み込まれているので、汎用的な使い方も
      可能ではないかと考え、開発を検討しています。
      SIMPL
      8Tiny C×〇?◎? 現段階では本当に開発するか、多少流動的です。
      確かに知名度も高く、柔軟性も高いですが、C言語は
      文法が汚いため処理系を相当大きくしないと実用的に
      ならないと思われます。
      SIMPL
      9Object-
      SIMPL
      (仮称)
      SIMPL言語にオブジェクト指向の仕様を追加します。
      ネタは小暮裕明さんの「オブジェクト指向のすべて」
      です。まだイメージの段階で具体的な実現方法の
      アイデアは少ないです。
      SIMPL
      VM-OS/4


    2. 開発ロードマップ(2013/12/29改)(2014/06/14改)(2014/07/19改)(2015/07/25改)(2016/05/01改)
      (2016/11/20改)(2018/07/07改)(2018/09/08改)(2019/05/04改)(2020/12/17改)



  2. 参考文献

    (1)コンパイラ/インタプリタ参考文献一覧(2005/09/03)(2005/09/19改)(2005/12/03改)(2006/05/26改)(2009/08/29改)
    (2010/05/09改)(2012/07/20改)(2016/09/30改)
    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-TPDP-11
    機械語
    Pascal-
    8マイコンピュータNo.15
    リスト処理とLISP
    の研究(1985)
    CQ出版社岡田哲哉 LISP
    サブセット
    【インタプリタ】C言語-
    9標準FORTH(1985)共立出版井上外志雄 FORTH【インタプリタ】
    または
    スレーテッド・
    インタプリティブ
    言語
    FORTH、
    8086アセンブラ
    -
    10BASICで学ぶ
    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 CC言語
    【プリプロセッサ】
    C言語C言語の
    プリプロセッサ
    15コンパイラ(1996)昭晃堂辻野嘉宏 Pascal風
    言語Passy
    MC680X0風
    仮想機械語
    C言語-
    16コンパイラと
    バーチャルマシン
    (2004)
    オーム社 今城、布広、
    岩澤、千葉
    C言語
    サブセット
    Java VMJava-
    17スモールコンパイラ
    の制作で学ぶ
    プログラムのしくみ(2004)
    技術評論社 石田綾著
    中田育男監修
    Cell
    (オリジナル)
    Cell/VM
    (中間言語)
    Java-
    18いまどきの
    プログラム言語の
    作り方(2005)
    毎日コミュニ
    ケーションズ
    randy著(オリジナル)【インタプリタ】Java-
    19コンパイラ入門(2006)ソフトバンク冨沢高明著 PascalライクマクロアセンブラC#-
    20ふつうのコンパイラを
    つくろう(2009)
    ソフトバンク
    クリエイティブ
    青木峰朗著C言語
    サブセット
    java8086
    アセンブラ(?)
    -
    21はじめてのコンパイラ
    原理と実践(2007)
    共立出版 宮本衛市著C言語
    サブセット
    仮想
    マシン語
    C言語-
    22明快入門コンパイラ
    インタプリタ開発(2010)
    ソフトバンク
    クリエイティブ
    林晴比古著C言語
    サブセット
    仮想スタック
    マシン
    C言語-
    232週間でできる!
    スクリプト言語の作り方(2012)
    技術評論社 千葉滋著Java【インタプリタ】Stone-
    24タイニーBASIC
    をCで書く(2016)
    ソシム 鈴木哲哉著BASIC【インタプリタ】C言語-
    25関数型ブログラング
    の基礎(2016)
    リックテレコム 長瀬嘉秀監修
    立川察理著
    【インタプリタ】JavaScript-
    26まつもとひろゆき
    言語のしくみ(2016)
    日経BP まつもとひろゆきStream(未完成?)【インタプリタ】【調査中】 著者は
    言わずと知れた
    Rubyの制作者
    27コンパイラ
    作りながら学ぶ(2017)
    オーム社 中田育男PL/0'仮想スタックマシンC言語 1995年発行の改訂版


    (2)FORTH参考文献(年号は初版の年)(2005/09/19)
    No.記事出版社著者特徴備考
    1マイコンピュータNo.3
    すぐ動くFORTH(1981)
    CQ出版社原道宏
    佐藤清忠
    -コンパイラが自作
    可能であることを
    この文献で知りました
    2FORTH入門(1984)工学社レオ・ブロディー
    原道宏訳
    --
    3パソコンのための
    FORTH(1985)
    啓学出版S・オーケイ
    石井稔訳
    --
    4標準FORTH(1985)共立出版井上外志雄 実数演算
    ラインエディタ
    8080アセンブラ
    などのワード定義有り
    -

    (3)関連文献(2016/09/30)
    No.記事出版社著者特徴備考
    1ガベージコレクション
    のアルゴリズム
    と実装(2010第3版)
    秀和システム中村成洋著
    相川光著
    竹内郁雄監修
    --

    (4)参考サイト
    1. VTL(Very Tiny Language)の作成

      本開発におけるVTLについては、このサイトのC言語のソースを参考にしました。

  3. VTL

    1. 簡単な紹介
      知名度が低いと思いますので、簡単な紹介をします。
      • VTLとは、Very Tiny Languageの頭文字です。
      • Tiny BASICのようなインタプリタ言語です。行番号を持ちます。
      • 変数名は1文字のみです。(A〜Z)
      • 一部の特殊文字も変数ですが、特別な機能があります。(言語仕様参照)
      • 基本的に代入文しかありません。しかし、分岐・判定・サブルーチンなどが可能です。
      • エラー処理は全くありません。(これが言語仕様です) (^^;

    2. 開発の目的
      本サイトにおけるVTLの開発目的は下記のふたつです。
      (1)Tiny Basicの作成を目的とします。
      しかし、本来インタプリタでインタプリタを記述しても全然ウレシくありません。
      今回VTLを開発する目的は

      (1)マイクロエディタと仮想機械用のアセンブラ作成を目的とします。

      (2)オリジナルCPUに移植して、クロス・コンパイラを用いることなく、
       オリジナルCPUのソフトウェア開発環境を立ち上げる。
       そのために、まずPC上で仮想機械のアセンブラを実現した後、
       オリジナルCPUに機械語を移植する。

    3. 言語仕様(2014/06/14改)(2014/06/15改)(2015/07/25改)
      項目標準的な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。
      PRINT  ? ? 文字列に限り;で改行を阻止できる。
      ?=" " 改行させるのに使用
      ?=*-& プログラムの大きさを知るのに使用
      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コマンドでリスト出力の
      最終行番号を指定
      (なし)] 

    4. VTLの問題点と対策
      VTLの拡張仕様、および
      VTLの問題点と対策はこちらに記載。(2015/09/16)

    5. メモリ・マップ
      VTLのメモリマップはこちらに記載。(2015/09/12)

    6. サブルーチンの共通仕様
      サブルーチンの共通仕様はこちら【工事中】に記載。

    7. Javaによる実装
      Javaによる実装の詳細はこちら。【工事中】

    8. H8マイコン上で動作させるためのハードウェア環境
      詳細はこちら。【工事中】

    9. 仮想機械による実装
      仮想機械による実装の詳細はこちら。【工事中】

    10. マイクロ・エディタ
      マイクロ・エディタのプログラムはこちら。(2016/05/14) NEW !

      肝心のVTLのソース・プログラムをまだ公開出来ていませんが・・・。(^^;

      マイクロ・エディタの実行中の様子です。


    11. 参考〜実行例

  4. Tiny Basic (制作中止)

    1. 設計目標
      • パソコン上で実行出来ること
        パソコン上で実行するために、VTLにて記述する。(2014/04/16)

      • ロボットに搭載できること(ディスク(CF, IIC ROM等)接続要)(2014/04/16)
      • 第1世代FORTH処理系を記述出来ること。
      • VTLで記述出来ること。このために、必要があれば、VTLの仕様を拡張する。(2014/06/22)
      • 仮想アセンブラを記述出来ること。
      • ライン・エディタを記述出来ること。

    2. 言語仕様
      • コマンド
        キーワード省略形形式機能
        NEWN.NEWプログラムをすべて消す
        LISTL.LIST[n]プログラムを表示する
        RUNR.RUNプログラムを実行する

      • <文の並び><文>[; <文の並び>]
        キーワード省略形形式機能
        LETL.[LET]<代入リスト>代入
        PRINTP.PRINT[<表示リスト>[ , ]表示
        INPUTI.INPUT<入力リスト>入力
        GOTOG.GOTO<式>分岐
        GOSUBGOS.GOSUB<式>サブルーチンを呼出す
        RETURNR.RETURNメインルーチンに戻る
        IFIFIF<式><式の並び>判定
        FORF.FOR<代入>TO<式>[STEP<式>]ループ
        NEXTN.NEXT<変数>ループ
        STOPS.STOP終了
        REMREMREM<任意の文字列>コメント

      • 表示リスト
        <表示リスト><表示要素>[; <表示リスト>]
        <表示要素><式>
        <ストリング>
        #<式>
        値を表示
        文字列を表示
        桁数を決める
        同じ行の先頭から表示

      • 入力リスト
      • 代入リスト
      • ストリングス
      • 演算子、符号
        <代入演算子>形式

      • 関数
        キーワード省略形形式
        RNDR.RND(<式>)乱数を発生(1〜<式>)
        ABSA.ABS(<式>)絶対値
        SIZES.SIZEメモリの残り(バイト)
        PEEKP.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 

    3. メモリ・マップ

    4. VTLによる実装
      VTLによる実装はこちら。(工事中)

    5. プログラム例


  5. 仮想機械とアセンブラ


  6. FORTH

    1. 特徴
      • スタック演算
      • 逆ポーランド記法
      • コンパイラとインタプリタのふたつのモード
      • ワード定義によるプログラミング
      • 拡張性(ユーザ定義のワードと予め定義済みのワードの区別なし)
      • 中間言語

    2. 立上げ計画(2008/11/14更新)(2018/7/7更新)


        (1)VTLソースをjavaで記述。【完了】
        (2)VTLソースをjavacでコンパイル。VTLがPC上で動作。【完了】
        (3)VTLでアセンブラ(とライン・エディタ)を記述。アセンブラ動作。【完了】
        (4)仮想機械ソースをjavaで記述。【完了】
        (5)仮想機械ソースをjavacでコンパイル。仮想機械動作。【完了】
        (6)アセンブラでFORTHのソースを記述。【完了】
        (7)FORTHのソースをアセンブル。【完了】
        (8)パソコンの仮想機械上でFORTH動作。【完了】
        (9)VTLソースをアセンブラで記述。【完了】
        (10)VTLソースをアセンブル。【完了】
        (11)仮想機械版VTLがPC上で動作。【完了】
        (12)H8用仮想機械ソースをC言語で記述。【完了】
        (13)H8用仮想機械ソースをgccでコンパイル。【完了】
        (14)H8用仮想機械とVTLをH8のROMに書き込み。VTL動作【完了】
        (15)H8用VTLでアセンブラ(とライン・エディタ)を記述。アセンブラ動作。【制作中】
        (16)H8用アセンブラでFORTHのソースを記述。<未着手>
        (17)H8用FORTHのソースをアセンブル。<未着手>
        (18)H8の仮想機械でFORTH動作。<未着手>

    3. VM-FORTHメモリマップ(工事中)

    4. VM-FORTHワード仕様(工事中)

    5. FORTHワード仕様相違(工事中)

    6. 仮想機械アセンブラ(工事中)によるインプリメント
      • メモリ・マップ
      • レジスタの配置
      • ソース・プログラム
      • 仮想機械(f-code)アセンブラによる実装の詳細は工事中。<2016/11/30>

    7. FORTHエディタ
      (1)エディターの仕様は こちら。(2009/10/31)
      (2)仮想機械アセンブラによる定義は工事中。
      (3)FORTHよる定義は工事中。

    8. 応用プログラム
      • ファイル・システム
        実装検討中。(2017/1/28)
      • SIMPL
        本ページのSIMPLを参照してください。

    9. 参考〜動作中のFORTHの画面(新版)
      (1)VLISTによりFORTHワードの一覧を表示


      (2)FORTHエディターの画面



  7. SIMPL

    Tiny C言語コンパイラが完成するまで、SIMPLを主に使用することを想定する。
    FORTHでC言語のコンパイラを記述し、SIMPLは使用しない方向としたい。<2010/05/09)
    FORTHでSIMPLのコンパイラを記述し、以降のシステムは原則SIMPLで記述する。(2014/03/16)
    1. 立ち上げ手順(2016/11/30)
      STEP1:FORTHでデファクト・ファイル・システムを記述する。
      STEP2:FORTHでSIMPLコンパイラを記述する。
         ソースとオブジェクトはデファクト・ファイル・システムに置く。
      STEP3:SIMPLでSIMPLを記述する。
      STEP4:FORTHによるSIMPLコンパイラでSIMPLをリコンパイルし仮想機械によるSIMPLコンパイラを得る。
    2. 言語仕様
    3. FORTH言語によるインプリメント
    4. SIMPL言語によるインプリメント
    5. C言語によるインプリメント(止める方向) →止める。(2016/11/30)
    6. 検討課題
      • メモリ管理方法

  8. Tiny Prolog (インタプリタ)

    1. 設計目標
      • basic-prologをベースに機能拡張を行う。
      • ロボットの知識処理への応用の可能性を探る。
      • 数学定理の自動証明の実験を行う。

    2. 言語仕様
      • 組込み関数
        組込み述語名形式説明
        入出力述語 入力inp(変項)項は変数。項に入力結果が代入される。
        出力prt(変項)項は定項または変項。定項はそのまま、
        変項は代入されているのが出力される。
        【検討中】【検討中】ロボットへの応用のため入出力は拡張予定
        制御述語 strong cut !評価中に後戻りが起きたとき、直ちに、これを
        生成した述語自体を統一化したとする。
        failfail無条件に統一化失敗とし、後戻りを起す。
        比較演算述語 数値比較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なしプログラム領域を初期化する。
        trace1
        2
        3
        4
        5
        評価過程をトレースしない
        探査の深さのトレースを表示する。
        評価の結果を表示する。
        統一化に成功したホーン節を表示する。
        評価過程中の全ゴール節のトレースを表示する。
        freeなしガーベジ・コレクションの起動および
        空き領域の表示をする。
        quitなしPROLOGの実行を終了する。

    3. 実装
      当面FORTHで記述することを考えるが、出来ればSIMPLで記述したい。
      当面FORTHで記述することを考えるが、出来ればC言語で記述したい。(2010/05/09)
      prologの処理系はSIMPLで記述する。(2014/03/16)

      • データ構造【配列名は暫定仕様】
        • ホーン節ベース
          文字配列H$はホーン節ベースであり、個々の要素には
          入力順にホーン節が登録される。
        • 探索空間
          文字配列S$は探索空間であり、スタック的な使い方が
          される。評価中に、この内容は動的に変化する。
          入力されたホーン節は、内部表現形式に変換されて、
          S$(0)に代入される。統一化に成功して内部生成される
          ゴール節は、順次、高番地に向かってS$に一時的に
          保存される。
        • 制御スタック
          制御スタックは、CG(MCS)、CL(MCS)、CH(MCS)より
          構成される。CG(i)、CL(i)、CH(i)が一組となって
          後戻り制御ために使われる。
        • ULレジスタ
          制御スタックの最新位置を示すポインタ。
        • Uレジスタ
          原則としてULレジスタと同値である。
          ストロング・カット述語時のみULレジスタとUレジスタは
          同期しなくなる。【以下、後報】
      • グローバル変数
        • MHC
          ホーン節のデータ・ベースの大きさを定める。
        • MCS
          制御スタックの大きさを定める。
        • GA
          探査空間の大きさを定める。
      • 処理フロー
        【後報】
      • ブロック処理
        【後報】
      • サブルーチン
        • UP ATOM
        • UP TERM
        • VARIABLE RENAMING
        • strong cut
        • COMMAND EXECUTION

    4. 実行例


  9. Tiny MM-Lisp (インタプリタ)

    1. 設計目標
      • 文献No.8のLispをベースに機能拡張を行う。

    2. 言語仕様
      • 組込み関数
        関数機能備考
        carリストを入力として与えると、 そのリスト最初の要素を取り出す 
        cdrリストの最初の要素(つまり、car) を取り除いたリストを返す 
        cons片方をcar部、もう一方をcdr部とするリストを 出力する 
        atom入力がアトムかどうか調べる。 yesはt、noはnilで表される。 
        equal2個の入力を取り、それらが等しければt、 異なるならばnilを返す 
        append与えられた引数を接続したリストを返す 
        null引数がnilならばt、そうでなければnilを返す 
        listp引数がリスト(空リストnilを除く)ならばtを返し、 そうでなれればnilを返す 
        nth2番目の引数として与えられたリストのn番目
        (nは一番目の引数として与えられる)の要素を取り出す
         
        reverse与えられたリストを逆順にしたリストを返す 
        lengthリストの長さを数値で返す 
        eval引数をプログラムとみなしてそれを実行する 
        +, -, *, /加減乗除を行う 
        %割った余りを返す 
        min引数のうちで最小のものを返す 
        max引数のうちで最大のものを返す 
        abs引数の絶対値を返す 
        >, >=, !=, ==, <=, <数値同士の大小比較を行う 

    3. 実装
      当面FORTHで記述することを考えるが、出来ればSIMPLで記述したい。
      当面FORTHで記述することを考えるが、出来ればC言語で記述したい。(2010/05/09)
      LISPの処理系はSIMPLで記述する。(2014/03/16)

    4. 実行例


  10. Tiny Cコンパイラ

    1. 設計目標
      • パソコン上で実行出来ること
      • ロボットに搭載できること (ディスク(CF, IIC ROM等)接続要)
      • オブジェクトは、パソコン上でもロボット上でも再コンパイルすることなしに 実行できること。
        ただし、I/Oに依存するものを除く。
      • オブジェクトは中間コードとする。 中間コード(仮想機械)は インタプリタにより実行する。
      • 最初のバージョンはOS/4の上でFORTHで記述する。(2010/05/09)
      • OS/5上では、C言語自身で記述することを目標とする。(2010/05/09)
      • コンパイラの名称は、VM-C言語(仮称)とする。(2010/05/09)

    2. 検討課題(2010/06/05)
      • 番地渡し
        Tiny Cでは番地渡しが出来ない。SIMPLは出来る。
      • char型変数
        Tiny Cではchar型変数をサポートしていない。
        文字列処理のためには、char型は必須。SIMPLもchar型はない。
        逆に、SIMPLの実数型は当面必要ない。
      • 構造体
        Tiny Cでは構造体がサポートされていない。
        1次元配列で当面代用出来そうだが、配列を引数に渡せない。
        SIMPLも構造体はないが、配列を番地渡しできる。

    3. 言語仕様

    4. 字句解析


    5. 構文解析
    6. 意味解析
    7. 中間コード仕様(仮想機械)
    8. コード生成
    9. 中間コードインタプリタ
    10. 仮想OS


  11. 開発動機




JH8CHUのホームページ>Tiny コンパイラ/インタプリタ


Copyright (C)2005-2010, 2013-2021 Masahiro.Matsuda(JH8CHU), all rights reserved.