Monday 20 August 2018

forth

sbc09 に付いていたので。stack base の言語で、PostScript の先祖です。Moore が作ったもの。Stack base ってのは Java のbyte codeも同じ。Javaの先祖でもあるな。

compiler 込みな言語かつ、自身の書き換えが可能な「最初の reflective な言語」です。実装もcompact。天文所とかでマイクロコンピュータでの望遠鏡制御とかに使われていたらしい。

  1 1 + .

が「1と1を足して表示する」。日本語と同じってわけですね。1 1 で二つ1をstackにpushして、+ でstack top に2が入り、それを . で表示します。Java のbyte codeもこんな感じ。

:でプログラムに名前を付けて、それが辞書に登録されます。この辺はPostScriptがそのままパクった。

おそるべきことにアセンブラのソースコードそのものもforthとして記述できる。

  CODE KEY ( --- c)
   JSR 0
   CLRA
   STD ,--S
   NEXT
  END-CODE

とかが書いてあって、これをそのままforthのcross assembblerがバイナリに変更して、forth interpreterそのものを作るってわけ。

ところが、出力コードは

  JMP [,Y++]

とかの塊なので、os9用にPICにするのは不可能。なので、前田さんが言ってたように level 2 で64k 確保して動かす方式を使ってみました。

sbc09 のIO routineって、address 0 からなのな。その辺を設定して S rec format の forth kernel をloadする感じ。

実際に実行してみると、ほとんどは stack のお手玉をやってる感じでくそ遅そう。JIT compiler でもあれば。もちろん、8bit CPUでは無理ですが。

  x=0f9d y=8000 u=1d55 s=7bfc a=1c b=1b cc=80 dp=00 pc=155C: BD 04 0C    JSR     $040C
  x=0f9d y=8000 u=1d55 s=7bfa a=1c b=1b cc=80 dp=00 pc=040C: EF A3     STU     ,--Y
  x=0f9d y=7ffe u=1d55 s=7bfa a=1c b=1b cc=80 dp=00 pc=040E: EE E1     LDU     ,S++
  x=0f9d y=7ffe u=155f s=7bfc a=1c b=1b cc=80 dp=00 pc=0410: 37 80     PULU    PC
  x=0f9d y=7ffe u=1561 s=7bfc a=1c b=1b cc=80 dp=00 pc=14D6: BD 04 0A    JSR     $040A
  x=0f9d y=7ffe u=1561 s=7bfa a=1c b=1b cc=80 dp=00 pc=040A: 37 80     PULU    PC
  x=0f9d y=7ffe u=1563 s=7bfa a=1c b=1b cc=80 dp=00 pc=07D1: EC F4     LDD     [,S]
  x=0f9d y=7ffe u=1563 s=7bfa a=1d b=55 cc=80 dp=00 pc=07D3: ED E4     STD     ,S
  x=0f9d y=7ffe u=1563 s=7bfa a=1d b=55 cc=80 dp=00 pc=07D5: 37 80     PULU    PC
  x=0f9d y=7ffe u=1565 s=7bfa a=1d b=55 cc=80 dp=00 pc=0523: EC E1     LDD     ,S++
  x=0f9d y=7ffe u=1565 s=7bfc a=1d b=55 cc=80 dp=00 pc=0525: ED A3     STD     ,--Y
  x=0f9d y=7ffc u=1565 s=7bfc a=1d b=55 cc=80 dp=00 pc=0527: 37 80     PULU    PC
  x=0f9d y=7ffc u=1567 s=7bfc a=1d b=55 cc=80 dp=00 pc=054E: 1F 40     TFR     S,D
  x=0f9d y=7ffc u=1567 s=7bfc a=7b b=fc cc=80 dp=00 pc=0550: ED E3     STD     ,--S

入力行の処理の辺りで手間取りましたが、久しぶりにS record入力とかを書いたのが面白かった。

forthの実装は、もう少し調べてみるかな。

  OS9:sbc09 ../../../examples_forth/kernel09
  Welcome to Forth
  sbc09 ../../../examples_forth/kernel09
  Error -13 sbc09
  Welcome to Forth
  : OUTMATH      \ Output a mathematical calculation

    ." We will now calculate: (2 + 3) * 5" CR

    2 3 + 5 *

    ." This equals: " . CR ;
  OK
  OUTMATH
  We will now calculate: (2 + 3) * 5
  This equals: 25
  OK
  2 3 + 5 *
  OK
  .
  25 OK

No comments: