新しく発言する EXIT インデックスへ
BASIC言語のコンパイラをつくる

  BASIC言語のコンパイラをつくる 山中和義 2007/01/29 22:20:11 
  当面の機能 山中和義 2007/01/29 22:21:30 
  │└更新 山中和義 2007/01/31 20:51:06 
  │ └リリースα版 山中和義 2007/02/02 16:24:55 
  │  └リリースα2版 山中和義 2007/02/05 16:37:26 
  とても期待しています。 唐瀬人 2007/02/05 17:02:38 
  │└お待たせしました。β版です。 山中和義 2007/02/11 16:58:37 
  │ └リリースβ2 山中和義 2007/02/14 21:47:59 
  │  └β2版、文字列変数部はうまく変換しに行っ... 唐瀬人 2007/02/17 14:18:25 
  γ版(DEF、FUNCTION、SUB) 山中和義 2007/02/27 19:41:37 
   └最新版はどこからダウンロードできますか? 唐瀬人 2007/03/13 10:00:28 
    └現状報告 山中和義 2007/03/14 11:44:35 

  BASIC言語のコンパイラをつくる 山中和義 2007/01/29 22:20:11  ツリーへ

BASIC言語のコンパイラをつくる 返事を書く ノートメニュー
山中和義 <drdlxujciw> 2007/01/29 22:20:11
簡単な実験で実現可能性が見えてきましたので、作っていきたいと思います。
気長にお待ちください。。。


●実装方式
コンパイラ
 ソースプログラム(記述はプログラム言語)から
 仮想マシン(VM)上のオブジェクトプログラム(記述はアセンブリ言語)を
 生成(コンパイル)する。
アセンブラとリンカ
 アセンブリ言語を機械語に変換して(アセンブル)、
 機械語で記述された入出力プログラム(ライブラリ)を組み込み(リンク)、
 実行可能プログラム(記述は機械語)をつくる。

具体的に、
 コンパイラ=十進BASICで記述する
 ソースプログラム=BASIC言語
 オブジェクトプログラム=x86アセンブリ言語
 仮想マシン=x86 CPU
 入出力プログラム=C言語で記述し、Cコンパイラでx86ネイティブコードの.LIBと.DLLファイルにしておく
 アセンブラ=ML.EXE(Microsoft Macro Assembler)
 リンカ=LINK.EXE(Microsoft Incremental Linker)
 実行可能プログラム=x86ネイティブコード
とする。


●ソースプログラムの例
ファイル名 test.bas
A=5.98
B=34.89
PRINT (A+B)*(B-23.0)
END


●オブジェクトプログラムの例
ファイル名 test.asm
;ml %1.asm /c /coff
;link %1.obj kernel32.lib iobas.lib /subsystem:console

.586
.model flat,stdcall

OutputFloat proto, x:QWORD ;iobas.lib
OutputString proto, msg:NEAR32
PauseProgram proto

ExitProcess proto NEAR32 stdcall, dwExitCode:DWORD ;kernel32.lib

CR equ 13 ;\n
LF equ 10 ;\r
TAB equ 9 ;\t


.data
eval dq 0 ;式の計算結果

_A dq 0 ;変数
_B dq 0

_TAB db TAB, 0 ;文字定数
_CRLF db CR,LF, 0

;ユーザ定義の定数
_c1 dq 5.98
_c2 dq 34.89
_c3 dq 23.0
_s1 db '計算結果=', 0 ;ASCIIZ

.code

mainCRTStartup proc
fld _c1 ;A=5.98
fstp _A

fld _c2 ;B=34.89
fstp _B

invoke OutputString, NEAR32 ptr _s1 ;printf("%s",&s1);

fld _A ;(A+B)*(B-23.0)
fld _B
fadd
fld _B
fld _c3
fsub
fmul
fstp eval

invoke OutputFloat, eval ;printf("%f",eval);
invoke OutputString, NEAR32 ptr _CRLF

invoke PauseProgram
invoke ExitProcess, 0
mainCRTStartup endp

end


●入出力プログラム
 iobas.lib、iobas.dllはVisualC++6で作成した。


●アセンブル、リンクの例
バッチファイル asm.bat
c:\masm\bin\ml %1.asm /c /coff
c:\masm\bin\link %1.obj kernel32.lib iobas.lib /subsystem:console /libpath:c:\masm\lib

DOSプロンプトで
 asm test [改行]


●実行可能プログラムの例
DOSプロンプトで
 test.exe [改行]

 ※iobas.dll(ランタイムルーチン)が必要。

  当面の機能 山中和義 2007/01/29 22:21:30  ツリーへ

Re: BASIC言語のコンパイラをつくる 返事を書く ノートメニュー
山中和義 <drdlxujciw> 2007/01/29 22:21:30
当面の機能
 DOSプロンプト上での実行可能なプログラム
 基本命令のサポート
  代入文、入出力文、制御文



●コンパイラ、入出力プログラムの入手先
http://www.urban.ne.jp/home/kz4ymnk/seminar/basic/bascom.lzh


●アセンブラ、リンカの入手先
http://www.masm32.com/

http://www.website.assemblercode.com/masm32/legacy.zip Windows9x,MEで動作を確認した。

  │└更新 山中和義 2007/01/31 20:51:06  ツリーへ

Re: 当面の機能 返事を書く ノートメニュー
山中和義 <drdlxujciw> 2007/01/31 20:51:06
更新
べき乗の計算に苦戦しています!

キーワード
・log2ベースで計算
・x^y=2^(log2(x)*y)=2^整数部分*2^小数部分


原型ができたので、あとはコツコツと作業するのみか!?
エラーチェックは最小限にしないとプログラムが肥大化してしまう。

  │ └リリースα版 山中和義 2007/02/02 16:24:55  ツリーへ

Re: 更新 返事を書く ノートメニュー
山中和義 <drdlxujciw> 2007/02/02 16:24:55
リリース α版

センター数学BASICの問題に出題される程度の文法をサポートしました。

アセンプリ言語の学習、コンパイラ入門の教材に利用してください。

  │  └リリースα2版 山中和義 2007/02/05 16:37:26  ツリーへ

Re: リリースα版 返事を書く ノートメニュー
山中和義 <drdlxujciw> 2007/02/05 16:37:26
リリースα2版

DATA,RESTORE,READ
GOSUB,RETURN
をサポートしました。

  とても期待しています。 唐瀬人 2007/02/05 17:02:38  ツリーへ

Re: BASIC言語のコンパイラをつくる 返事を書く ノートメニュー
唐瀬人 <lwqpflhmvc> 2007/02/05 17:02:38
とても期待しています。

(α2版では文字列変数部でコンパイルエラーになります。まだ未対応なんでしょうね。)

  │└お待たせしました。β版です。 山中和義 2007/02/11 16:58:37  ツリーへ

Re: とても期待しています。 返事を書く ノートメニュー
山中和義 <drdlxujciw> 2007/02/11 16:58:37
お待たせしました。β版です。

1週間悩んだ文字列処理がなんとか動作可能になりました。
まだまだ検討事項が山積みですが、、、
ランタイムルーチン(C言語記述 iobas.dll)もかなり大きくなってきました。

特に、数値式との排他、競合については難しいです。
現状、排他が主になっているので、
 IF A+B=0 THEN
 IF A$+B$="" THEN
 IF A+B$=0 THEN
のケースをどう判断させるか、迷っています。
PRINT文は、暫定的にSPRINT文でデバッグすることにしました。

 SPRINT "文字列",A$

この版ではPRINT文とSPRINT文と区別してください。


関数(DEF文、FUNCTION文)、SUB文もサポートしないと。。。

  │ └リリースβ2 山中和義 2007/02/14 21:47:59  ツリーへ

Re: お待たせしました。β版です。 返事を書く ノートメニュー
山中和義 <drdlxujciw> 2007/02/14 21:47:59
リリースβ2
通常のBASICの文法で文字列が処理できるようになりました。

あとはDEF、FUNCTION、SUB文ですか、、、

  │  └β2版、文字列変数部はうまく変換しに行っ... 唐瀬人 2007/02/17 14:18:25  ツリーへ

Re: リリースβ2 返事を書く ノートメニュー
唐瀬人 <lwqpflhmvc> 2007/02/17 14:18:25
β2版、文字列変数部はうまく変換しに行っています。CALL文で「○文字目に「=」がありません。(LET文)」と出ますが、今後SUB文のサポートとともに解決することでしょう。

  γ版(DEF、FUNCTION、SUB) 山中和義 2007/02/27 19:41:37  ツリーへ

Re: BASIC言語のコンパイラをつくる 返事を書く ノートメニュー
山中和義 <drdlxujciw> 2007/02/27 19:41:37
γ版(DEF、FUNCTION、SUB)
とりあえず、配列型の引数が未サポートのDEF、FUNCTION文。

これによって、最低限の組込み関数のみライブラリ化することになります。
コンパイラの特性上、この方が発展的です。(MathLib.BAS参照)

   └最新版はどこからダウンロードできますか? 唐瀬人 2007/03/13 10:00:28  ツリーへ

Re: γ版(DEF、FUNCTION、SUB) 返事を書く ノートメニュー
唐瀬人 <lwqpflhmvc> 2007/03/13 10:00:28
最新版はどこからダウンロードできますか?
http://www.urban.ne.jp/home/kz4ymnk/seminar/basic/bascom.lzh
からはできませんけど。

    └現状報告 山中和義 2007/03/14 11:44:35  ツリーへ

Re: 最新版はどこからダウンロードできますか? 返事を書く ノートメニュー
山中和義 <drdlxujciw> 2007/03/14 11:44:35
現状報告
ソースコードが4000行を越したので、見直しを兼ねて
1978年頃のBASIC向けに基本命令のバグ取りをしています。

http://www.urban.ne.jp/home/kz4ymnk/seminar/basic/startrek.lzh


問題点など
・SUB文の再帰呼び出しの実現が難しい
・学習教材の域を越えてしまった。かといって、実用的でもない。
・TinyBASIC(3000行)の拡張とするソースコードにしたい

以上、品質が保てませんので、FullBASIC系は開発ペンディング、非公開中です。


インデックスへ EXIT
新規発言を反映させるにはブラウザの更新ボタンを押してください。