a21_memo01
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
* [[a21]]に関する雑記#1
-(by [[K]], 2021.01.26)
** 2021.01.25(月)
-今日は[[a21_txt01_3]]のTL-3を書きました。我ながらシンプ...
-ラベル名をうまく使って、分岐先のpc値を高速に求められるよ...
-でもなあ、goto命令だからなあ。やっぱり嫌がられてしまうか...
** 2021.01.26(火)
-うーん、この先の拡張を考えると、トークンコードの処理は別...
-TL-4で高速化して、TL-5で「式」を扱えるようにして、TL-6で...
** 2021.01.27(水)
-TL-4での高速化はやっぱりやめます。それはTL-5でやることに...
-TL-4でやるべきは「REPLの導入」だと思いなおしました。・・...
-その後の予定としては、TL-5で少し高速化して、TL-6でもっと...
-そのあたりまでできたら、次はTJシリーズに移行して、JITコ...
~
-TL-4ができました。REPLできるのはすごく楽しいです。これが...
** 2021.01.28(木)
-TLシリーズでどこまでやるかで少し悩んでいます。たぶんやり...
-ということで型も浮動小数点演算も配列も構造体も関数もロー...
-具体的な改造コードを提示しないまでも、こうすればできそう...
~
-[memo]あとでどこか別のところにまとめるつもりだけど、イン...
--[1] 実行ファイルがいらない。ソースコードだけあればよい...
--[2] インタプリタ言語のソースコードは(たいてい)機種依...
--[3] JITコンパイラとかであれば、それぞれの環境に応じた実...
--[4] インタプリタはREPLができる。
-対応するデメリット:
--[1] ソースがあっても処理系がないと動かない(どのバージ...
~
-現在手元で開発中のTL-6ですが、どうせやるならJITコンパイ...
--その後さらに頑張って、11.3倍まで速くできました。
** 2021.02.02(火)
-現在、TL-7で、演算子をどこまでサポートするかで悩んでいま...
-たくさんサポートすると、それだけでプログラムはかなり長く...
-でも少なすぎると、おんぼろすぎて、TL-7が魅力的には見えな...
** 2021.02.05(金)
-プログラムで変数に対する説明が省略されすぎじゃないかと言...
** 2021.02.06(土)
-今になって、lexer()とgetTc()を統合すればもっとすっきりと...
-それで、どういう話の流れにしたら最小の手間で自然にその結...
** 2021.02.15(月)
-私はTL-7でどうにかしてスタックマシンを構成しないで、式の...
** 2021.02.16(火)
-TL-7が手元ではできた!・・・454行で、9.50KB。これはかな...
** 2021.02.17(水)
-プログラムを差分で書いて説明しているけど、差分ではなく全...
** 2021.02.18(木)
-現在、手元では開発中のTL-9で、マンデルブロー集合の描画プ...
-今のTL-9は725行で、実行ファイルでは17.0KBです。グラフィ...
** 2021.02.19(金)
-TL-9でどこまでやるかを考えています。
--演算子:%
--組み込み関数:xorShift()
--組み込み関数:getPix()
--組み込み関数:fillRect0()
--この4つがあれば、[[esbasic02a]]の (4-3)「迷路作成(穴掘...
-さらに、
--配列変数のサポート。
--関数定義と関数呼び出し。
--演算子:&
--演算子:/
--演算子:< >= <=
--組み込み関数:ff16sin()
--組み込み関数:ff16cos()
--組み込み関数:inkey()
--組み込み関数:wait()
--ここまでやれば、[[esbasic02a]]の (4-4)「キューブ回転」 ...
-その先も、文字列の簡易サポートをして、組み込み関数をさら...
--(4-5)「インベーダゲーム」
--(4-6)「ブロック崩し」
-も移植できると思うのですが、そこまでやるかどうかは悩みど...
-でも、やったほうがおもしろいかなあとは思います。
----
-さらに考えを進めて、一つのソースコードで、gccでコンパイ...
--[1] lexer()を改造して、#を記号として認識させる。
--[2] ついでにコメントも書けるようにしてやる(おまけ)。
--[3] #ifndef TL9 ~ #endif で囲まれた範囲は、TL-9からは...
--[4] #ifdef TL9 ~ #endif で囲まれた範囲は、TL-9からは通...
--[5] #includeは無視する。
--[6] 組み込み関数の名前や仕様をaclライブラリの本来のもの...
** 2021.02.26(金)
-TL-9aまで作ってみて、自分で「これはとても良い出来栄えだ...
-ということでTLシリーズを書き直して、HLシリーズとして出直...
--TL-9aについては、ここで詳しく紹介しています。→[[a21_tl9...
** 2021.03.12(金)
-[1]
-今日はtwitterで、「10日くらいでできる!プログラミング自...
--https://twitter.com/hkawai3/status/1370198988096368643
-[2]
-やっぱり、言語の自作といえば、セルフホストは目標の一つだ...
--関数の定義と呼び出し機能。
--char型の配列をどうするか問題。ついに型に手を出すべきか...
--printf()をどうするか。まあprintfを使って実装してしまえ...
-うーん、これは100行じゃできなさそうだなあ。300行くらいか...
-300行頑張って、HL-9aが動かせるようになるなら本気でやりた...
-まあでもそこからさらに数百行頑張れば、HL-9aくらいはでき...
** 2021.03.23(火)
-自作言語を作る場合に、セルフホスト(自分自身のソースコー...
-私はこれがいい目標になっていることを認めつつも、しかしこ...
-私としては、かっこいいグラフィックが表示できてデモの見栄...
-しかしいざそこまでできて、この言語でさらに高みを目指すに...
-そして生産性をどう測るかですが、やっぱり同じプログラムを...
-さて私は何を作る際に生産性を高めたいのかというと、今は言...
-ということで、私は次はセルフホストを目指します!
** 2021.04.05(月)
-HL-9aをJITコンパイラ化しても、全然速くならない!もとのHL...
** 2021.04.06(火)
-やはりレジスタ変数をサポートしたほうがいいのだろうか・・...
-うーん、説明が面倒になるから、できればレジスタ変数は話題...
-しかしレジスタ変数を扱わないと、結局JITコンパイラのメリ...
-よし、いろいろ試行錯誤した結果、難易度をあまり上げずに高...
** 2021.04.08(木)
-JITコンパイラで性能を出すためにどうしたらいいのかを試行...
-それでふと思いついたのですが、HL-9aだってレジスタ変数を...
-原因を調べてみたところ、HL-9aの場合は変数アクセスのほか...
-なるほどなあ。
** 2021.04.09(金)
-mandel.cの実行速度比較メモ。
--gcc(x86の32bit): 4.0秒(さすがに速い!)
--HL-9a(x86の32bit): 27.6秒
--HL-14(仮)(x86の32bit, JITコンパイラ版, レジスタ変数なし...
--HL-14(仮)(x86の32bit, JITコンパイラ版, レジスタ変数あり...
-おお、かなり速くなった!・・・あれ?gccよりも速くなって...
--gcc(x64): 3.2秒(おおー!さすがだー)
** 2021.04.23(金)
-いつの間にか登録されていた。ありがたやー。
--https://b.hatena.ne.jp/entry/essen.osask.jp/?a21_txt01
-「作者の作風が活かされていて、気軽で実践的なテイスト。と...
** 2021.05.01(土)
-gcc-O3と同じくらいの速さが906行のHL-14aで実現できてしま...
-そしてサイズを小さくすることは、ひいてはキャッシュヒット...
** 2021.05.07(金)
-どうにかがんばって、HL-17のプログラムはできた。もっと頑...
** 2021.05.17(月)
-HL-22aまでやって、アセンブラ出力もやって、それでそろそろ...
-そして言語に「型」を導入して、構造体も使えるようになりた...
** 2021.05.28(金)
-HL-13以降の説明が、どんどん雑になっている気がする。これ...
-これは私が教材の開発のほうが面白くなってしまって、文章ま...
-少しずつ直さなければ!
** 2021.05.31(月)
-ちょっと思いついたのでメモ。
-x86やx64は、機械語をそのまま出すよりも、一回以下の構造体...
??? {
int op; // オペコード
signed char preg, mreg, bas, idx, scl;
// pregはmod r/mの真ん中のレジスタ
// mregはmod r/mで表すレジスタ(ここが-1だとレジ...
// basはmod r/mで表すベースレジスタ(使わないの...
// idxはsibで表すインデックスレジスタ(使わない...
// sclはsibで表すスケールファクタ(使わないのな...
int dsp; // mod r/mのディスプレースメント
int imm32;
AInt64 imm64;
};
** 2021.06.01(火)
-HL-22bが終わったら真っ先にやりたいこと。
--[1] HL-9a, HL-16b, HL-22b を統合する。
--[2] 整数型以外も扱えるようにする。
** 2021.06.03(木)
-HL-22bを書いているうちに気づいたこと。ややや、HL-18以降...
** 2021.06.30(水)
-ここしばらく、ずっとHLX-001の開発をやっているのですが、...
-なんでなかなかしっくりこない気がするんだろうって考えてみ...
-それはきっと判断の基準が無意識のうちにHL-22bになっている...
-HL-22bのできが良かったんです。自分でも驚くくらいに良かっ...
-まあそんなことがわかっても何の解決にもならないのですが、...
** 2021.07.08(木)
-HLX-001では、命令長も自動で最適なものを選べるようにした...
-できるだけ柔軟にこれを処理できるようになりたいです。
-(数時間後)
-ついに「しっくりくる」内部構成にたどり着いたかも?! 期...
** 2021.07.09(金)
-[今日の勉強]
--x64で「CALL RAX」の機械語は、REXプリフィクスなしの「ff ...
** 2021.07.14(水)
-HLX-001でprintくらいはできるようになりました。しかしまだ...
** 2021.07.16(金)
-HLX-001で加減乗除などの演算もできるようになりました! こ...
** 2021.07.20(火)
-HLX-001での分岐処理、うまくできるようになりました。これ...
--遠くに飛ぶときはHL-22bなどと同様に 0f 8x xx xx xx xx を...
** 2021.07.26(月)
-JITコンパイラのコード生成の質の比較:
||grd.c|mandel.c|maze.c|kcube.c|invader.c|
|HL-16a|RIGHT:158|RIGHT:622|RIGHT:1274|RIGHT:3125|RIGHT:1...
|HLX-001 (2021.07.21版)|RIGHT:266|RIGHT:1004|RIGHT:1931|R...
-こうしてみると、HL-16aにはまだまだ及ばないことがよくわか...
-これは現状のHLX-001がほとんど最適化をやっていないせいで...
-これがあれば、それより上位では、無駄な計算を書いてしまっ...
** 2021.07.30(金)~2021.08.02(月)
-JITコンパイラのコード生成の質の比較:
||grd.c|mandel.c|maze.c|kcube.c|invader.c||
|HL-16a|RIGHT:158|RIGHT:622|RIGHT:1274|RIGHT:3125|RIGHT:1...
|HL-16a|RIGHT:230|RIGHT:760|RIGHT:1542|RIGHT:3503|RIGHT:2...
|HLX-001 (2021.07.21版)|RIGHT:266|RIGHT:1004|RIGHT:1931|R...
|HLX-001 (2021.07.30a版)|RIGHT:242|RIGHT:944|RIGHT:1919|R...
|HLX-001 (2021.07.30b版)|RIGHT:242|RIGHT:908|RIGHT:1919|R...
|HLX-001 (2021.07.31版)|RIGHT:210|RIGHT:740|RIGHT:1525|RI...
|HLX-001 (2021.08.01版)|RIGHT:206|RIGHT:730|RIGHT:1497|RI...
|HLX-001 (2021.08.02版)|RIGHT:192|RIGHT:679|RIGHT:1486|RI...
-(2021.07.30a版)の説明:
--わざわざ演算したのにその結果を使わない記述が見つかった...
-(2021.07.30b版)の説明:
-- _t0=a+b; c=_t0;みたいなコードを生成してしまうことがあ...
** 2021.08.03(火)
-JITコンパイラのコード生成の質の比較:
||grd.c|mandel.c|maze.c|kcube.c|invader.c||
|HL-16a|RIGHT:158|RIGHT:622|RIGHT:1274|RIGHT:3125|RIGHT:1...
|HLX-001 (2021.08.03版)|RIGHT:109|RIGHT:529|RIGHT:1194|RI...
** 2021.08.05(木)
-[1] HLX-001のJITコンパイラでは、いきなりx86やx64の機械語...
--なぜこうしたのかというと、中間コードにすればインタプリ...
-[2] LLVMでも共通中間言語みたいなものはあると思いますが(...
--そうすると、次はどんなバイナリ形式がいいかということに...
--基本的にはintの配列を採用しています。そしてその命令長は...
-[3](翌日に追記)命令フォーマットを再設計しました。効果...
** 2021.08.06(金)
-そろそろHLX-001を公開へもっていきたいと思っています。そ...
--[1]スタック変数をサポートする
--[2]x64対応がうまくいっているかテストする
--[3]HL-9aっぽいインタプリタを載せる
-とりあえずこの3つができたら公開したいです。アセンブラ出...
** 2021.08.11(水)
-HLX-001の進捗
--[1]スタック変数のサポートはできた!
--[2]x64対応がうまくいっているかのテストはこれから
--[3]HL-9aっぽいインタプリタを載せるのは作業中
||grd.c|mandel.c|maze.c|kcube.c|invader.c||
|HL-16a|RIGHT:158|RIGHT:622|RIGHT:1274|RIGHT:3125|RIGHT:1...
|HLX-001 (2021.08.03版)|RIGHT:109|RIGHT:529|RIGHT:1194|RI...
|HLX-001 (2021.08.10版)|RIGHT:120|RIGHT:413|RIGHT:957|RIG...
-grd.cが大きくなってしまったので、そこは改良の余地があり...
** 2021.08.16(月)
-HLX-001の進捗
--[1]スタック変数のサポートはできた!
--[2]x64対応がうまくいっているかのテストもクリア
--[3]HL-9aっぽいインタプリタを載せるのもできた
-どのくらい性能が向上したのかをmandel.cで確認しています。
--[1] HL-9aとの比較
|HL-9a vs HLX-001|32bitモード(x86)|29.667秒 vs ''23.220...
|HL-9a vs HLX-001|64bitモード(x64)|26.904秒 vs ''18.653...
--[2] HL-16aとの比較(32bitモード(x86))
|HL-16a vs HLX-001|3.246秒(657バイト) vs ''3.272秒(609バ...
|HL-16a vs HLX-001|3.730秒(613バイト) vs ''3.660秒(411バ...
--[3] HL-22aとの比較(64bitモード(x64))
|HL-22a vs HLX-001|2.503秒(674バイト) vs ''2.512秒(655バ...
|HL-22a vs HLX-001|3.449秒(588バイト) vs ''3.459秒(489バ...
--[考察]
---[1]のHL-9aとの比較では、HLX-001になって有意に性能が向...
---[2]のHL-16aとの比較では、有意な速度の向上はありません...
---[3]のHL-22aとの比較では、有意な速度の向上はありません...
** 2021.08.27(金)
-C言語にはプリプロセッサがあって、#if~#endifがあります。...
-HLX-001では、ifの中の条件式が定数式であれば、最適化によ...
-普通のif文にしておけば、もし定数ではなく変数で判断したく...
//-私は同じようなことをする機能が複数あるのは嫌いです。そ...
** 2021.09.07(火)
-さっきふと思いついて、printf()を追加してみました。これが...
for (i = 1; i <= 9; i++) {
for (j = 1; j <= 9; j++) {
printf("%2d ", i * j);
}
printf("\n");
}
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81
** 2021.09.24(金)
-HLXで型をどう扱うか考えています。これは次のバージョンで...
-まず、C++みたいなクラスは欲しいです。一方で、多重継承と...
--仮想関数は、自分で関数ポインタを管理すればいいかな、と...
--いやまあ、サポートするかもしれないけど。
--仮に仮想関数をサポートするとして、使う予定のない仮想関...
--そうなると、「絶対にこの文脈ではこの型が来る」という記...
-テンプレートも使えないよりは使えたほうがいいかなあ。
--まあそれほど実現は難しくないかもしれない気がします。
-仮想関数をサポートしたとして、vtableがそのクラスのすべて...
--malloc/freeで領域サイズをヒープブロックの先頭の前に入れ...
-コンストラクタとデストラクタは欲しいです。あったらきっと...
-これは型からは少しそれるけど、メモリ管理として、ガーベー...
--でもマークアンドスイープやリンクカウント方式は好きじゃ...
--大事なのは確実に管理できることじゃなくて、「維持する手...
--そうであれば、やっぱりAutoReleasePool方式がよさそうな気...
-オブジェクトの最適化ついて:
--このメンバ関数が呼ばれたら「オブジェクトは利用された」...
-関数の引数の最適化について:
--「この引数は呼び出し先では結局一度も使われていない」と...
--積むのを省略するだけじゃなくて、並び順から消してしまっ...
-オブジェクトの利用回数について:
--今は文脈を読んで、今代入した値が使われる前に上書きする...
-クラス内のオブジェクトについて:
--あるクラスのメンバが誰からも使われないのなら、消してし...
** 2021.11.18(木)
-しばらくここに書いていませんでしたが、いろいろバージョン...
--'A'とか'b'を書けるようにしました。'\0'や'\n'も使えます。
--ifやforで { } を使わずに1文だけ書くやつができるようにな...
--C言語風の記述で、以前のバージョンでは変数宣言があった場...
--ほぼすべて大文字で書ける、BASIC風の書き方も混在できるよ...
** 2021.12.17(金)
-先日リリースしたばかりの hlx003b ですが、BASIC風で書いた...
// 条件ジャンプで1命令だけ飛ばす。
// そして次の命令が無条件分岐。
// そういう場合は、条件ジャンプを反転させて、ジャンプ先を...
// レジスタ変数をもっと増やしたい
// できるだけたくさん増やすモードを付ける
// 関数呼び出し前に専用領域へ退避させる
// 引数処理は、読み替えればいい。
// JITコンパイラをJITコンパイラで拡張する。
// 配列や構造体への連続代入
// 自動enum。クラス名を書けば、enumしてくれる。
* こめんと欄
#comment
終了行:
* [[a21]]に関する雑記#1
-(by [[K]], 2021.01.26)
** 2021.01.25(月)
-今日は[[a21_txt01_3]]のTL-3を書きました。我ながらシンプ...
-ラベル名をうまく使って、分岐先のpc値を高速に求められるよ...
-でもなあ、goto命令だからなあ。やっぱり嫌がられてしまうか...
** 2021.01.26(火)
-うーん、この先の拡張を考えると、トークンコードの処理は別...
-TL-4で高速化して、TL-5で「式」を扱えるようにして、TL-6で...
** 2021.01.27(水)
-TL-4での高速化はやっぱりやめます。それはTL-5でやることに...
-TL-4でやるべきは「REPLの導入」だと思いなおしました。・・...
-その後の予定としては、TL-5で少し高速化して、TL-6でもっと...
-そのあたりまでできたら、次はTJシリーズに移行して、JITコ...
~
-TL-4ができました。REPLできるのはすごく楽しいです。これが...
** 2021.01.28(木)
-TLシリーズでどこまでやるかで少し悩んでいます。たぶんやり...
-ということで型も浮動小数点演算も配列も構造体も関数もロー...
-具体的な改造コードを提示しないまでも、こうすればできそう...
~
-[memo]あとでどこか別のところにまとめるつもりだけど、イン...
--[1] 実行ファイルがいらない。ソースコードだけあればよい...
--[2] インタプリタ言語のソースコードは(たいてい)機種依...
--[3] JITコンパイラとかであれば、それぞれの環境に応じた実...
--[4] インタプリタはREPLができる。
-対応するデメリット:
--[1] ソースがあっても処理系がないと動かない(どのバージ...
~
-現在手元で開発中のTL-6ですが、どうせやるならJITコンパイ...
--その後さらに頑張って、11.3倍まで速くできました。
** 2021.02.02(火)
-現在、TL-7で、演算子をどこまでサポートするかで悩んでいま...
-たくさんサポートすると、それだけでプログラムはかなり長く...
-でも少なすぎると、おんぼろすぎて、TL-7が魅力的には見えな...
** 2021.02.05(金)
-プログラムで変数に対する説明が省略されすぎじゃないかと言...
** 2021.02.06(土)
-今になって、lexer()とgetTc()を統合すればもっとすっきりと...
-それで、どういう話の流れにしたら最小の手間で自然にその結...
** 2021.02.15(月)
-私はTL-7でどうにかしてスタックマシンを構成しないで、式の...
** 2021.02.16(火)
-TL-7が手元ではできた!・・・454行で、9.50KB。これはかな...
** 2021.02.17(水)
-プログラムを差分で書いて説明しているけど、差分ではなく全...
** 2021.02.18(木)
-現在、手元では開発中のTL-9で、マンデルブロー集合の描画プ...
-今のTL-9は725行で、実行ファイルでは17.0KBです。グラフィ...
** 2021.02.19(金)
-TL-9でどこまでやるかを考えています。
--演算子:%
--組み込み関数:xorShift()
--組み込み関数:getPix()
--組み込み関数:fillRect0()
--この4つがあれば、[[esbasic02a]]の (4-3)「迷路作成(穴掘...
-さらに、
--配列変数のサポート。
--関数定義と関数呼び出し。
--演算子:&
--演算子:/
--演算子:< >= <=
--組み込み関数:ff16sin()
--組み込み関数:ff16cos()
--組み込み関数:inkey()
--組み込み関数:wait()
--ここまでやれば、[[esbasic02a]]の (4-4)「キューブ回転」 ...
-その先も、文字列の簡易サポートをして、組み込み関数をさら...
--(4-5)「インベーダゲーム」
--(4-6)「ブロック崩し」
-も移植できると思うのですが、そこまでやるかどうかは悩みど...
-でも、やったほうがおもしろいかなあとは思います。
----
-さらに考えを進めて、一つのソースコードで、gccでコンパイ...
--[1] lexer()を改造して、#を記号として認識させる。
--[2] ついでにコメントも書けるようにしてやる(おまけ)。
--[3] #ifndef TL9 ~ #endif で囲まれた範囲は、TL-9からは...
--[4] #ifdef TL9 ~ #endif で囲まれた範囲は、TL-9からは通...
--[5] #includeは無視する。
--[6] 組み込み関数の名前や仕様をaclライブラリの本来のもの...
** 2021.02.26(金)
-TL-9aまで作ってみて、自分で「これはとても良い出来栄えだ...
-ということでTLシリーズを書き直して、HLシリーズとして出直...
--TL-9aについては、ここで詳しく紹介しています。→[[a21_tl9...
** 2021.03.12(金)
-[1]
-今日はtwitterで、「10日くらいでできる!プログラミング自...
--https://twitter.com/hkawai3/status/1370198988096368643
-[2]
-やっぱり、言語の自作といえば、セルフホストは目標の一つだ...
--関数の定義と呼び出し機能。
--char型の配列をどうするか問題。ついに型に手を出すべきか...
--printf()をどうするか。まあprintfを使って実装してしまえ...
-うーん、これは100行じゃできなさそうだなあ。300行くらいか...
-300行頑張って、HL-9aが動かせるようになるなら本気でやりた...
-まあでもそこからさらに数百行頑張れば、HL-9aくらいはでき...
** 2021.03.23(火)
-自作言語を作る場合に、セルフホスト(自分自身のソースコー...
-私はこれがいい目標になっていることを認めつつも、しかしこ...
-私としては、かっこいいグラフィックが表示できてデモの見栄...
-しかしいざそこまでできて、この言語でさらに高みを目指すに...
-そして生産性をどう測るかですが、やっぱり同じプログラムを...
-さて私は何を作る際に生産性を高めたいのかというと、今は言...
-ということで、私は次はセルフホストを目指します!
** 2021.04.05(月)
-HL-9aをJITコンパイラ化しても、全然速くならない!もとのHL...
** 2021.04.06(火)
-やはりレジスタ変数をサポートしたほうがいいのだろうか・・...
-うーん、説明が面倒になるから、できればレジスタ変数は話題...
-しかしレジスタ変数を扱わないと、結局JITコンパイラのメリ...
-よし、いろいろ試行錯誤した結果、難易度をあまり上げずに高...
** 2021.04.08(木)
-JITコンパイラで性能を出すためにどうしたらいいのかを試行...
-それでふと思いついたのですが、HL-9aだってレジスタ変数を...
-原因を調べてみたところ、HL-9aの場合は変数アクセスのほか...
-なるほどなあ。
** 2021.04.09(金)
-mandel.cの実行速度比較メモ。
--gcc(x86の32bit): 4.0秒(さすがに速い!)
--HL-9a(x86の32bit): 27.6秒
--HL-14(仮)(x86の32bit, JITコンパイラ版, レジスタ変数なし...
--HL-14(仮)(x86の32bit, JITコンパイラ版, レジスタ変数あり...
-おお、かなり速くなった!・・・あれ?gccよりも速くなって...
--gcc(x64): 3.2秒(おおー!さすがだー)
** 2021.04.23(金)
-いつの間にか登録されていた。ありがたやー。
--https://b.hatena.ne.jp/entry/essen.osask.jp/?a21_txt01
-「作者の作風が活かされていて、気軽で実践的なテイスト。と...
** 2021.05.01(土)
-gcc-O3と同じくらいの速さが906行のHL-14aで実現できてしま...
-そしてサイズを小さくすることは、ひいてはキャッシュヒット...
** 2021.05.07(金)
-どうにかがんばって、HL-17のプログラムはできた。もっと頑...
** 2021.05.17(月)
-HL-22aまでやって、アセンブラ出力もやって、それでそろそろ...
-そして言語に「型」を導入して、構造体も使えるようになりた...
** 2021.05.28(金)
-HL-13以降の説明が、どんどん雑になっている気がする。これ...
-これは私が教材の開発のほうが面白くなってしまって、文章ま...
-少しずつ直さなければ!
** 2021.05.31(月)
-ちょっと思いついたのでメモ。
-x86やx64は、機械語をそのまま出すよりも、一回以下の構造体...
??? {
int op; // オペコード
signed char preg, mreg, bas, idx, scl;
// pregはmod r/mの真ん中のレジスタ
// mregはmod r/mで表すレジスタ(ここが-1だとレジ...
// basはmod r/mで表すベースレジスタ(使わないの...
// idxはsibで表すインデックスレジスタ(使わない...
// sclはsibで表すスケールファクタ(使わないのな...
int dsp; // mod r/mのディスプレースメント
int imm32;
AInt64 imm64;
};
** 2021.06.01(火)
-HL-22bが終わったら真っ先にやりたいこと。
--[1] HL-9a, HL-16b, HL-22b を統合する。
--[2] 整数型以外も扱えるようにする。
** 2021.06.03(木)
-HL-22bを書いているうちに気づいたこと。ややや、HL-18以降...
** 2021.06.30(水)
-ここしばらく、ずっとHLX-001の開発をやっているのですが、...
-なんでなかなかしっくりこない気がするんだろうって考えてみ...
-それはきっと判断の基準が無意識のうちにHL-22bになっている...
-HL-22bのできが良かったんです。自分でも驚くくらいに良かっ...
-まあそんなことがわかっても何の解決にもならないのですが、...
** 2021.07.08(木)
-HLX-001では、命令長も自動で最適なものを選べるようにした...
-できるだけ柔軟にこれを処理できるようになりたいです。
-(数時間後)
-ついに「しっくりくる」内部構成にたどり着いたかも?! 期...
** 2021.07.09(金)
-[今日の勉強]
--x64で「CALL RAX」の機械語は、REXプリフィクスなしの「ff ...
** 2021.07.14(水)
-HLX-001でprintくらいはできるようになりました。しかしまだ...
** 2021.07.16(金)
-HLX-001で加減乗除などの演算もできるようになりました! こ...
** 2021.07.20(火)
-HLX-001での分岐処理、うまくできるようになりました。これ...
--遠くに飛ぶときはHL-22bなどと同様に 0f 8x xx xx xx xx を...
** 2021.07.26(月)
-JITコンパイラのコード生成の質の比較:
||grd.c|mandel.c|maze.c|kcube.c|invader.c|
|HL-16a|RIGHT:158|RIGHT:622|RIGHT:1274|RIGHT:3125|RIGHT:1...
|HLX-001 (2021.07.21版)|RIGHT:266|RIGHT:1004|RIGHT:1931|R...
-こうしてみると、HL-16aにはまだまだ及ばないことがよくわか...
-これは現状のHLX-001がほとんど最適化をやっていないせいで...
-これがあれば、それより上位では、無駄な計算を書いてしまっ...
** 2021.07.30(金)~2021.08.02(月)
-JITコンパイラのコード生成の質の比較:
||grd.c|mandel.c|maze.c|kcube.c|invader.c||
|HL-16a|RIGHT:158|RIGHT:622|RIGHT:1274|RIGHT:3125|RIGHT:1...
|HL-16a|RIGHT:230|RIGHT:760|RIGHT:1542|RIGHT:3503|RIGHT:2...
|HLX-001 (2021.07.21版)|RIGHT:266|RIGHT:1004|RIGHT:1931|R...
|HLX-001 (2021.07.30a版)|RIGHT:242|RIGHT:944|RIGHT:1919|R...
|HLX-001 (2021.07.30b版)|RIGHT:242|RIGHT:908|RIGHT:1919|R...
|HLX-001 (2021.07.31版)|RIGHT:210|RIGHT:740|RIGHT:1525|RI...
|HLX-001 (2021.08.01版)|RIGHT:206|RIGHT:730|RIGHT:1497|RI...
|HLX-001 (2021.08.02版)|RIGHT:192|RIGHT:679|RIGHT:1486|RI...
-(2021.07.30a版)の説明:
--わざわざ演算したのにその結果を使わない記述が見つかった...
-(2021.07.30b版)の説明:
-- _t0=a+b; c=_t0;みたいなコードを生成してしまうことがあ...
** 2021.08.03(火)
-JITコンパイラのコード生成の質の比較:
||grd.c|mandel.c|maze.c|kcube.c|invader.c||
|HL-16a|RIGHT:158|RIGHT:622|RIGHT:1274|RIGHT:3125|RIGHT:1...
|HLX-001 (2021.08.03版)|RIGHT:109|RIGHT:529|RIGHT:1194|RI...
** 2021.08.05(木)
-[1] HLX-001のJITコンパイラでは、いきなりx86やx64の機械語...
--なぜこうしたのかというと、中間コードにすればインタプリ...
-[2] LLVMでも共通中間言語みたいなものはあると思いますが(...
--そうすると、次はどんなバイナリ形式がいいかということに...
--基本的にはintの配列を採用しています。そしてその命令長は...
-[3](翌日に追記)命令フォーマットを再設計しました。効果...
** 2021.08.06(金)
-そろそろHLX-001を公開へもっていきたいと思っています。そ...
--[1]スタック変数をサポートする
--[2]x64対応がうまくいっているかテストする
--[3]HL-9aっぽいインタプリタを載せる
-とりあえずこの3つができたら公開したいです。アセンブラ出...
** 2021.08.11(水)
-HLX-001の進捗
--[1]スタック変数のサポートはできた!
--[2]x64対応がうまくいっているかのテストはこれから
--[3]HL-9aっぽいインタプリタを載せるのは作業中
||grd.c|mandel.c|maze.c|kcube.c|invader.c||
|HL-16a|RIGHT:158|RIGHT:622|RIGHT:1274|RIGHT:3125|RIGHT:1...
|HLX-001 (2021.08.03版)|RIGHT:109|RIGHT:529|RIGHT:1194|RI...
|HLX-001 (2021.08.10版)|RIGHT:120|RIGHT:413|RIGHT:957|RIG...
-grd.cが大きくなってしまったので、そこは改良の余地があり...
** 2021.08.16(月)
-HLX-001の進捗
--[1]スタック変数のサポートはできた!
--[2]x64対応がうまくいっているかのテストもクリア
--[3]HL-9aっぽいインタプリタを載せるのもできた
-どのくらい性能が向上したのかをmandel.cで確認しています。
--[1] HL-9aとの比較
|HL-9a vs HLX-001|32bitモード(x86)|29.667秒 vs ''23.220...
|HL-9a vs HLX-001|64bitモード(x64)|26.904秒 vs ''18.653...
--[2] HL-16aとの比較(32bitモード(x86))
|HL-16a vs HLX-001|3.246秒(657バイト) vs ''3.272秒(609バ...
|HL-16a vs HLX-001|3.730秒(613バイト) vs ''3.660秒(411バ...
--[3] HL-22aとの比較(64bitモード(x64))
|HL-22a vs HLX-001|2.503秒(674バイト) vs ''2.512秒(655バ...
|HL-22a vs HLX-001|3.449秒(588バイト) vs ''3.459秒(489バ...
--[考察]
---[1]のHL-9aとの比較では、HLX-001になって有意に性能が向...
---[2]のHL-16aとの比較では、有意な速度の向上はありません...
---[3]のHL-22aとの比較では、有意な速度の向上はありません...
** 2021.08.27(金)
-C言語にはプリプロセッサがあって、#if~#endifがあります。...
-HLX-001では、ifの中の条件式が定数式であれば、最適化によ...
-普通のif文にしておけば、もし定数ではなく変数で判断したく...
//-私は同じようなことをする機能が複数あるのは嫌いです。そ...
** 2021.09.07(火)
-さっきふと思いついて、printf()を追加してみました。これが...
for (i = 1; i <= 9; i++) {
for (j = 1; j <= 9; j++) {
printf("%2d ", i * j);
}
printf("\n");
}
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81
** 2021.09.24(金)
-HLXで型をどう扱うか考えています。これは次のバージョンで...
-まず、C++みたいなクラスは欲しいです。一方で、多重継承と...
--仮想関数は、自分で関数ポインタを管理すればいいかな、と...
--いやまあ、サポートするかもしれないけど。
--仮に仮想関数をサポートするとして、使う予定のない仮想関...
--そうなると、「絶対にこの文脈ではこの型が来る」という記...
-テンプレートも使えないよりは使えたほうがいいかなあ。
--まあそれほど実現は難しくないかもしれない気がします。
-仮想関数をサポートしたとして、vtableがそのクラスのすべて...
--malloc/freeで領域サイズをヒープブロックの先頭の前に入れ...
-コンストラクタとデストラクタは欲しいです。あったらきっと...
-これは型からは少しそれるけど、メモリ管理として、ガーベー...
--でもマークアンドスイープやリンクカウント方式は好きじゃ...
--大事なのは確実に管理できることじゃなくて、「維持する手...
--そうであれば、やっぱりAutoReleasePool方式がよさそうな気...
-オブジェクトの最適化ついて:
--このメンバ関数が呼ばれたら「オブジェクトは利用された」...
-関数の引数の最適化について:
--「この引数は呼び出し先では結局一度も使われていない」と...
--積むのを省略するだけじゃなくて、並び順から消してしまっ...
-オブジェクトの利用回数について:
--今は文脈を読んで、今代入した値が使われる前に上書きする...
-クラス内のオブジェクトについて:
--あるクラスのメンバが誰からも使われないのなら、消してし...
** 2021.11.18(木)
-しばらくここに書いていませんでしたが、いろいろバージョン...
--'A'とか'b'を書けるようにしました。'\0'や'\n'も使えます。
--ifやforで { } を使わずに1文だけ書くやつができるようにな...
--C言語風の記述で、以前のバージョンでは変数宣言があった場...
--ほぼすべて大文字で書ける、BASIC風の書き方も混在できるよ...
** 2021.12.17(金)
-先日リリースしたばかりの hlx003b ですが、BASIC風で書いた...
// 条件ジャンプで1命令だけ飛ばす。
// そして次の命令が無条件分岐。
// そういう場合は、条件ジャンプを反転させて、ジャンプ先を...
// レジスタ変数をもっと増やしたい
// できるだけたくさん増やすモードを付ける
// 関数呼び出し前に専用領域へ退避させる
// 引数処理は、読み替えればいい。
// JITコンパイラをJITコンパイラで拡張する。
// 配列や構造体への連続代入
// 自動enum。クラス名を書けば、enumしてくれる。
* こめんと欄
#comment
ページ名: