HLX-002
(0)
- HLXは、a21_txt01やその続編で作ったHLシリーズ(はりぼて言語)をベースに、Kが望む理想の言語を作るプロジェクトです。
- HLX-002はその2番目のバージョンです。まあHL-24みたいなものです。
(1) 概要
- HLX-001は、HL-9a, HL-16b, HL-22bの3つを統合し、さらに改良を加えたものです。
- ということで「できること」はこれら3つと同じです。
- 統合されているので、モードを切り替えて使います。
- [codemode 0] HL-9a相当の実行モードで、JITコンパイルせずに中間コードを実行します。x86, x64以外でも(ソースからHLX-001をコンパイルすれば)動くはずです。
- [codemode 1] HL-16b相当の実行モードで、x86の32bitの機械語をJITコンパイラで生成します。
- [codemode 2] HL-22b相当の実行モードで、x64の64bitの機械語をJITコンパイラで生成します(MS-Windows系のABI)。
- [codemode 3] HL-22b相当の実行モードで、x64の64bitの機械語をJITコンパイラで生成します(System V系のABI)。
- [Q]そもそもなぜ3つを統合する必要があるの?
- [A]HLシリーズを拡張していくにあたって、それぞれの改造を3つのバージョンに別々に適用していくのは大変なので、まず1つに統合して、それから拡張していきたかったのです。
- さらに統合することで、3つを別々に持つよりもコンパクトにできるのではないかと考えています。
- あと、これ一つであれもこれもできる!っていうのが好きなんです(笑)。
- http://k.osask.jp/files/hlx001b.zip (75.2KB)
- http://k.osask.jp/files/hlx001c.zip (76.4KB) [最新版]
- [内容](サイズ・行数はhlx001b時点)
- hlx001_32.exe : 32bit版の実行ファイル(21.5KB)
- hlx001_64.exe : 64bit版の実行ファイル(54.0KB)
- mandel.cなどのサンプルプログラム
- hlx001src/
- hlx001.c (935行) - ソースコードから共通中間コードに変換
- esvm.c (831行) - 共通中間コードを最適化する
- esvm_run.c (200行) - 共通中間コードをインタプリタで実行
- esvm_x864.c (1027行) - 共通中間コードをx86/x64の機械語に変換
(2) 特徴(なにがすごいのか) →「こんなに小さくても、結構いろいろできる!」
- [1]処理系の小ささ
- HL-9a, HL-16b, HL-22bの3つは以下のようになっていました。それらに対し、こんなにコンパクトにまとまっています。
| ソース行数 | .exeのサイズ(無圧縮) | .exeのサイズ(UPX適用) |
| HL-9a | 772行 | 20.0KB | 11.5KB |
| HL-16a | 1081行 | 24.5KB | 13.5KB |
| HL-22a | 1223行 | 41.5KB | 21.0KB |
| (合計) | (3076行) | (86.0KB) | (46.0KB) |
| | | |
| HLX-001 | 2993行 | 40.0KB | 21.5KB |
- あれ?ソース行数的には、それほどコンパクトでもないな・・・。
- まあでも実行ファイル的には明らかにコンパクトになっています。
- 上記3つは似たような部分が多いため、1つにまとめることで共通な部分が省かれて、このような結果になっています。
(3) プログラムの構成
- hlx001.c (935行)
- これはHL-9aから内部コード実行ルーチンを引いたようなものです。
- 内部コード(共通中間コード)を出力した後は、esvm.cやesvm_run.cやesvm_x864.cを使ってプログラムを実行します。
- esvm.c (945行)
- esvm_run.c (200行)
- 共通中間コードをJITコンパイルせずに実行します。
- esvm_x864.c (1027行)
- 共通中間コードからx86/x64の機械語をJITコンパイラで生成します。
- この構成は、esvm.c, esvm_run.c, esvm_x864.cを再利用することを想定したものです。
- 将来また別の言語を作りたくなった時には、hlx001.cに相当する部分だけを作り替えるだけで、今回くらいの最適化が適用できるはずです。
- 935行のプログラムを書くだけで、いろんな方法で実行できる言語が21.5KBでできてしまうっていうのは、私にとっては相当に便利なことなのです。
(4) 普通のコンパイラとしての使い方
- おまけのメモ
- 上記で使うsub_x86_win.objは次の方法で作りました(すでに作ったものがアーカイブに含まれています)。
こめんと欄