acl4の開発ログ #06
2026.02.12(木) #0
- ここでいったん一区切りだと思うので、主要なコードを一括でダウンロードできる.zipファイルを作りたいです。
- acl4以外の雑務がたまっているので、しばらくはそれを片づけます。だから1週間くらいはお休みです。
- 次はインタプリタを作りたいと思っています。・・・2026年版のプログラミング言語自作入門になるのかな??
- いやでも、今回は詳しい解説はしない予定なので、そこは期待しないでください。
- 今回作ったプリプロセッサを使って作るので、結構面白いことになるのではないかと期待しています!
2026.02.13(金) #0
- (作る暇はまだないけど)言語をどうやって作ったらいいのか思案中。
- たぶん簡素な中間言語を作って、その中間言語にコンパイルして動かす方式で行くと思います。
- 最初に作るのは中間言語の整備になるかなーと思います。コンパイルして動かしたり、インタプリタで動かしたり。
- それができたら、C言語などからその中間言語に変換するコンパイラを書く予定です。
2026.02.13(金) #1
2026.02.14(土) #0
- 作りたい中間言語を a4vm と呼ぶことにします。
2026.02.15(日) #0
- a4vmのアセンブラを(ぼんやりと)設計しています。
#define c R00 // 整数レジスタ
#define lp L0000 // ラベル
Lod_RI(c, 0x20)
Lbl_T(lp)
Dbg_Putc_R(c)
Add_RI(c, 1)
Jlt_RIT(c, 0x7f, lp)
Dbg_Putc_I(10) // LF
Dbg_Ret_I(0)
- このくらいの仕様で行けば、アセンブラは1時間もかからずに作れそう・・・。
- とか思うと試しに作りたくなってきて危ない・・・。
- さっさと他のことを終わらせないと・・・。
2026.02.15(日) #1
- 自作プリプロセッサでは複数行マクロ定義が使えるわけですが、これで面白いことができないかずっと考えていました。
- 複雑な例じゃなくて、簡単な例を作りたいわけです。
- やっと一つ思いつきました。
// memo20260215a.txt
#define Factorial(n) [^
#if (n <= 1)
1
#else
(n) * Factorial(n - 1)
#endif
^]
print Factorial(10);
>t0013b memo20260215a.txt
3628800.000000
- ちゃんと階乗計算できています!
- 普通のプリプロセッサでは、こんな変態なことできないですよね?(笑)
2026.02.15(日) #2
- a4_p0004 (プリプロセッサを利用して短時間でアセンブラを作りました) を書きました。
- なんかプリプロセッサって注目されてないけど、プリプロセッサって簡単に作れるし、応用しやすいんですよーー。
2026.02.16(月) #0
- a4_p0005 (プリプロセッサを利用して短時間で仮想マシンを作りました) を書きました。
2026.02.17(火) #0
- 今の目次ページ a4_i01 は、主な成果がわかりにくいので、最初に見に来た人がよくわからない気がします。
- わかりやすいように直そうと思います。
2026.02.17(火) #1
- 目次ページの概要を書き直して、わかりやすくなりました。たぶんうまくいっているはずです。→a4_i01
2026.02.17(火) #2
- ちょっと思いついたので、即興で a4_p0006 (プリプロセッサを利用して短時間でトランスパイラを作りました) を書きました。
- 結論: プリプロセッサ最強!
- なんというか独立したプリプロセッサではなく(つまりgccのcpp0.exeとかではなく)、ライブラリとして(=目的を達成するための部品として)プリプロセッサがあると、とっても便利なのです。
2026.02.18(水) #0
- この先1~2か月はCコンパイラを作るつもりなのですが、最適化とか考えたら大変だなーと思いつつ、とりあえず最適化とか気にしないで、極力シンプルに作って、次のバージョンで改良を考えればいいよね、と思いつきました。
- 最初から最終版を作ろうとするのはよくないです。失敗しやすくなる気がします。
2026.02.19(木) #0
- 最初のCコンパイラの構想:
- int のみ・・・にしようと思ったけど、それだけだとputsすらできなくてそれは悲しいので、 char * もアリにする。
- char * だったら、ポインタに対する加算・減算をしてもスケール計算をしなくていい。
- 構造体とかは全部なし。
- だけどプリプロセッサは全部使える(笑)。
- うん、この妥協があれば気楽にできそうな気がしてきました。
2026.02.20(金) #0
- 忙しいから仕方ないのですが、でも開発できないことでなんかちょっとストレスが溜まっています。
- 早く開発がしたい!!
2026.02.20(金) #1
- 素直にCコンパイラを作ればいいのに、プリプロセッサにも変数やwhileなどがあってもいいじゃないかと思い始めました。
- もしこれがきれいにまとめられたら、面白くなりそうです。
- できるだけCコンパイラと共通化させたいです。
// 変換前.
#.. int i; for (i = 0; i < 5; i++) {
printf("hello\n");
#.. }
// 変換後.
printf("hello\n");
printf("hello\n");
printf("hello\n");
printf("hello\n");
printf("hello\n");
2026.02.23(月) #0
- Cコンパイラを作ろうって考えると、Cコンパイラにしか使えない関数ばかり書いてしまうので、もっと視野を広げて、式の評価を拡張していくことを考えようと思います。
こめんと欄