* HLX-000
-(by [[K]], 2021.06.04)
** (0)
-HLXは、[[a21_txt01]]やその続編で作ったHLシリーズ(はりぼて言語)をベースに、[[K]]が望む理想の言語を作るプロジェクトです。
** (1)
-第一段階として、HLXは[[K]]が普段使いできる言語を目指します。最終的にはHLXさえあれば、他のコンパイラもアセンブラもリンカもいらないような、そんな完成度を目指します。当然ながらHLXはセルフホストも目指します。そうでなければ、HLXの改良の際に他のコンパイラが必要になって、「普段使い」を達成できないからです。
--細かい点としては次のようなことを考えています。
--HLはintしか使えませんでしたが、HLXではcharやfloatもdoubleも付けます。構造体ももちろん使えます。
--HLシリーズではスタック変数がなくて全部グローバル変数になっていましたが、HLXではスタック変数も使えるようにします。
--JITコンパイラと普通のコンパイラを統合します。x86とx64も統合します。たぶんARM32やAArch64もサポートします。
** (2)
-第二段階として、HLXは「移植作業が不要な世界」の実現を目指します。・・・これは[[K]]が、かつてOSASK(おさすく)というOSで果たそうとした夢です。
-その後、この夢はOSを作らなくても言語を作ることで果たせるのではないかと考えるようになり、それ以降、[[K]]が言語を作る際の大目標の一つになっています。
-具体的には、一度HLXでアプリケーションを作れば、それはそのまま無修正で様々な環境で動くようになることを目指します。
-さらにHLXにはOSASKでいうところの「タスクセーブ機能」のサポートも計画しています。これは、プログラムを実行途中で保存し、後になって途中から再開させるための機能です。面白いところは、プログラムを少しなら改変しても途中から再開できますし、またCPUが異なっていても再開できる点です。
--このタスクセーブ機能に関する実証実験を http://k.osask.jp/wiki/?p20190209b の Essen2019-A でやりました。
** (3)
-第三段階として、別の既存言語や既存の実行ファイルなどを、HLXのアプリに変換する機能を開発します。
-これができると、既存のプログラムをHLXアプリに変換し、そしてそれをHLXによってさまざまな環境で動かせるようになるのです。
-それはまさにOSASKがエミュレータOSで実現しようとした世界そのものです。
** (4) 大事にしたい価値観
-HLXは「何でも自動でやってくれる巨大で複雑な言語処理系」を目指しません。
-たとえばC言語では、どの変数の利用頻度が高く、どの変数がそうではないのかを自動で解析して、どれをレジスタ変数にするか自動で決定します。しかしHLXはそれを目指しません。自動で解析だなんて面倒すぎます。どの変数をレジスタ変数に割り当ててほしいのかは、プログラマがプログラム中で明記すればいいと[[K]]は考えます。
-ループのアンロールやループ内で値が不変な式の自動検出などもしません。
--(ループのアンロールについては、自動ではやらないけど、プログラム内で指示すればアンロールするという仕様に変えました。役立ちそうな気がしたからです。)
-そういうことを一切やらないことにして、その分、コンパイラを小さくシンプルに保ち、コンパイルスピードも上げるのです。
** (5) その他
-HLXはOSECPU-VMと合流したいです。・・・経緯はこうです。
-まず、HLXはプログラムをJITコンパイルして実行したり、普通のコンパイラのようにアセンブラソースを出したりできます。ターゲットとなるCPUやOSは、コマンドラインオプションで指定します。つまり言語の実行ファイルは1つです。出力したいものに合わせて、(コンパイラの)実行ファイルを選ぶ必要はありません。
-このようになんでも出せるようになると、では何で出すのが一番いいのかという疑問が生じます。x64のアセンブラでしょうか。しかしx64がベストな機械語なんでしょうか。それともAArch64でしょうか。・・・結局ソースコードのまま持っておくのが一番かもしれません。そうすればどこでも実行できます。何かの形式にしてしまうと、他のところで実行できなくなるからです。
-しかし、ソースコードのまま持っておくのは可読性は最高ですが、やはりかさばります。だからなんらかのバイナリにしたいと思います。・・・それで、それならOSECPU-VMのバイナリにすればいいじゃないかと思ったのです。これなら実行環境を選ばないですし、サイズは十分に(というか限界まで)小さくなるでしょう。
-ということで、将来的にいろんなものを開発して、それは全部OSECPU-VMのバイナリにして、そこから任意のバイナリ(x86とかx64とかAArch64とか)に変換することもできて、変換せずにJITコンパイラで実行することもできて、どのOSの上でも同じように暮らせるようなそんな世界を目指します。