* HLX-003
-(by [[K]], 2021.11.30)
** (0)
-HLXは、「10日くらいでできる!プログラミング言語自作入門」(→[[a21_txt01]])や、その続編で作った、HL-1~HL-22b(はりぼて言語)をベースに、[[K]]が望む理想の言語を作るプロジェクトです。
//--中・長期の目標は[[a21_hlx000]]に書いてあります。
-HLX-003はその3番目のバージョンです。まあHL-25みたいなものです。
--[[a21_hlx001]] : 最初のバージョン
--[[a21_hlx002]] : 2番目のバージョン
** (1) 概要
-HLXは、普通のコンパイラと、JITコンパイラと、普通のインタプリタを一つにまとめたものです。
--普通のコンパイラ部分はクロス開発可能な仕様になっていて、x64版でx86のコードを出力させたり、x86版でx64ののコードを出させることができます。
--普通のインタプリタを持っているため、JITコンパイラ部分を使わなければ、かなり多くのアーキテクチャに対応可能です。
-hlx_x86_win.exeは76.0KBです。hlx_x64_win.exeは96.0KBです。
-C言語っぽい書き方とBASICっぽい書き方の両方に対応しています。
-生成コードの質は(処理系が小さいにしては)なかなかよく、ものによっては gcc -O3 にかなり近い速さが出ることもあります。
--JITコンパイラでこんなに速いと、もう普通のコンパイラはいらないんじゃないかという気分になることもあるくらいです(笑)。
----
-''[1-1] C言語との互換性を強化しました。''
--使える演算子が増えました。
--forやifで { } を使わないコードブロックにも対応しました。・・・ただし、あいまいさの回避や内部処理の単純化のため、このような簡易コードブロックの中ではforやifの利用を禁じています(普通のコードブロックの中では問題なくforやifが使えます)。
--しかしそれでも、まだまだ完全互換やセルフホストには遠いです。→[[a21_hlx003_1]]
-''[1-2]acl01aに対応しました。''
--(註)acl01aについては、こちらで紹介しています。→[[a21_acl01]]
-''[1-3]BASIC風の構文も併用できるようになりました。''
--この構文では基本的に全部大文字で記述できます。キーボードに刻印された文字だけでプログラムが作れるので小学生にはわかりやすいだろうと思います。
--HLX-BASICの仕様:
---基本的に小学生が少しでも入力しやすくなる言語を目指す。
---コンマは使うけど、ピリオドはできるだけ使わない(両方あるとすごく混乱する)。
---セミコロンは使うけど、コロンはできるだけ使わない(両方あるとすごく混乱する)。
---カッコも減らす。中括弧は小学生に評判が良くないので使わないようにする。
-''[1-4]エラー表示を改良しました。''
--エラーになった時に、エラーを起こした行を表示するようにしました。
** (2) ダウンロード & テスト実行
-http://k.osask.jp/files/hlx003a.zip (114KB)
-http://k.osask.jp/files/hlx003b.zip (114KB)
-http://k.osask.jp/files/hlx003c.zip (115KB)[最新版]
--Windows用の実行ファイル(32bitと64bit)と、ソースコードと、サンプルのプログラムがいくつか入っています。
-起動するとプロンプトが出ます。
hlx>run maze2.c
-とすれば迷路が出てきます。 ESCキー を押せば終了してプロンプトに戻ってきます。
hlx>run invader.c
-とすればインベーダゲームができます。ゲーム中に ESCキー を押せば、ゲームを中断してプロンプトに戻ってきます。
hlx>run kcube.c
-とすればキューブが回転します。何かキーを押せば終了します。
** (3) プログラム例
-grd2.c (C言語風)
#include <acl.c>
void aMain()
{
AWindow *w = aOpenWinEx(16, 16, "gradation", 1);
int x, y;
for (y = 0; y < 256; y++) {
for (x = 0; x < 256; x++)
aSetPixOpt(w, AOPT_RfCf, x, y, aRgb8(y, x, 0));
}
aWait(-1);
}
-grd2.txt (BASIC風)
CANVAS 16,16,"gradation";
FOR Y=0,256;
FOR X=0,256;
SETPIX@@ RF+CF,X,Y,RGB8(Y,X,0);
NEXT;
NEXT;
WAIT -1;
----
-他にも多数のプログラム例があります。
|[[a21_edu02]]|坂道を走ってきれいな石を拾い集めるゲーム(20行)|
|[[a21_edu03]]|ハンバーガーキャッチ・ゲーム(30行)|
|[[a21_edu04]]|ジャンプ・ゲーム(29行)|
|[[a21_edu05]]|タイピングゲーム(31行)|
|[[a21_edu06]]|ロケット操縦ゲーム|
|[[a21_edu07]]|ブロックくずし|
** (4) hlxをソースコードからビルドする方法
-hlx003c.zip内のhlx.cはaclライブラリを利用する形で書かれています。ですからaclライブラリ([[a21_acl01]])をインストールして、その上でhlx.cをビルドしてください。他のソースファイル(esvm.cなど)はすべてhlx.cから勝手にインクルードされますので、個別にコンパイルする必要はありません。
** (5) ベンチマーク
-mandel1_opt.c, Kano-PC (Intel Celeron N4000)
--[1~4]hlx003c, hlx_x64_win.exe(96.0KB)
--[6~7]gcc version 8.1.0 (x86_64-posix-seh-rev0, Built by MinGW-W64 project)
--[8]TinyCC 0.9.27 (151KB+23KB)
|[1]codemode=2, optmode=0|RIGHT:''1.999秒''|x64用JITコンパイラ, 速度優先モード|
|[2]codemode=2, optmode=1|RIGHT:2.799秒|x64用JITコンパイラ, サイズ優先モード|
|[3]codemode=2, optmode=15|RIGHT:5.507秒|x64用JITコンパイラ, 最適化OFF|
|[4]codemode=0, optmode=0|RIGHT:28.669秒|インタプリタ実行, 最適化ON|
|[5]codemode=0, optmode=15|RIGHT:50.223秒|インタプリタ実行, 最適化OFF|
|[1]hlx codemode=2, optmode=0|RIGHT:''1.999秒''|x64用JITコンパイラ, 速度優先モード|
|[2]hlx codemode=2, optmode=1|RIGHT:2.799秒|x64用JITコンパイラ, サイズ優先モード|
|[3]hlx codemode=2, optmode=15|RIGHT:5.507秒|x64用JITコンパイラ, 最適化OFF|
|[4]hlx codemode=0, optmode=0|RIGHT:28.669秒|インタプリタ実行, 最適化ON|
|[5]hlx codemode=0, optmode=15|RIGHT:50.223秒|インタプリタ実行, 最適化OFF|
|[6]gcc -m64 -O0|RIGHT:5.880秒|最適化OFF|
|[7]gcc -m64 -O3|RIGHT:''1.905秒''|速度優先モード|
|[8]tcc -m64|RIGHT:6.453秒|(tccには最適化レベル指定がありません)|
--上記は実行時間の比較です。コンパイル時間は測定していません。
--[1]と[7]を比べると、hlxは4.9%ほどgccに負けていると言えます(でも、100KBにも満たないコンパイラにしては、結構頑張っているとも言えます)。
** (6) バージョンアップ履歴
-hlx003a → hlx003b :
--acl01bに対応。
--細かいバグ修正。
--エラー行の特定に失敗するケースを減らした。
-hlx003b → hlx003c :
--C言語風の記法でまともに動かなくなっていたバグを修正。
--for文のエラー検出能力を改善。
* こめんと欄
#comment