rvtlcについて
rvtlc は Tiny BASIC系の rvtl のコンパイラです。rvtlc は、rvtlで 書かれたrvtlc自身のソース(rvtlc.vtl)をコンパイルできます。
rvtlc はrvtlのソースをコンパイルして直接 Linux の実行ファイルを 出力します。したがってリンカ(ld)もアセンブラも不要です。 出力された実行ファイル はそのファイル単独で動作し、libc等の 共有ライブラリは不要です。rvtlc自身も単独で動作します。 インタープリタ(rvtl)で実行するより、20-100倍高速化されます。
rvtlc は i386(x86)専用です。PowerPCやARMが動作する Linux 用の rvtlでは動作(クロスコンパイル)しません。
ダウンロード
rvtlc-1.02.tar.gz (84KB 2010/03/03)
ファイル
README.TXT | このファイル |
rvtlc | コンパイル済みコンパイラ(実行ファイル) |
rvtlc.vtl | コンパイラのソース |
rt.bin | rvtlc.vtl用ランタイムライブラリ |
runq.vtl | コンパイル用ツール |
Makefile | rvtlc 自身のコンパイル用 |
copying | GNU General Pulic Licence |
gpl.text | GPLの日本語訳 |
rtl_source | ランタイムライブラリのソース |
前バージョンからの変更
前バージョン(2006/05/16版)からの変更点です。
- linux-2.6 の Address Space Layout Rondomization に対応
- ランタイムライブラリをrvtlcに組み込み
- 式の評価(16進数)で発生する変数スタックの不一致を修正
- % を参照するとエラーとなるバグを修正
- ランタイムライブラリの初期化時の不具合を修正
コンパイラの使用方法
例えば mycode.vtl というrvtlのソースプログラムをコンパイルする には 、以下のように実行します。
jun@ubuntu910:~/rvtlc-1.02$ ./rvtlc mycode.vtl
rvtlc のみをパスの通ったディレクトリ(例えば /usr/local/bin)に コピーすれば、どのディレクトリからでも「rvtlc ソースファイル」と 入力するだけで rvtl のソースをコンパイルして実行ファイルを作成 できます。
jun@ubuntu910:~/rvtlc-1.02$ sudo make install
を実行すると、/usr/local/bin にコピーされます。
または、rvtl-3.04 が使用できる環境では以下のようにコンパイラの ソースを使ってもコンパイルできます。rvtlc.vtl を使う場合は rvtlc.vtlとランタイムライブラリである rt.bin は同じディレクトリに おく必要があります。rvtlc を使う場合は rvtlcの内部にrt.bin が 組み込まれているため、rvtlc単独で使用できます。
jun@ubuntu910:~/rvtlc-1.02$ rvtl rvtlc.vtl - mycode.vtl
カレントディレクトリに mycode.elf というファイルができます。 これは実行可能なファイルになっていて、./mycode.elf として 実行できます。
mycode.vtl を次の内容のファイルとします。
100 "My first program." / 110 #=-1
mycode.vtl をコンパイルします。
jun@ubuntu910:~$ rvtlc mycode.vtl rvtlc : rvtl compiler v.1.02 2010/03/03 (C) Jun Mizutani read 2 lines Get library 5288bytes from compiler. file : mycode.elf 5630 bytes header size 128 library size 5288 code size 104 code starts from 0x080494A8 code ends at 0x0804950F Source Lines 2 Source Labels 0 File Name mycode.elf File Size 5630 heap size free : 697260 / 1048576 bytes To check code, run : objdump -d --start-address=0x080494A8 mycode.elf time:0.000353sec
5630バイトの実行ファイルが 3.5msec で作成できました。 最近の PC では1秒間に3万行程度の速度でコンパイル可能です。
この mycode.elf 実行して確認します。
jm:~/rvtlc$ ./mycode.elf My first program.
この mycode.elf は Linux が動作する環境ならばどのPCでも実行できます。 objdump -d --start-address=0x080494A4 mycode.elf を実行するとコンパイル されたファイルを逆アセンブルできます。
コンパイラのコンパイル方法
rvtlc はLinuxのディストリビューションの種類にかかわらず動作しますが、 rvtlc を改造するなど、rvtlc自身をコンパイルするには rvtl のインター プリタである rvtl-3.04 以降をインストールする必要があります。
cd rvtlc-1.02 make
【実行例】
jun@ubuntu910:~/rvtlc-1.02$ make rvtl rvtlc.vtl runq.vtl - rvtlc.vtl rvtlc : rvtl compiler v.1.02 2010/03/03 (C) Jun Mizutani read 2241 lines Get library 5764 bytes from 'rt.bin'. file : rvtlc.elf 47306 bytes Change Permission header size 128 library size 5288 code size 41780 code starts from 0x080494A8 code ends at 0x080537DB Source Lines 2241 Source Labels 164 File Name rvtlc.elf File Size 47306 heap size free : 610180 / 961496 bytes To check code, run : objdump -d --start-address=0x080494A8 rvtlc.elf time:1.226030sec mv rvtlc.elf rvtlc
コンパイルしてできたコンパイラで rvtlc.vtl を実際にコンパイルしてみます。
jun@ubuntu910:~/rvtlc-1.02$ ./rvtlc rvtlc.vtl rvtlc : rvtl compiler v.1.02 2010/03/03 (C) Jun Mizutani read 2241 lines Get library 5288bytes from compiler. file : rvtlc.elf 47306 bytes header size 128 library size 5288 code size 41780 code starts from 0x080494A8 code ends at 0x080537DB Source Lines 2241 Source Labels 164 File Name rvtlc.elf File Size 47306 heap size free : 697260 / 1048576 bytes To check code, run : objdump -d --start-address=0x080494A8 rvtlc.elf time:0.068122sec
自分自身をコンパイルできることを確認できます。コンパイル速度も20倍 近く高速になるのが確認できます。
rvtlc-1.02のディレクトリに移動し、make でrvtlc.vtl はコンパイル され、rvtlc.elf という実行ファイルが出来上がります。rvtlc は こうして作成した rvtlc.elf をリネームしたものです。
ランタイムライブラリの作成方法
ランタイムライブラリのアセンブルには rvtl-3.04 と nasm が インストールされている必要があります。
cd rvtlc-1.02/rtl_source make
を実行すると、rt.bin ができます。make install すると rt.bin は rvtlc-1.02直下にコピーされます。
rvtlcの出力ELFバイナリのメモリマップ
: : +---------------------------------------+ 0x08048000 .text | ELF Header領域 | +---------------------------------------+ 0x08048080 | ランタイムライブラリ領域 | +---------------------------------------+ | コード領域 最大350KB | | | +---------------------------------------+ : : +=======================================+ 0x080A0000 .bss | ランタイムライブラリ作業領域 16KB | +---------------------------------------+ 0x080A4000 | 変数領域 128ワード 1KB | +---------------------------------------+ | 変数スタック 1024ワード 4KB | +---------------------------------------+ : : +---------------------------------------+ & | ヒープ領域 256KB 実行時に拡張可能 | : : | | +---------------------------------------+ * : : | スタック領域 | +---------------------------------------+
rvtlcの文法とrvtl-3.04との違い
rvtl-3.04 と同じです。rvtlのコマンドのうちインタプリタ専用のコマンド(編集コマンド等)と組み込みコマンドのうちシェルとして使用するもの |cd,|ls,|md,|mv,|rd,|cw,|rm,|mo,|um,|sy,|cr,|ex,|pv,|so,|sf はサポートしていません。
|ca, |cm, |zz とフレームバッファ関連コマンドは使用できます。
for文の終了条件と制御変数の値は終了時に一致する必要があります。増分が1より大きい場合には注意してください。
文法の詳細は https://www.mztn.org/rvtl/rvtl.htmlを参照して下さい。
ライセンス
このソフトはフリーソフトウェアです. GNU General Pulic Licenceにしたがって自由に使用,配布,改変して頂いてかまいません。GNU General Pulic Licence の詳細はCOPYINGを参照して下さい.GNU General Pulic Licence の日本語訳は gpl.text です.著作権は私(水谷 純, mizutani.jun@nifty.ne.jp)が保有しています。本ソフトウェアによって生じた損害について著作者は責任を負いません。また、著作者はバージョンアップの義務を負いません。