* ES-BASIC #4 -(by [[K]], 2019.09.06) ** (6) 開発メモ #1 -このメモを書き始めるまで: --[2012.09.07] OSECPU-VMを作ろうと思い立つ。・・・これより以前の歴史は長すぎるのでここには書かない。 --[2013.03.??] セキュリティキャンプの教材にOSECPU-VMを使おうと決心。 --[2013.08.??] セキュリティキャンプをやっているうちに、OSやVMよりも言語開発に興味がある人の方が多そうだなあと感じた。ということで、OSECPU-VMが一段落ついたら次は言語に行こうと思った。 --[2015.03.17] 言語開発としてKH-FDPLというのを始める。[[K]]にとってはOS/VM系開発から言語処理系開発への切り替えになる。 --[2016.02.17] C言語に永続変数を持たせる「Persistent-C」の開発を始める。・・・まあまあのものはできたけど、なんか物足りない。 --[2016.10.24] 演算子や構文を自由に作れる「Essen」の開発を始める。・・・しかし難航する。 --[2017.06.16] TL-1, TL-2, TL-3 を開発し、プログラミング言語開発入門みたいなことを始める。→[[text0010]] --[2018.05.31] TJ01~TJ03を開発し、JITコンパイラを作るのは難しくないと立証(→[[text0010]])。・・・その後、JITコンパイラのコード生成を頑張って、C言語並みの実行速度を実現。 --[2019.02.22] OSC2019 Tokyo/Spring で Essen2019-A を発表。Essenのブランド名を冠してはいるものの、もはやJITコンパイラではない。しかしEssenで実現したいことの一部を表現できた。 --[2019.04.16] 言語を何度も作りなおすのに疲れてきたので、言語からいったん離れて、自分の開発効率を大幅に向上できるような、自分専用ライブラリを作ろうと決心。 --[2019.04.29] 開発に使う言語をC言語からC++へ変更することにした。その方が使いやすいライブラリを作りやすいと思ったので。 --[2019.07.12] ついに ES-BASIC の開発を開始する。自作ライブラリがあれば、言語開発は相当にはかどるだろうと思っていたが、実際すごくはかどった。名称のESはもちろん私の言語開発ブランドであるEssenに由来する。→[[esbasic0001]] --[2019.07.17] PUSH、POP命令を付けることで、グローバル変数しかないのに再帰呼び出しを実現(笑)。 --[2019.07.24] 整数演算しかできないES-BASICだけど、固定小数点演算にすることでマンデルブロ集合の描画に成功。 ---(ここの3週間弱は、忙しくてほとんど開発できなかった時期) --[2019.08.15] スクロール命令を付けたので、スクロールするゲームが作れるようになった。 --[2019.08.23] SecHack365の福岡合宿で、ES-BASIC用のプログラムとして、迷路作成プログラムを作ってみた(穴掘り法)。50分くらいでできた(このうちの半分の時間はバグ取り)。なかなか楽しい。 --[2019.08.27] ラボユース合宿で、ついにプログラムがプログラムを作ってそれを即座に実行するという機能を、ES-BASICに追加。自己書き換えすら可能。ついでにここまでの成果をとりあえず公開。→[[esbasic0003]] --[2019.09.02] 代入文で、右辺に複数の演算子があるような「式」がやっと使えるようになった。ただし演算子の優先順位は無視していて、1+2*3が9になる。それでも今までよりは格段に便利。 --[2019.09.03] 代入文以外の文脈でも式が使えるようになった。一時変数の乱発が必要なくなり、一気に便利さが増した。 --[2019.09.05] 今までどちらかと言えば軽い持ちで雑に作ってきたES-BASICであったが、たったの830行ほどの処理系でしかないのに、JITコンパイラだから手軽なのに爆速だし、REPLがあるから気軽に実行できるし、プログラムをファイルに保存しなくても、コピー&ペーストで入力して実行できるし、blaライブラリがあるから簡単にグラフィックもできるし、「ああ、もしかしたら私が理想とするプログラミング環境に今までで一番近いのはこいつなのではないか」と直感的に思った。・・・Essenの基本仕様の一つに、「演算子や構文を簡単に拡張するための機能がある」というのがあったが、830行のプログラムなら簡単に手入れできるので、言語が言語を拡張する機能を持っている必要性はもしかしたらないかもしれないとも思った。 -''[2019.09.06(金)]'' --GOTOやGOSUBのとび先で、ラベルを指定できるようになった。これで、単純に行番号を付け直してもプログラムが壊れないように作れるようになった。めでたい。 --一方で、自作ライブラリのKIndexHSクラスにはどうやらrehashまわりにバグがあるらしいことが判明したので、次はこれを直さなければいけないだろう。 --この時点で、esbasic.cppは864行。・・・行数が36行も増えたが、これはgoto先がなかったりラベル定義が重複した場合などにもきちんと対処したため。 --KIndexHSのrehashのバグは、rehashのせいではなかった。KMemPoolのallocが怪しい。しかし別のバグを直したら再発しなくなってしまったので、ひとまずこのバグは追及しないことにする。 -''[2019.09.09(月)]'' --コマンド処理で引数の省略の処理を一般化したらきっとかなり行数が減るだろうと思っていたけど、実際にやってみたら8行しか減らなかった・・・。 --他でもいろいろ工夫して、トータルで500行くらいにできないだろうかと考えているのだけど、それはかなり無理があるかもしれないと思い始めた。 -''[2019.09.11(水)]'' --プログラミング言語に依存しない汎用的な部分をライブラリに追い出して、818行まで減らしたけど、目標の500行にはほど遠い・・・。 -''[2019.09.12(木)]'' --808行にはできた。うーん、あとはJITコンパイラのコア部分を切り出せたらよいのだけど、まだライブラリへ切り出すほどの完成度じゃないんだよな・・・。 --グラフィックの機能については、言語と独立にあってもいい気がするので、これらを追い出せば行数は減らせるな・・・。マイナス70行くらいは行けるんじゃないか? -''[2019.09.13(金)]'' --ちょっと間に合わせ感はあるけれど、とにかく上記方針で732行まで減らせた! --「プログラムを小さくするにはどうしたらいいのか」を考えると、このプログラムの本質は何か、どの部分は汎用化してライブラリに追い出してもいいか(再利用可能か)ということを真剣に考えることになるので、すごくいいと思う。でも多くの人はそういう観点でのプログラミングはしていないだろうけど・・・。 --言語を作っていると、特にその言語固有の新しい機能とかを作った場合、それはライブラリとして切り出すことができる。ライブラリにしておけば、その自作言語を使わなくても、ライブラリを利用することで、その新しい機能を利用できるようになる。そのようにライブラリを作った後で言語側を修正すると、言語はライブラリのラッパーになっているだけで、何も新しい機能は提供していないことになる。・・・これが言語処理系の実装方法として正しい姿なのだと私は思う。 --ES-BASICにデバッグ支援機能として、LWAIT命令を付けてみた。これは、line-waitの略で、一行実行するごとにどのくらいwaitを入れるのかをマイクロ秒単位で設定できる。・・・最近のPCはどいつもこいつも速くなってしまい、「動いているところ」を見るのはかなり難しい。たいてい最終結果だけが見える。昔はすごく遅かったので、動いているところを見るのは簡単だったのに。もしかしたら、昔の速度の方がプログラミングの理解がしやすくて、デバッグもやりやすかったのかもしれない。そう思って、実行速度を下げるコマンドを付けてみた・・・というわけだ。 --正直これが有用かどうかは、今の私にはよくわからないけど(さすがにもう速度に関わらずデバッグできてしまうので)、でもプログラムに手を入れずともコマンドを実行してからRUNするだけで、実行速度を自由に上げ下げできるのは結構新鮮だった。 --いろいろ試してみて、マイクロ秒をやめてナノ秒にしてみた。1ミリ秒でも遅すぎる場合があったので。 * こめんと欄 #comment