* HLX-001 -(by [[K]], 2021.06.20) ** (0) -HLXは、[[a21_txt01]]やその続編で作ったHLシリーズ(はりぼて言語)をベースに、[[K]]が望む理想の言語を作るプロジェクトです。 --中・長期の目標は[[a21_hlx000]]に書いてあります。 -HLX-001はその最初のバージョンです。まあHL-23みたいなものです。 ** (1) 概要 -HLX-001は、HL-9a, HL-16a, HL-22aの3つを統合し、さらに改良を加えたものです。 --ということで「できること」はこれら3つと同じです。 -統合されているので、モードを切り替えて使います。 --[codemode 0] HL-9a相当の実行モードで、JITコンパイルせずに中間コードを実行します。x86, x64以外でも(ソースからHLX-001をコンパイルすれば)動くはずです。 --[codemode 1] HL-16a相当の実行モードで、x86の32bitの機械語をJITコンパイラで生成します。 //---64bit版でもこのモードを利用することができますが、64bit版は32bit用の機械語を実行できないので、 codedump 1 で機械語を表示することしかできません(将来のバージョンではアセンブラも出力できます)。 --[codemode 2] HL-22a相当の実行モードで、x64の64bitの機械語をJITコンパイラで生成します(MS-Windows系のABI)。 //---32bit版でもこのモードを利用することができますが、32bit版は64bit用の機械語を実行できないので、 codedump 1 で機械語を表示することしかできません(将来のバージョンではアセンブラも出力できます)。 --[codemode 3] HL-22a相当の実行モードで、x64の64bitの機械語をJITコンパイラで生成します(System V系のABI)。 //---以下同文。・・・しかし、codemode 3は全くデバッグしてないので、このバージョンではきちんと動かないかもしれません。 -http://k.osask.jp/files/hlx001a.zip (75.3KB) --[内容] --hlx001_32.exe : 32bit版の実行ファイル(21.5KB) --hlx001_64.exe : 64bit版の実行ファイル(29.0KB) --mandel.cなどのサンプルプログラム --hlx001src/ ---hlx001.c (935行) - ソースコードから共通中間コードに変換 ---esvm.c (945行) - 共通中間コードを最適化する ---esvm_run.c (200行) - 共通中間コードをインタプリタで実行 ---esvm_x864.c (1027行) - 共通中間コードをx86/x64の機械語に変換 ** (2) 特徴(なにがすごいのか) -[1]処理系の小ささ --HL-9a, HL-16a, HL-22aの3つは以下のようになっていました。それらに対し、こんなにコンパクトにまとまっています。 ||ソース行数|.exeのサイズ(無圧縮)|.exeのサイズ(UPX)| |HL-9a|RIGHT:772行|RIGHT:20.0KB|RIGHT:11.5KB| |HL-16a|RIGHT:1081行|RIGHT:24.5KB|RIGHT:13.5KB| |HL-22a|RIGHT:1223行|RIGHT:41.5KB|RIGHT:21.0KB| |(合計)|RIGHT:(3076行)|RIGHT:(86.0KB)|RIGHT:(46.0KB)| ||||| |HLX-001|RIGHT:3017行|RIGHT:40.0KB|RIGHT:21.5KB| --あれ?ソース行数的には、それほどコンパクトでもないな・・・。 --まあでも実行ファイル的には明らかにコンパクトになっています。 --上記3つは似たような部分が多いため、1つにまとめることで共通な部分が省かれて、このような結果になっています。 ~ -[2]コード生成の質の向上 --mandel.cを使って比較してみました。 --[2-1] HL-9aとの比較 |HL-9a vs HLX-001|32bitモード(x86)|29.667秒 vs ''23.220秒''|1.28倍| |HL-9a vs HLX-001|64bitモード(x64)|26.904秒 vs ''18.653秒''|1.44倍| ---表のように、HLX-001は中間コードの実行性能が上がっています。 ---この成果は、主に「中間コードの最適化」(後述)がうまくいっているからです。 --[2-2] HL-16aとの比較(32bitモード(x86)) |HL-16a vs HLX-001|3.246秒(657バイト) vs ''3.272秒(609バイト)''|速度優先| |HL-16a vs HLX-001|3.730秒(613バイト) vs ''3.660秒(411バイト)''|サイズ優先| ---速度優先: regVar(0, ---サイズ優先: regVar(0, ---実行速度的にはHL-16aに対する優位性はないのですが、生成コードの長さは結構改善されています。 ---- --[2] HL-16aとの比較(32bitモード(x86)) --[3] HL-22aとの比較(64bitモード(x64)) |HL-22a vs HLX-001|2.503秒(674バイト) vs ''2.512秒(655バイト)''|速度が速くなるようにレジスタ変数を割り当て| |HL-22a vs HLX-001|3.449秒(588バイト) vs ''3.459秒(489バイト)''|サイズが小さくなるようにレジスタ変数を割り当て| --[考察] ---[1]のHL-9aとの比較では、HLX-001になって有意に性能が向上しています。これはHLX-001が内部コードに対して最適化をしてから実行するようになったためです。 ---[2]のHL-16aとの比較では、有意な速度の向上はありませんでした。ただサイズにおいては有意な差がついています。これはどちらもアラインを考慮せずに比較しているので、その影響かもしれません。HLXにアライン機能を対応させたら、少しは差が出るかもしれません。 ---[3]のHL-22aとの比較では、有意な速度の向上はありませんでした。ただサイズにおいては有意な差がついています。これはどちらもアラインを考慮せずに比較しているので、その影響かもしれません。HLXにアライン機能を対応させたら、少しは差が出るかもしれません。 -(以下編集中) ----