a25_kharcs5
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
* kharcs #5
-(by [[K]], 2025.06.26)
** (0) これはなに?
-(kharcsページは、kharc開発でわかったことを整理して説明...
-今回説明したいこと: ~この順番でCコンパイラを作ったら早...
--[1]~[6]→[[a25_kharcs2]]
--[7]→[[a25_kharcs3]]
--[8]~[14]→[[a25_kharcs4]]
--[15]3dwavei(18日目)
--[16]kcubei(19日目)
--[17]高速化(20日目)
--[18]ここまでのまとめ
** (15) 3dwavei(18日目:6/26)
-配列が使えれば3dwaveiができるはずなので、足りない機能(s...
-ちゃんとうねうねと動きました!
--https://essen.osask.jp/files/pic20250626a.png
#include "kharc.h"
int main()
{
int w, t, x, y, d, z, x0, y0, x1, y1, y0x0, y0x1, y1...
w = openWin(640, 480);
for (t = 0; isClose(w) == 0; t++) {
wait(8); fillRect(w, 640, 480, 0, 0, 0x000000);
for (y = -20; y <= 21; y++) {
for (x = -20; x <= 21; x++) {
d = ff16Sqrt((x * x + y * y) * 65536);
z = ff16Sin(((d * 652) >> 12) - 1043 * t...
x0 = x + 19; y0 = y + 19; x1 = x + 20; y...
y1x1 = y1 * 42 + x1; y0x0 = y0 * 42 + x0...
gx[y1x1] = (x * 2 - y * 2 + z * 0) * 4 +...
gy[y1x1] = (x * 2 + y * 2 + z * 1) * 2 +...
if (x0 >= 0) { if (y0 >= 0) {
drawLine(w, gx[y0x0], gy[y0x0], gx[y...
drawLine(w, gx[y0x0], gy[y0x0], gx[y...
}}
}
}
}
return 0;
}
** (16) kcubei(19日目:6/27)
-配列処理を多用するプログラムとして、キューブ回転プログラ...
--https://essen.osask.jp/files/pic20250627a.png
--ちなみにこのキューブの面の色の計算方法は、各面の外向き...
--Z軸は光線の方向として想定したものです。・・・この、面の...
--面の法線ベクトルは、隣り合った2つの辺の外積を計算すれば...
** (17) 高速化(20日目:6/30)
-さてここで少し冷静になって考えてみました。
-私はこのkccを常用するようになるでしょうか。・・・もし作...
-まずkccはgccよりも便利になるでしょうか。・・・はい、私に...
-しかし便利になっても、その機能を使うかどうかはまた別です...
-gccでコンパイルできないとなると、実行速度としてgcc比で1....
-まあでも、それなら速度が欲しい部分(たぶんソースコード中...
-速度比1.5倍くらいなら、この使い分けでほとんど問題になら...
-と、ここまで考えたとき、ふと思いつきました。
-kccはbuntan-pcのコード生成にも使えるほどの柔軟性があるの...
-・・・現状ではメモリイメージを真似することにこだわって、...
-普通の変数として宣言してアクセスするようにすれば、gccが...
-これは試す価値がありそうなので、やってみることにします。
-[1]コンパイル前のコード
int fib(int i)
{
if (i > 1) {
i = fib(i - 2) + fib(i - 1);
}
return i;
}
-[2]kccでコンパイルした結果(このバージョンから補助情報が...
Lb_I(5);
Sub_AI(SP,16); Sto_AMd(RP,SP,12);
Lod_RMd(R0,SP,16); CmFrJle_RII(R0,1,8);
Lod_RMd(R0,SP,16); Add_RI(R0,-2); Sto_RMd(R0,SP,0);
Mov_AI(RP,6); Jmp_I(5); Lb_I(6); Sto_RMd(R0,SP,8);
Lod_RMd(R0,SP,16); Add_RI(R0,-1); Sto_RMd(R0,SP,0);
Mov_AI(RP,7); Jmp_I(5); Lb_I(7);
Lod_RMd(R1,SP,8); Add_RR(R0,R1); Sto_RMd(R0,SP,1...
Lb_I(8);
Lod_RMd(R0,SP,16);
Lod_AMd(RP,SP,12); Add_AI(SP,16); Jmp_A(RP);
Iap_XII(X0,48,-1); Ivr_Md(SP,8); // SP+8 に割り当てら...
Iap_XII(X0,17,-1); Ivr_Md(SP,12); // SP+12に割り当てら...
Iap_XII(X0,48,-3); Ivr_Md(SP,16); // この関数の第一引数...
Iap_XII(X0,48,-4); Ief_II(1,8); // この関数はintを返...
-[3]これを従来の方法でC言語化した場合(違いが分かりやすい...
vJmp: switch (pc) {
L_5: case 5:
sp -= 16; *(int*)&mem[sp+12] = rp;
r0 = *(int*)&mem[sp+16]; if (r0 <= 1) goto L_8;
r0 = *(int*)&mem[sp+16]; r0 += -2; *(int*)&mem[sp+0] =...
rp = 6; goto L_5; case 6: *(int*)&mem[sp+8] = r0;
r0 = *(int*)&mem[sp+16]; r0 += -1; *(int*)&mem[sp+0] =...
rp = 7; goto L_5; case 7:
r1 = *(int*)&mem[sp+8]; r0 += r1; *(int*)&mem[sp+16] ...
L_8: case 8:
r0 = *(int*)&mem[sp+16];
rp = *(int*)&mem[sp+12]; sp += 16; pc = rp; goto vJmp;
}
-[4]今回の方法でC言語化した場合(お?これならいけるんじゃ...
int L_5(int sp16)
{
int sp8, sp12;
int r0, r1;
r0 = sp16; if (r0 <= 1) goto L_8;
r0 = sp16; r0 += -2; sp8 = r0;
r0 = L_5(sp8); sp8 = r0;
r0 = sp16; r0 += -1; sp12 = r0;
r0 = L_5(sp12);
r1 = sp8; r0 += r1; sp16 = r0;
L_8:
r0 = sp16;
return r0;
}
-補足:
--kharcの機械語から[4]のコードに変換するプログラムは116行...
--kharcのアセンブラから[3]のコードに変換するプログラムは2...
-ベンチマークテスト結果
| |fib46 |mandel |
|[1]をgccでコンパイルして実行|RIGHT:4.608[sec](1.00倍)|RI...
|[1]をkccでJITコンパイル実行|RIGHT:8.179[sec](1.77倍)|RIG...
|[3]をgccでコンパイルして実行|RIGHT:7.279[sec](1.57倍)|RI...
|[4]をgccでコンパイルして実行|RIGHT:4.592[sec](''1.00倍''...
--ということで、[4]の方法なら実行速度での問題はなさそうで...
----
-現状のソースコード規模(小規模感を伝えたいです)
|kcpp0.c|RIGHT:378行|プリプロセッサ処理|
|khbn.c|RIGHT:186行|kharcアセンブラ・逆アセンブラ|
|ccmp.c|RIGHT:1114行|Cコンパイラ処理|
|opt.c|RIGHT:265行|最適化処理|
|bej.c|RIGHT:220行|エミュレータ実行(124行)& x86JITコン...
|kcc.c|RIGHT:67行|kccのmain関数|
|acl3|RIGHT:651行|自分の開発を楽にするための自作ライブラリ|
|acl3g||自分の開発を楽にするための自作グラフィックライブ...
||||
|buntan.c|RIGHT:68行|kharc→buntan-pc向けのアセンブラに変換|
|k2c.c|RIGHT:116行|kharc→gcc向けのc言語に変換|
--kcc.exe : 実行ファイルは 47.0KB(x86用)
** (18) ここまでのまとめ
-[[a25_kharcs3]]の最後の方に「しばらくはお休み」とか書い...
-休む前に、ここまでのことを振り返って、まとめをしようと思...
-[1]なぜこんなにテンポよく開発できたのだろうか?
--[1-1] 2025.04.11~2025.04.25の期間で私はkuasというアセ...
--その時に「この関数は多分将来の開発でもまた使いたくなり...
--kuasの開発が終わると、さっそくacl3を使って何か作りたい...
--このさらに強くなったacl3があれば、そろそろCコンパイラく...
--つまり、「自作ライブラリを育てるための開発ネタを探す」...
--[1-2] kccはパーサーもトークナイザーもありません。多分そ...
--acl3ライブラリがあると、この '(' に対応する ')' はどこ...
--[1-3] Cコンパイラは一般的にC言語のソースコードをアセン...
--そのシンプルさは、上記のエミュレータ、JITコンパイラ、2...
--[1-4] プリプロセッサ、グラフィックライブラリはすでに作...
--またエミュレータやJITコンパイラについては別の開発で経験...
-[2]何を目的に開発するといいのか?
--もちろん自分が普段使いするためです。使う気がないなら作...
--私は今までOSや言語をいくつも作ってきました。その中で普...
-[3]言語を自作するときに最適化はどうするべきか?
--普段使いするということを考えると、最適化が弱すぎたら使...
--でも、最適化に強い言語を作るのは相当に大変です。個人が...
終了行:
* kharcs #5
-(by [[K]], 2025.06.26)
** (0) これはなに?
-(kharcsページは、kharc開発でわかったことを整理して説明...
-今回説明したいこと: ~この順番でCコンパイラを作ったら早...
--[1]~[6]→[[a25_kharcs2]]
--[7]→[[a25_kharcs3]]
--[8]~[14]→[[a25_kharcs4]]
--[15]3dwavei(18日目)
--[16]kcubei(19日目)
--[17]高速化(20日目)
--[18]ここまでのまとめ
** (15) 3dwavei(18日目:6/26)
-配列が使えれば3dwaveiができるはずなので、足りない機能(s...
-ちゃんとうねうねと動きました!
--https://essen.osask.jp/files/pic20250626a.png
#include "kharc.h"
int main()
{
int w, t, x, y, d, z, x0, y0, x1, y1, y0x0, y0x1, y1...
w = openWin(640, 480);
for (t = 0; isClose(w) == 0; t++) {
wait(8); fillRect(w, 640, 480, 0, 0, 0x000000);
for (y = -20; y <= 21; y++) {
for (x = -20; x <= 21; x++) {
d = ff16Sqrt((x * x + y * y) * 65536);
z = ff16Sin(((d * 652) >> 12) - 1043 * t...
x0 = x + 19; y0 = y + 19; x1 = x + 20; y...
y1x1 = y1 * 42 + x1; y0x0 = y0 * 42 + x0...
gx[y1x1] = (x * 2 - y * 2 + z * 0) * 4 +...
gy[y1x1] = (x * 2 + y * 2 + z * 1) * 2 +...
if (x0 >= 0) { if (y0 >= 0) {
drawLine(w, gx[y0x0], gy[y0x0], gx[y...
drawLine(w, gx[y0x0], gy[y0x0], gx[y...
}}
}
}
}
return 0;
}
** (16) kcubei(19日目:6/27)
-配列処理を多用するプログラムとして、キューブ回転プログラ...
--https://essen.osask.jp/files/pic20250627a.png
--ちなみにこのキューブの面の色の計算方法は、各面の外向き...
--Z軸は光線の方向として想定したものです。・・・この、面の...
--面の法線ベクトルは、隣り合った2つの辺の外積を計算すれば...
** (17) 高速化(20日目:6/30)
-さてここで少し冷静になって考えてみました。
-私はこのkccを常用するようになるでしょうか。・・・もし作...
-まずkccはgccよりも便利になるでしょうか。・・・はい、私に...
-しかし便利になっても、その機能を使うかどうかはまた別です...
-gccでコンパイルできないとなると、実行速度としてgcc比で1....
-まあでも、それなら速度が欲しい部分(たぶんソースコード中...
-速度比1.5倍くらいなら、この使い分けでほとんど問題になら...
-と、ここまで考えたとき、ふと思いつきました。
-kccはbuntan-pcのコード生成にも使えるほどの柔軟性があるの...
-・・・現状ではメモリイメージを真似することにこだわって、...
-普通の変数として宣言してアクセスするようにすれば、gccが...
-これは試す価値がありそうなので、やってみることにします。
-[1]コンパイル前のコード
int fib(int i)
{
if (i > 1) {
i = fib(i - 2) + fib(i - 1);
}
return i;
}
-[2]kccでコンパイルした結果(このバージョンから補助情報が...
Lb_I(5);
Sub_AI(SP,16); Sto_AMd(RP,SP,12);
Lod_RMd(R0,SP,16); CmFrJle_RII(R0,1,8);
Lod_RMd(R0,SP,16); Add_RI(R0,-2); Sto_RMd(R0,SP,0);
Mov_AI(RP,6); Jmp_I(5); Lb_I(6); Sto_RMd(R0,SP,8);
Lod_RMd(R0,SP,16); Add_RI(R0,-1); Sto_RMd(R0,SP,0);
Mov_AI(RP,7); Jmp_I(5); Lb_I(7);
Lod_RMd(R1,SP,8); Add_RR(R0,R1); Sto_RMd(R0,SP,1...
Lb_I(8);
Lod_RMd(R0,SP,16);
Lod_AMd(RP,SP,12); Add_AI(SP,16); Jmp_A(RP);
Iap_XII(X0,48,-1); Ivr_Md(SP,8); // SP+8 に割り当てら...
Iap_XII(X0,17,-1); Ivr_Md(SP,12); // SP+12に割り当てら...
Iap_XII(X0,48,-3); Ivr_Md(SP,16); // この関数の第一引数...
Iap_XII(X0,48,-4); Ief_II(1,8); // この関数はintを返...
-[3]これを従来の方法でC言語化した場合(違いが分かりやすい...
vJmp: switch (pc) {
L_5: case 5:
sp -= 16; *(int*)&mem[sp+12] = rp;
r0 = *(int*)&mem[sp+16]; if (r0 <= 1) goto L_8;
r0 = *(int*)&mem[sp+16]; r0 += -2; *(int*)&mem[sp+0] =...
rp = 6; goto L_5; case 6: *(int*)&mem[sp+8] = r0;
r0 = *(int*)&mem[sp+16]; r0 += -1; *(int*)&mem[sp+0] =...
rp = 7; goto L_5; case 7:
r1 = *(int*)&mem[sp+8]; r0 += r1; *(int*)&mem[sp+16] ...
L_8: case 8:
r0 = *(int*)&mem[sp+16];
rp = *(int*)&mem[sp+12]; sp += 16; pc = rp; goto vJmp;
}
-[4]今回の方法でC言語化した場合(お?これならいけるんじゃ...
int L_5(int sp16)
{
int sp8, sp12;
int r0, r1;
r0 = sp16; if (r0 <= 1) goto L_8;
r0 = sp16; r0 += -2; sp8 = r0;
r0 = L_5(sp8); sp8 = r0;
r0 = sp16; r0 += -1; sp12 = r0;
r0 = L_5(sp12);
r1 = sp8; r0 += r1; sp16 = r0;
L_8:
r0 = sp16;
return r0;
}
-補足:
--kharcの機械語から[4]のコードに変換するプログラムは116行...
--kharcのアセンブラから[3]のコードに変換するプログラムは2...
-ベンチマークテスト結果
| |fib46 |mandel |
|[1]をgccでコンパイルして実行|RIGHT:4.608[sec](1.00倍)|RI...
|[1]をkccでJITコンパイル実行|RIGHT:8.179[sec](1.77倍)|RIG...
|[3]をgccでコンパイルして実行|RIGHT:7.279[sec](1.57倍)|RI...
|[4]をgccでコンパイルして実行|RIGHT:4.592[sec](''1.00倍''...
--ということで、[4]の方法なら実行速度での問題はなさそうで...
----
-現状のソースコード規模(小規模感を伝えたいです)
|kcpp0.c|RIGHT:378行|プリプロセッサ処理|
|khbn.c|RIGHT:186行|kharcアセンブラ・逆アセンブラ|
|ccmp.c|RIGHT:1114行|Cコンパイラ処理|
|opt.c|RIGHT:265行|最適化処理|
|bej.c|RIGHT:220行|エミュレータ実行(124行)& x86JITコン...
|kcc.c|RIGHT:67行|kccのmain関数|
|acl3|RIGHT:651行|自分の開発を楽にするための自作ライブラリ|
|acl3g||自分の開発を楽にするための自作グラフィックライブ...
||||
|buntan.c|RIGHT:68行|kharc→buntan-pc向けのアセンブラに変換|
|k2c.c|RIGHT:116行|kharc→gcc向けのc言語に変換|
--kcc.exe : 実行ファイルは 47.0KB(x86用)
** (18) ここまでのまとめ
-[[a25_kharcs3]]の最後の方に「しばらくはお休み」とか書い...
-休む前に、ここまでのことを振り返って、まとめをしようと思...
-[1]なぜこんなにテンポよく開発できたのだろうか?
--[1-1] 2025.04.11~2025.04.25の期間で私はkuasというアセ...
--その時に「この関数は多分将来の開発でもまた使いたくなり...
--kuasの開発が終わると、さっそくacl3を使って何か作りたい...
--このさらに強くなったacl3があれば、そろそろCコンパイラく...
--つまり、「自作ライブラリを育てるための開発ネタを探す」...
--[1-2] kccはパーサーもトークナイザーもありません。多分そ...
--acl3ライブラリがあると、この '(' に対応する ')' はどこ...
--[1-3] Cコンパイラは一般的にC言語のソースコードをアセン...
--そのシンプルさは、上記のエミュレータ、JITコンパイラ、2...
--[1-4] プリプロセッサ、グラフィックライブラリはすでに作...
--またエミュレータやJITコンパイラについては別の開発で経験...
-[2]何を目的に開発するといいのか?
--もちろん自分が普段使いするためです。使う気がないなら作...
--私は今までOSや言語をいくつも作ってきました。その中で普...
-[3]言語を自作するときに最適化はどうするべきか?
--普段使いするということを考えると、最適化が弱すぎたら使...
--でも、最適化に強い言語を作るのは相当に大変です。個人が...
ページ名: