* esb02b.hrb について -(by [[K]], 2020.05.30) ** (1) esb02b.hrb とは? -esb02b.hrbは、自作言語である ES-BASIC ver.0.2b を「30日でできる!OS自作入門」のサンプルOSである「はりぼてOS」に移植したものです。 --ES-BASIC ver.0.2b については、ここに詳しく書いてあります。 → [[esbasic02a]] --つまり「自作OS上で自作言語を動かしてみよう」という、夢いっぱいの試みです。 ** (2) 「はりぼてOS」について -ただし、純粋な「はりぼてOS」では ES-BASIC ver.0.2b 相当の機能を容易には実現できないので、以下の改造を施しています。 --[定番の改造] FPU命令を利用可能にする拡張 --[定番の改造] IPLの改良(これでサイズの大きいアプリが扱いやすくなる) --[定番の改造] OSの無駄を少し減らす改造 --データ領域に書いたコードを実行可能にするAPIの追加 --Shift,Ctrl,Altの入力も取得できる拡張 --これらの改造についての詳細は http://hrb.osask.jp/wiki/?esb02b に書きました。 -これらの改造の結果、OS本体+デバイスドライバ+シェルである HARIBOTE.SYS は''30.1KB''になっています。 --つまりは、なんだかんだ言ってもその程度のシンプルなOSだということです。一応このサイズで、32ビットマルチタスク、マルチウィンドウを実現しています。 -「はりぼてOS」は以下の写真のような感じのOSです( http://hrb.osask.jp/figures.html より)。これが30.1KBでできるって、なかなかよくできていると自分では思っています。 --https://hrb.osask.jp/fig0227.png --http://hrb.osask.jp/fig0227.png ** (3) esb02b.hrb について -「はりぼてOS」は残念ながら、ファイルへの書き込み機能を持っていません(読み込みはできます)。したがって esb02b.hrb は、MKEXE コマンドもそのまま実装されているものの、なにも出力できません。ということでコンパイラとして使うことはできません。 --でも移植を楽にしたかったので、コンパイラ処理部分もすべてそのまま残してあります。 -しかしそれ以外の機能はほとんど問題なく使えます。もちろん高速なスクリプト実行やデバッグ支援機能も全部使えます。 ---- -率直な感想として、自作OSの上で自作言語がサクサクと動いて、そこでプログラムを書いて、RUNしたりデバッグしたりできるのは、非常に感動的です。''夢のようです。'' -なんというか、まずOSが一人前になった感じがします。「このOSはここまでできるのかー」と(=自作OSがすごい)。 -同時に「この言語はこんな貧弱な環境でも問題なく動いてしまうのかー」とも感じます(=自作言語がすごい)。 --私は以前、gccを(別の自作OSである)OSASK上で動くようにしたことがあります。それはかなり大変でした。 --それと比べたら、今回の移植は非常に楽でした。「はりぼてOS」はOSASKよりもずっと貧弱で、だから苦労することはあっても楽することなんてないはずなのですが、それでも格段に移植は楽でした。 --理由としては、 ES-BAISC ver.0.2b が標準ライブラリすらわずかなものしか利用していなかった、言語処理系として素直でシンプルに構成されていた、ということがあります。 --もし、Pythonを移植するとしたらどのくらいの手間がかかるでしょうか。・・・正直想像したくないです・・・。 -esb02b.hrb を起動すると、当然ですがメモリを消費します。でもそのメモリ消費量は11.1MBだけです(OSのmemコマンドで確認しました)。たったこれだけでES-BASICは動いてしまうのかーと感じます。 --ちなみにOS込みで、32MBくらいあればメモリ不足を感じることは全くなく快適に動きます(32MBもあれば、esb02b.hrbの他にも同時に複数のアプリを起動できます)。今回はQEMUでメモリ32MBで使っています。 --普段は「Windows はメモリ2GB(=2048MB)ではしんどいなあ」なんて感じているのに・・・。だった32MBでここまでできるなんて・・・。 -以下はesb02b.hrbを実際に起動してプログラムを実行させたところです。実行時間33秒というのは、このアプリの演算量が多いこと、このマシンが非力なこと、QEMU上での実行であることを考慮すれば、十分な速度だと思っています。 --(mandel.txtは[[esbasic02a]]の(4-2)に書いてある36行のプログラムです。) --http://k.osask.jp/files/pic20200602a.png -こちらも実行画面です。キューブ回転も問題なく動きます。 --http://k.osask.jp/files/pic20200605a.png -[Q]なんでロードしているの?もしかしてesb02b.hrbではプログラムの入力ができないの? --[A]いえいえ、もちろんそんなことはありません。普通に入力すれば普通に記憶されてRUNできます。 --しかし、「はりぼてOS」ではアプリの垣根を超えたコピー&ペーストの仕組みを持っていないので、手で入力するのが結構しんどいのです。 --ということでテキストファイルにしておいて、ロードすることにしているわけです。 --Windows版ではloadコマンドをほとんど使っていなかったのですが、「はりぼてOS」版ではよく使っています。 ** (4) 移植の手間 -今回の移植はどのくらいの手間だったのかをここで報告します。 ||改変行数||備考| |esbasic.c|RIGHT:12行|メインモジュール|全部で3160行のうち、たった12行しか改変しませんでした| |kcl03.c|RIGHT:5行|自作の汎用C言語ライブラリ|| |kcll00.c|RIGHT:0行|自作の言語開発支援ライブラリ|| |bla.h|RIGHT:4行|自作のグラフィックライブラリ|| |bla.c|RIGHT:44行|自作のグラフィックライブラリ|「はりぼてOS」用の描画ルーチンを追加しました| |bla2.h|RIGHT:0行|自作のグラフィックライブラリ|| |bla2.c|RIGHT:0行|自作のグラフィックライブラリ|| |chr.c|RIGHT:0行|ES-BASIC用のキャラクタデータ|| |hrbcons.c|RIGHT:101行|(新規作成)簡易コンソール|OSが標準で持っているコンソールがあまりに貧弱でES-BASICでの利用に耐えられないのでアプリ側でコンソール機能を実装| |std.c|RIGHT:530行|(新規作成)標準関数(下記参照)|標準関数が足りなかったので適当に実装| |合計|RIGHT:696行||| -今回即席で作った標準関数: --qsort, exit, strtoull, malloc --time, clock --vsnprintf, snprintf, fprintf, vfprintf, printf, putchar, scanf --fopen, fread, fwrite, fseek, feof, fgets, fclose --strchr -こうしてみると、移植の手間のほとんどは標準関数不足を補うための530行で、もし最初からこれらの標準ライブラリを用意してあれば、わずか166行の改変だけで、ES-BASIC ver.0.2bは移植できたはずです。 -それは相当に移植性が高いような気がします。 -166行書くだけで、自作のOSでES-BASICが動くようになって、既に開発済みのES-BASIC用のプログラムが使えるようになる上に、便利なデバッグ支援付きの開発環境が動くようになるなんて、相当に「おいしい」話だと私は思います。 ** (5) サイズ比較と考察 |ファイル名|サイズ|説明| |esbasic64.exe|RIGHT:67,072バイト(65.5KB)|ES-BASIC ver.0.2b のWindows版(64bit)| |esbasic32.exe|RIGHT:62,976バイト(61.5KB)|ES-BASIC ver.0.2b のWindows版(32bit)| |esbasic32s.exe|RIGHT:45,056バイト(44.0KB)|ES-BASIC ver.0.2b のWindows版(32bit) コンパイルオプションで-Osを指定| |esb02b.hrb|RIGHT:38,584バイト(37.6KB)|ES-BASIC ver.0.2b の「はりぼてOS」版(32bit)| -ES-BASICの「はりぼてOS」版である esb02b.hrb は、なんとたったの37.6KBになりました。これはWindows版の44.0KBよりも有意に小さいです。 -なぜ小さくなったのか。それは結局のところ、「はりぼてOS」のほうがアプリに対して便利なAPIを提供できているから、ということに尽きます。たとえばWindowsでウィンドウアプリケーションを作ろうとするとマルチスレッドなプログラミングスタイルを強要されますが、「はりぼてOS」はそんなことはありません。 -「はりぼてOS」が、ES-BASICに都合の良いAPIを提供しているという指摘は当たりません。というか30KBのOSには、そんな小細工をする余裕はないです。必要最低限のことをただひたすらにやっているだけです。 -そしてここに自作OSの面白さがあるかもしれないと思いました。個人ベースの開発では、WindowsやLinuxのような超大規模なOSはまず無理です。では小規模なOSを作って楽しめるところは何でしょうか。どうやって既存OSに対する優位性を主張できるでしょうか。今回の事例は、そういう視点で見ると示唆に富んでいる気がします。 -そして別の視点で見ると、言語処理系を実現するために必要なOSの機能は本当に少ないんだと思い知らされます。30KBのシンプルなOSに対して、37.6KBの実行ファイルだけでここまでできてしまうのですから。 -OSはどんなに優秀でも、アプリケーションが少ないと結局はあまり役に立ちません。内部構造の美しさをどれほど誇っても、それを利用するアプリがなければまさに宝の持ち腐れです。言語処理系を移植すれば、一気にアプリが増えるので、これはお勧めできるのではないかと私は思いました。 ** (6) ダウンロード -(6-1)以下のディスクイメージをQEMUで起動すると、esb02b.hrbが入っている「はりぼてOS」が起動します。 qemu.exe -L . -m 32 -localtime -std-vga -fda esb02b_hrb.fd --http://k.osask.jp/files/esb02b_hrb_fd.zip (144.5KB) ---- -(6-2)esb02b.hrbのソースコードは以下にあります。tolset_hでmakeできます(apilibの更新が必要です)。 --http://k.osask.jp/files/esb02b_hrb.zip (92.7KB) //** (4) 自作だからできること //-自作OSや自作言語だからこそ、できることって何でしょうか。 //-・・・どうせ何をどう作っても既存のOSや既存の言語にはかなわないのが普通です。しかし、もしかなりの実力者であれば、正面からこれ挑んで、既存言語を超える何かを実装するのでしょう。すごいですね。 //-私はそんなことはまずできません。さらに私は巨大なプログラムを管理しきる能力もありません。・・・私にできるのは、プログラムを小さく作るにはどうしたらいいか考えることです。プログラムが小さくなることで、私でも手に負える規模になります。というか誰だって、大きなプログラムよりは小さいプログラムのほうが作りやすいことでしょう。 //-必要なものだけを最小の構成で作る、そんな当たり前ことをやるだけなのです。・・・そしてこのことこそ、既存のOSや言語が全くやってこなかったことです。だからこれは自作OS・自作言語ならではの成果なのだと思います。 * こめんと欄 #comment