esbasic0004
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
* ES-BASIC #4
-(by [[K]], 2019.09.06)
** (6) 開発メモ #1
-このメモを書き始めるまで:
--[2012.09.07] OSECPU-VMを作ろうと思い立つ。・・・これよ...
--[2013.03.??] セキュリティキャンプの教材にOSECPU-VMを使...
--[2013.08.??] セキュリティキャンプをやっているうちに、OS...
--[2015.03.17] 言語開発としてKH-FDPLというのを始める。[[K...
--[2016.02.17] C言語に永続変数を持たせる「Persistent-C」...
--[2016.10.24] 演算子や構文を自由に作れる「Essen」の開発...
--[2017.06.16] TL-1, TL-2, TL-3 を開発し、プログラミング...
--[2018.05.31] TJ01~TJ03を開発し、JITコンパイラを作るの...
--[2019.02.22] OSC2019 Tokyo/Spring で Essen2019-A を発表...
--[2019.04.16] 言語を何度も作りなおすのに疲れてきたので、...
--[2019.04.29] 開発に使う言語をC言語からC++へ変更すること...
--[2019.07.12] ついに ES-BASIC の開発を開始する。自作ライ...
--[2019.07.17] PUSH、POP命令を付けることで、グローバル変...
--[2019.07.24] 整数演算しかできないES-BASICだけど、固定小...
---(ここの3週間弱は、忙しくてほとんど開発できなかった時...
--[2019.08.15] スクロール命令を付けたので、スクロールする...
--[2019.08.23] SecHack365の福岡合宿で、ES-BASIC用のプログ...
--[2019.08.27] ラボユース合宿で、ついにプログラムがプログ...
--[2019.09.02] 代入文で、右辺に複数の演算子があるような「...
--[2019.09.03] 代入文以外の文脈でも式が使えるようになった...
--[2019.09.05] 今までどちらかと言えば軽い持ちで雑に作って...
-''[2019.09.06(金)]''
--GOTOやGOSUBのとび先で、ラベルを指定できるようになった。...
--一方で、自作ライブラリのKIndexHSクラスにはどうやらrehas...
--この時点で、esbasic.cppは864行。・・・行数が36行も増え...
--KIndexHSのrehashのバグは、rehashのせいではなかった。KMe...
-''[2019.09.09(月)]''
--コマンド処理で引数の省略の処理を一般化したらきっとかな...
--他でもいろいろ工夫して、トータルで500行くらいにできない...
-''[2019.09.11(水)]''
--プログラミング言語に依存しない汎用的な部分をライブラリ...
-''[2019.09.12(木)]''
--808行にはできた。うーん、あとはJITコンパイラのコア部分...
--グラフィックの機能については、言語と独立にあってもいい...
-''[2019.09.13(金)]''
--ちょっと間に合わせ感はあるけれど、とにかく上記方針で732...
--「プログラムを小さくするにはどうしたらいいのか」を考え...
--言語を作っていると、特にその言語固有の新しい機能とかを...
--ES-BASICにデバッグ支援機能として、LWAIT命令を付けてみた...
--正直これが有用かどうかは、今の私にはよくわからないけど...
--いろいろ試してみて、マイクロ秒をやめてナノ秒にしてみた...
-''[2019.09.14(土)]''
--なかなかよいアイデアを思いついた。これでES-BASICはデバ...
--詳しいことは後日書く予定。
-''[2019.09.17(火)]''
--[[esbasic0005]]を書いた。これはES-BASICの基本部分だけを...
--とりあえず89行で書けることはわかった。
--そして Shift+End を入力すれば、いつでもただちに停止でき...
-''[2019.09.18(水)]''
--[[esbasic0005]]を更新した。ライブラリ側にもうちょっと関...
-''[2019.09.19(木)]''
--私はES-BASICの中でたまにアセンブラを書きたくなる。いや...
--しかし普通にアセンブラを作るとそれは大掛かりになってし...
--今まで、そういう生々しい拡張(普通の言語っぽくないこと...
--将来的に互換性を保たなければいけない、みたいな気構えも...
--そうすることで見えてくるものもあると思うので。
--4時間くらい頑張ったらできた。追加したのは60行。これでイ...
--こんな感じの雰囲気。
13 CODE `xor 0X33 #RM:EAX,EAX
14 CODE `store 0X89 #RM:EAX,[N]
15 LABEL FORLOOP
16 CODE `load 0X8B #RM:EAX,ECX
17 CODE `imul 0XF7 #RM:5,ECX
18 CODE `shrd 0X0F 0XAC #RM:EDX,EAX 24
19 CODE `load 0X8B #RM:ESI,EAX
20 CODE `load 0X8B #RM:EAX,EBX
21 CODE `imul 0XF7 #RM:5,EBX
(中略)
36 CODE `load 0X8B #RM:EAX,[N]
37 CODE `inc_eax 0X40
38 CODE `store 0X89 #RM:EAX,[N]
39 CODE `cmp 0X81 #RM:7,EAX %446
40 CODE `jle 0X0F 0X8E #REL:FORLOOP
--ということで、すごく気軽に機械語で遊ぶ環境ができた。mod...
--もちろんES-BASICの他の命令と混在できるので、一番重たい...
--何か適当なファイル名を付けてソースを保存する必要はない...
--もちろん実行速度は爆速なので(機械語だから当然だけど)...
--アセンブラなのに Shift+End で停止することができて、しか...
-''[2019.09.20(金)]''
--ALIAS命令を付けて、レジスタ名を隠して書けるようにした。...
--そして各行ごとの実行回数をカウントして表示する機能も付...
--アセンブラでプログラミングしていると、ここは通っている...
--アセンブラの中で処理を中断してしまった時などは、なんと...
--ES-BASICはBASICなんだと思うとささやかなインパクトしかな...
--まあ基本的な使い方としては、まずES-BASICでお気軽に書い...
--現在ES-BASICは927行。
--11/23~11/24のOSCに出展する予定なので、それまでにオープ...
-''[2019.09.25(水)]''
--ES-BASICのCODE命令がやっぱり少々不便なので、ASKA命令を...
10 ALIAS ZX:ECX, ZY:EBX, XX:ESI, YY:EDI
11 ASKA ZX = 0
12 ASKA ZY = 0
13 ASKA EAX = 0
14 ASKA [N] = EAX
15 LABEL FORLOOP
16 ASKA EAX = ZX
17 ASKA IMUL ZX
18 ASKA SHRD EAX,EDX,24
19 ASKA XX = EAX
--おお、これはまた格段に読みやすいし書きやすい!
--内部ではASKA文をCODE文に変換してバイナリを生成している...
--現在の行数:
---esbasic.cpp: 915行 (主要部分、以下に含まれないすべて)
---chr.cpp : 104行 (ゲーム向けの追加フォントのデータ)
---aska.cpp : 111行 (ASKA命令、CODE命令のための記述)
-''[2019.09.26(木)]''
--今日はNODEBUG命令を追加。これにより、コード範囲を NODEB...
-''[2019.09.27(金)]''
--ついに念願のDEBUGTRAP命令を追加。あとNORETURN命令も追加...
--なんかMEMコマンドを実行してみたら、メモリリークが発生し...
-''[2019.09.30(月)]''
--メモリリークは、END命令のときの終了処理が普段と違ってい...
--バッチファイルを実行する機能を実装。これも簡単だった。
--ASSERT命令を追加。デバッグモードの時、この命令はNOPにな...
--[アイデア]変数にライトプロテクトをかけられるようにする...
--[アイデア]現在の全状態を復元するのに必要なバッチファイ...
--[アイデア]メモリリーク検出支援。
--[アイデア]確保していないメモリ域をfreeしようとしたら停...
-''[2019.10.17(木)]''
--大規模に書き直そうとして、やっぱりやめた。少しずつ書き...
--いくつかの命令について、レジスタ変数的なものを使えるよ...
-''[2019.10.18(金)]''
--ASKAだけだとつまらなくなってきたのでNASM形式のアセンブ...
--乗算や右シフト付き乗算もレジスタ変数を使えるようにした...
-''[2019.11.08(金)]''
--やっと64bitでもプログラムを書いてRUNしたり、LISTしたり...
--(数時間後)
--おお、これでベンチマークに必要な全部の命令を移植できた...
-''[2019.12.13(金)]''
--ああ気が付いたら長らく何も書いてなかった。でも順調に開...
--ES-BASICはすごくいいのだけど、私はどちらかと言えばBASIC...
-''[2019.12.17(火)]''
--今日はES-BASICにBITBLT命令を追加して、インベーダゲーム...
--うーん、我ながら FORNE がカッコ悪い。FORっぽくない。FOR...
-''[2020.01.07(火)]''
--今日はES-BASICにセキュリティ機能を付けてみた。いずれもl...
--(1)ゼロ割りの判定: もうゼロで割り算しても落ちないよ!...
--(2)オーバーフロー判定: もうオーバーフローしたらちゃん...
-''[2020.01.20(月)]''
--kozossakai氏の絶大な協力により、ES-BASICはLinuxやFreeBS...
--乱数生成アルゴリズムを、Xorshiftに変更。
--OUTWIN命令を追加。
-''[2020.01.21(火)]''
--以下の命令を追加:
---CONNECT : 点を指定していくと、それをつないでいく。
---FILLOVALR : 中心と半径を指定して描く円。
---DRAWOVALR : 中心と半径を指定して描く円。
---BLTBIT : BITBLTの逆で、配列に画像を取り込む。
---BITBLTX : BITBLTに拡大縮小を可能にしたもの。
---PRINTF : printf。
---PRINTFF16 : PRINTFでFF16エンコードされた小数を表示する。
-''[2020.01.24(金)]''
--命令の引数処理のバグを修正。
--以下の命令を仕様変更:
---OUTWIN→SAVEWIN
--以下の命令を追加:
---ESCTERM
---LOADWIN
---文字列定数を使った配列への代入
---ARY INT DUMP6X
-''[2020.01.30(木)]''
--x64の機械語でちょっとわからないことがある。
--REX.Wプリフィクスを付けないPUSH reg(0x50~0x57)は、Rxx...
--単純なルールだけで考えるのなら、REX.Wプリフィクスがつか...
--なんでこんなことを疑問に思ったのかというと、Rxxを保存し...
--ということで確認しよう。ES-BASICなら簡単に確認できる。
--RSIに0x11111111_11111111を代入して、0x56して、RSIを0ク...
code 0x48 0xbe 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0...
--regsで結果を確認すると、RSIは0x11111111_11111111になっ...
-''[2020.02.19(水)]''
--ES-BASICは大進化中。
--まず32bitの実行ファイルを出力できるようにした。まだサポ...
---頑張るといっても、どこが省略可能な部分なのかを根気よく...
---これで 10 PRINTF "hello, world\n" をコンパイルして作っ...
---helloについてはもっと頑張れば1068まで減らせるのはわか...
--また、アセンブラの命令も実装中で、これができると、esbas...
* こめんと欄
#comment
終了行:
* ES-BASIC #4
-(by [[K]], 2019.09.06)
** (6) 開発メモ #1
-このメモを書き始めるまで:
--[2012.09.07] OSECPU-VMを作ろうと思い立つ。・・・これよ...
--[2013.03.??] セキュリティキャンプの教材にOSECPU-VMを使...
--[2013.08.??] セキュリティキャンプをやっているうちに、OS...
--[2015.03.17] 言語開発としてKH-FDPLというのを始める。[[K...
--[2016.02.17] C言語に永続変数を持たせる「Persistent-C」...
--[2016.10.24] 演算子や構文を自由に作れる「Essen」の開発...
--[2017.06.16] TL-1, TL-2, TL-3 を開発し、プログラミング...
--[2018.05.31] TJ01~TJ03を開発し、JITコンパイラを作るの...
--[2019.02.22] OSC2019 Tokyo/Spring で Essen2019-A を発表...
--[2019.04.16] 言語を何度も作りなおすのに疲れてきたので、...
--[2019.04.29] 開発に使う言語をC言語からC++へ変更すること...
--[2019.07.12] ついに ES-BASIC の開発を開始する。自作ライ...
--[2019.07.17] PUSH、POP命令を付けることで、グローバル変...
--[2019.07.24] 整数演算しかできないES-BASICだけど、固定小...
---(ここの3週間弱は、忙しくてほとんど開発できなかった時...
--[2019.08.15] スクロール命令を付けたので、スクロールする...
--[2019.08.23] SecHack365の福岡合宿で、ES-BASIC用のプログ...
--[2019.08.27] ラボユース合宿で、ついにプログラムがプログ...
--[2019.09.02] 代入文で、右辺に複数の演算子があるような「...
--[2019.09.03] 代入文以外の文脈でも式が使えるようになった...
--[2019.09.05] 今までどちらかと言えば軽い持ちで雑に作って...
-''[2019.09.06(金)]''
--GOTOやGOSUBのとび先で、ラベルを指定できるようになった。...
--一方で、自作ライブラリのKIndexHSクラスにはどうやらrehas...
--この時点で、esbasic.cppは864行。・・・行数が36行も増え...
--KIndexHSのrehashのバグは、rehashのせいではなかった。KMe...
-''[2019.09.09(月)]''
--コマンド処理で引数の省略の処理を一般化したらきっとかな...
--他でもいろいろ工夫して、トータルで500行くらいにできない...
-''[2019.09.11(水)]''
--プログラミング言語に依存しない汎用的な部分をライブラリ...
-''[2019.09.12(木)]''
--808行にはできた。うーん、あとはJITコンパイラのコア部分...
--グラフィックの機能については、言語と独立にあってもいい...
-''[2019.09.13(金)]''
--ちょっと間に合わせ感はあるけれど、とにかく上記方針で732...
--「プログラムを小さくするにはどうしたらいいのか」を考え...
--言語を作っていると、特にその言語固有の新しい機能とかを...
--ES-BASICにデバッグ支援機能として、LWAIT命令を付けてみた...
--正直これが有用かどうかは、今の私にはよくわからないけど...
--いろいろ試してみて、マイクロ秒をやめてナノ秒にしてみた...
-''[2019.09.14(土)]''
--なかなかよいアイデアを思いついた。これでES-BASICはデバ...
--詳しいことは後日書く予定。
-''[2019.09.17(火)]''
--[[esbasic0005]]を書いた。これはES-BASICの基本部分だけを...
--とりあえず89行で書けることはわかった。
--そして Shift+End を入力すれば、いつでもただちに停止でき...
-''[2019.09.18(水)]''
--[[esbasic0005]]を更新した。ライブラリ側にもうちょっと関...
-''[2019.09.19(木)]''
--私はES-BASICの中でたまにアセンブラを書きたくなる。いや...
--しかし普通にアセンブラを作るとそれは大掛かりになってし...
--今まで、そういう生々しい拡張(普通の言語っぽくないこと...
--将来的に互換性を保たなければいけない、みたいな気構えも...
--そうすることで見えてくるものもあると思うので。
--4時間くらい頑張ったらできた。追加したのは60行。これでイ...
--こんな感じの雰囲気。
13 CODE `xor 0X33 #RM:EAX,EAX
14 CODE `store 0X89 #RM:EAX,[N]
15 LABEL FORLOOP
16 CODE `load 0X8B #RM:EAX,ECX
17 CODE `imul 0XF7 #RM:5,ECX
18 CODE `shrd 0X0F 0XAC #RM:EDX,EAX 24
19 CODE `load 0X8B #RM:ESI,EAX
20 CODE `load 0X8B #RM:EAX,EBX
21 CODE `imul 0XF7 #RM:5,EBX
(中略)
36 CODE `load 0X8B #RM:EAX,[N]
37 CODE `inc_eax 0X40
38 CODE `store 0X89 #RM:EAX,[N]
39 CODE `cmp 0X81 #RM:7,EAX %446
40 CODE `jle 0X0F 0X8E #REL:FORLOOP
--ということで、すごく気軽に機械語で遊ぶ環境ができた。mod...
--もちろんES-BASICの他の命令と混在できるので、一番重たい...
--何か適当なファイル名を付けてソースを保存する必要はない...
--もちろん実行速度は爆速なので(機械語だから当然だけど)...
--アセンブラなのに Shift+End で停止することができて、しか...
-''[2019.09.20(金)]''
--ALIAS命令を付けて、レジスタ名を隠して書けるようにした。...
--そして各行ごとの実行回数をカウントして表示する機能も付...
--アセンブラでプログラミングしていると、ここは通っている...
--アセンブラの中で処理を中断してしまった時などは、なんと...
--ES-BASICはBASICなんだと思うとささやかなインパクトしかな...
--まあ基本的な使い方としては、まずES-BASICでお気軽に書い...
--現在ES-BASICは927行。
--11/23~11/24のOSCに出展する予定なので、それまでにオープ...
-''[2019.09.25(水)]''
--ES-BASICのCODE命令がやっぱり少々不便なので、ASKA命令を...
10 ALIAS ZX:ECX, ZY:EBX, XX:ESI, YY:EDI
11 ASKA ZX = 0
12 ASKA ZY = 0
13 ASKA EAX = 0
14 ASKA [N] = EAX
15 LABEL FORLOOP
16 ASKA EAX = ZX
17 ASKA IMUL ZX
18 ASKA SHRD EAX,EDX,24
19 ASKA XX = EAX
--おお、これはまた格段に読みやすいし書きやすい!
--内部ではASKA文をCODE文に変換してバイナリを生成している...
--現在の行数:
---esbasic.cpp: 915行 (主要部分、以下に含まれないすべて)
---chr.cpp : 104行 (ゲーム向けの追加フォントのデータ)
---aska.cpp : 111行 (ASKA命令、CODE命令のための記述)
-''[2019.09.26(木)]''
--今日はNODEBUG命令を追加。これにより、コード範囲を NODEB...
-''[2019.09.27(金)]''
--ついに念願のDEBUGTRAP命令を追加。あとNORETURN命令も追加...
--なんかMEMコマンドを実行してみたら、メモリリークが発生し...
-''[2019.09.30(月)]''
--メモリリークは、END命令のときの終了処理が普段と違ってい...
--バッチファイルを実行する機能を実装。これも簡単だった。
--ASSERT命令を追加。デバッグモードの時、この命令はNOPにな...
--[アイデア]変数にライトプロテクトをかけられるようにする...
--[アイデア]現在の全状態を復元するのに必要なバッチファイ...
--[アイデア]メモリリーク検出支援。
--[アイデア]確保していないメモリ域をfreeしようとしたら停...
-''[2019.10.17(木)]''
--大規模に書き直そうとして、やっぱりやめた。少しずつ書き...
--いくつかの命令について、レジスタ変数的なものを使えるよ...
-''[2019.10.18(金)]''
--ASKAだけだとつまらなくなってきたのでNASM形式のアセンブ...
--乗算や右シフト付き乗算もレジスタ変数を使えるようにした...
-''[2019.11.08(金)]''
--やっと64bitでもプログラムを書いてRUNしたり、LISTしたり...
--(数時間後)
--おお、これでベンチマークに必要な全部の命令を移植できた...
-''[2019.12.13(金)]''
--ああ気が付いたら長らく何も書いてなかった。でも順調に開...
--ES-BASICはすごくいいのだけど、私はどちらかと言えばBASIC...
-''[2019.12.17(火)]''
--今日はES-BASICにBITBLT命令を追加して、インベーダゲーム...
--うーん、我ながら FORNE がカッコ悪い。FORっぽくない。FOR...
-''[2020.01.07(火)]''
--今日はES-BASICにセキュリティ機能を付けてみた。いずれもl...
--(1)ゼロ割りの判定: もうゼロで割り算しても落ちないよ!...
--(2)オーバーフロー判定: もうオーバーフローしたらちゃん...
-''[2020.01.20(月)]''
--kozossakai氏の絶大な協力により、ES-BASICはLinuxやFreeBS...
--乱数生成アルゴリズムを、Xorshiftに変更。
--OUTWIN命令を追加。
-''[2020.01.21(火)]''
--以下の命令を追加:
---CONNECT : 点を指定していくと、それをつないでいく。
---FILLOVALR : 中心と半径を指定して描く円。
---DRAWOVALR : 中心と半径を指定して描く円。
---BLTBIT : BITBLTの逆で、配列に画像を取り込む。
---BITBLTX : BITBLTに拡大縮小を可能にしたもの。
---PRINTF : printf。
---PRINTFF16 : PRINTFでFF16エンコードされた小数を表示する。
-''[2020.01.24(金)]''
--命令の引数処理のバグを修正。
--以下の命令を仕様変更:
---OUTWIN→SAVEWIN
--以下の命令を追加:
---ESCTERM
---LOADWIN
---文字列定数を使った配列への代入
---ARY INT DUMP6X
-''[2020.01.30(木)]''
--x64の機械語でちょっとわからないことがある。
--REX.Wプリフィクスを付けないPUSH reg(0x50~0x57)は、Rxx...
--単純なルールだけで考えるのなら、REX.Wプリフィクスがつか...
--なんでこんなことを疑問に思ったのかというと、Rxxを保存し...
--ということで確認しよう。ES-BASICなら簡単に確認できる。
--RSIに0x11111111_11111111を代入して、0x56して、RSIを0ク...
code 0x48 0xbe 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0...
--regsで結果を確認すると、RSIは0x11111111_11111111になっ...
-''[2020.02.19(水)]''
--ES-BASICは大進化中。
--まず32bitの実行ファイルを出力できるようにした。まだサポ...
---頑張るといっても、どこが省略可能な部分なのかを根気よく...
---これで 10 PRINTF "hello, world\n" をコンパイルして作っ...
---helloについてはもっと頑張れば1068まで減らせるのはわか...
--また、アセンブラの命令も実装中で、これができると、esbas...
* こめんと欄
#comment
ページ名: