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 | |
└現状報告 山中和義 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系は開発ペンディング、非公開中です。 |