このページの目次

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版)からの変更点です。

  1. linux-2.6 の Address Space Layout Rondomization に対応
  2. ランタイムライブラリをrvtlcに組み込み
  3. 式の評価(16進数)で発生する変数スタックの不一致を修正
  4. % を参照するとエラーとなるバグを修正
  5. ランタイムライブラリの初期化時の不具合を修正

コンパイラの使用方法

例えば 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)が保有しています。本ソフトウェアによって生じた損害について著作者は責任を負いません。また、著作者はバージョンアップの義務を負いません。

>