コンパイラ完成
ついにコンパイラが完成しました。さっそく、これをコンソールモードで実行ファイルにしましょう。まずVEFBLフォルダの中に、新たに「build」フォルダを作ります。その「build」フォルダに、「iolib.dll」をコピーします。次にコマンドラインから開き、cdコマンドを使いながら、「build」フォルダをカレントディレクトリにします。移動が終わってもコンソールは閉じないでおいてください。
VEFBL初コンパイル
いよいよコンパイルです。「build」フォルダの中に「test1.txt」を新規作成し、以下の通りに記述します。
print "Hello Word!"
このプログラムはどんな事をするか、予想つきますよね? それでは、先ほどカレントディレクトリを「build」フォルダに変更した状態のコンソールに、以下のコマンドを打ち込みます。
..\build.exe test1.txt
さぁ、コンパイルされたようです。エクスプローラから作成されたアセンブリファイルの内容を見るのもめんどうなので、コマンドプロントから見てしまいます。以下のコマンドを実行します。
type test1.txt.asm
typeコマンドを実行すると指定したファイルの内容を表示することができます。すると次のような実行結果が表示されます。
.586 .model flat, stdcall include iolib.inc includelib iolib.lib include kernel32.inc includelib kernel32.lib .data STR0 db "Hello Word!", 0 .code _start: invoke OutputString, offset STR0 invoke ExitProcess, 0 end _start
まさに、これが出力したアセンブリの内容です。では、今度はアセンブルをしてみます。アセンブルのやり方は、さっきのやり方と同じです。
..\astest test1.txt
これは奇妙な感じがしますね。「test1」に「.txt」の拡張子が付いているので、まるで「test1.txt」をアセンブルしているようです。この問題は、コンパイラがアセンブリを保存したファイル名が原因なのですが、この問題の解消は後回しにします。実行結果は次のようになります。
C:\Documents and Settings\????????\My Documents\samples\codezine\vefbl \build>Microsoft (R) Macro Assembler Version 6.14.8444 Copyright (C) Microsoft Corp 1981-1997. All rights reserved. Assembling: C:\Documents and Settings\????????\My Documents\samples\c odezine\vefbl\build\test1.txt.asm Microsoft (R) Incremental Linker Version 5.12.8078 Copyright (C) Microsoft Corp 1992-1998. All rights reserved. 以下のプロジェクトファイルを生成しました test1.txt test1.txt.asm test1.txt.exe test1.txt.obj
きちんとアセンブルできました。では、実行ファイルを起動してみましょう。実行は「以下のプロジェクトファイルを生成しました」のリストにある、実行ファイルを表す拡張子「.exe」の文字列をそのまま記述すればOKです。
test1.txt.exe
すると、
Hello Word!
と表示されます。もし「iolibがありません」と言われた方は、またしてもコピーを忘れたのだと思われます。コピーしてから再度実行してみてください。
やっとコンパイラが作成し、そのコンパイラでコンパイルしたVEFBLプログラムが実行できました。これを作るまで、長い道のりでしたが、「これで終わりですね」ではなく「これから」なのです。今後、変数の操作、条件分岐、繰り返しについて一通りの実装をします。ですが、それらは次回以降に回すとして、作られたファイルの解説をします。
作成されたファイル
コンパイルやアセンブルを実行してきて、出てきたいくつかのファイルがあります。
test1.txt test1.txt.asm test1.txt.obj test1.txt.exe
「test1.txt」はVEFBLスクリプトで、「test1.txt.asm」はコンパイラが作ったアセンブリ、「test1.txt.exe」は実行ファイルです。では、残りの1つは何でしょうか。
OBJファイル
これは、オブジェクトといい、アセンブリをそのまま機械語にしたものです。ただ、これだけではプログラムは実行できません。なぜならこれは、アセンブリで書かれた部分だけを機械語にしたもので、アセンブリからインクルードされている「user32.lib」などは含まれていないからです。
そのため、OBJファイルはリンクを行います。リンクとは、いくつかの機械語のファイルを結合することで、これにより実行ファイルができあがるのです。
回末後記
今回の回想
長い間、いろいろ一生懸命になって準備して、ようやくコンパイラができました。といっても、出力するアセンブリは文字をコマンドプロンプト画面上に表示するものだけです(厳密に言うとメッセージボックスも表示できるのですが)。
次回予告
次回は、メッセージボックスのタイトルを指定できるようにしたり、VEFBLで変数が使えるようにしたりします。また、余裕があれば、汎用プログラムによく使われるWin32APIも次々と実装していきたいと思います。
