見出し画像

TL/1 - Tinyな8ビットコンパイラ

TinyBASICを参考にGAME言語を開発した作者が、今度はPascalライクな軽量言語を発表しました。

以前にも書きましたが、PASCALフルセットであるUCSD-PASCALは処理系の規模が大きく、お値段もソコソコだったので気軽に使えるようなものではありませんでした。

いくつかのTinyPASCALと呼ばれる処理系はあったのですが、P-CODEインタプリタで実装されているコンパイラであることが多く、コンパイラとしては思ったほどのパフォーマンスが得られていませんでした。

考えてみれば8bitCPUの能力ではPASCALといった高級言語の処理を実行するには、そもそも力不足で、簡単な演算処理であっても非常に多くの命令を実行する必要があったからです。そこでTL/1は言語の方を8bitCPUに見合った機能にシュリンクしたものと考えることが出来ます。

TL/1 とは

まず変数は8bitです。さすがにこれでは困るケースのみ部分的にMHIGH(乗算の結果の上位バイト)といった特殊な変数が用意されていますが、通常の演算では8bitしか扱えません。但し、ADCとSBCという繰り上がり(繰り下がり)をサポートした演算子があって、自力で式を展開することで多バイト演算をする方法は残されています。つまり、そのままCPUの命令に展開できるような言語になっているわけですね。

こういう言語ですから、コンパイルされたコードはアセンブラで書いたような効率の良いコードになるのも頷けます。まあPASCALライクなアセンブラであったわけです。優秀なマクロアセンブラであれば、かなりのことは出来ますが、式を展開してくれるだけでも、さすが高級言語です。

TL/1年表

この言語上の表現とCPUの命令の関係が近いというのは意外と大事で、例えばC言語は元になったPDP11のアーキテクチャを考えるとTL/1みたいなもので、C言語のコードは比較的素直にPDPのマシン語に変換できます。C言語で複雑なコードはCPUにとっても複雑な処理なわけです。逆に考えるとC言語で短く書ければ、多分CPUにとっても効率が良いコードと言えることが多いわけです。

これはC言語に似ているC++などのオブジェクトな言語と大幅に違うところで、変数をひとつ作るだけでオブジェクトを生成する、それなりに複雑なコンストラクタが走ったり、単にスコープを抜けるだけでコードに明示されていないところで、知らない間に処理の重いデストラクタが走るなんて言うことは無いわけです。まあC++の場合、STLなどのテンプレートもたったひとつの行で猛烈に複雑な処理を書くことが出来たりしますしね。

もっともCPUの命令も除算や浮動小数点演算はもちろん有名なCPUに古くからあるブロック転送命令もマクロみたいなもので、1命令でも結構重いのであくまで目安にしかなりませんが。

そういえばJAVAのVMも、ひとつの命令でオブジェクトを生成するものがあって、これが実に重いこと、重いこと。やっている処理を考えれば当然ですが、高級言語上の行の長さで処理の重さを測ることはもちろん、機械語レベルであっても長さで処理を見積もるのは無理があります。もちろん、そういうことをやる人がいたことへの当てつけです^^;。

TL/I (少しばかし説明が乱暴だなぁ)

ヘッダ画像は、以下のものを使わせていただきました。
http://upd780c1.g1.xrea.com/n80/list0/ascii_ta/index_0.htm


この記事が気に入ったらサポートをしてみませんか?