aboutsummaryrefslogtreecommitdiffhomepage
path: root/services/nuldoc/public/blog/posts/2025-05-05
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-08-08 10:38:18 +0900
committernsfisis <nsfisis@gmail.com>2026-08-08 10:38:18 +0900
commit4681e861efcdf9b0b73e3803e70712bc55162863 (patch)
treed910ef14d9549df19896d85a42e12a32db787fb6 /services/nuldoc/public/blog/posts/2025-05-05
parenteca423774047122f7dfc4be9ac78626e32d733d3 (diff)
downloadnsfisis.dev-main.tar.gz
nsfisis.dev-main.tar.zst
nsfisis.dev-main.zip
feat(slides): improve slide controllerHEADmain
Diffstat (limited to 'services/nuldoc/public/blog/posts/2025-05-05')
-rw-r--r--services/nuldoc/public/blog/posts/2025-05-05/make-tiny-self-hosted-c-compiler/index.html80
1 files changed, 42 insertions, 38 deletions
diff --git a/services/nuldoc/public/blog/posts/2025-05-05/make-tiny-self-hosted-c-compiler/index.html b/services/nuldoc/public/blog/posts/2025-05-05/make-tiny-self-hosted-c-compiler/index.html
index a5bbbcea..cef5c6e1 100644
--- a/services/nuldoc/public/blog/posts/2025-05-05/make-tiny-self-hosted-c-compiler/index.html
+++ b/services/nuldoc/public/blog/posts/2025-05-05/make-tiny-self-hosted-c-compiler/index.html
@@ -15,7 +15,7 @@
<meta name="Hatena::Bookmark" content="nocomment">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>セルフホスト可能な C コンパイラを作った|REPL: Rest-Eat-Program Loop</title>
- <link rel="stylesheet" href="/style.css?h=bf289421c09405fa3c89dc8b18742368">
+ <link rel="stylesheet" href="/style.css?h=61618c116e07057fc873f7751f158cd7">
</head>
<body class="single">
<header class="header">
@@ -359,9 +359,10 @@
compilerbook では整数一つのパース・コード生成から始めるが、今回は以下のようなソースをパースしてコード生成するところからスタートすることにした。
</p>
<div class="codeblock">
- <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">int</span> <span style="color: #8250df">main</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
-</div><div class="codeblock-line"> <span style="color: #cf222e">return</span> <span style="color: #0550ae">42</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
-</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span></div></code></pre>
+ <pre class="highlight" style="background-color:#f5f5f5"><code><span class="codeblock-line"><span style="color: #cf222e">int</span> <span style="color: #8250df">main</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+</span><span class="codeblock-line"> <span style="color: #cf222e">return</span> <span style="color: #0550ae">42</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
+</span><span class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span>
+</span></code></pre>
</div>
<p>
この時点で、<code>struct Token</code>、<code>struct Parser</code>、<code>struct AstNode</code>、<code>struct CodeGen</code> といった主要なデータ構造が定義され、この後もほぼ同じソース設計のまま進めている。
@@ -408,23 +409,24 @@
一日の終わりには、次のようなプログラムのテストが通るようになった。
</p>
<div class="codeblock">
- <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">int</span> <span style="color: #8250df">printf</span><span style="color: #24292f;background-color: #f6f8fa">();</span>
-</div><div class="codeblock-line">
-</div><div class="codeblock-line"><span style="color: #cf222e">int</span> <span style="color: #8250df">main</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
-</div><div class="codeblock-line"> <span style="color: #cf222e">int</span> <span style="color: #24292f;background-color: #f6f8fa">i</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
-</div><div class="codeblock-line"> <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">i</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">i</span> <span style="color: #0550ae">&lt;=</span> <span style="color: #0550ae">100</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">i</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">i</span> <span style="color: #0550ae">+</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
-</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">i</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">15</span> <span style="color: #0550ae">==</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
-</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">printf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"FizzBuzz</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span>
-</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">else</span> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">i</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">3</span> <span style="color: #0550ae">==</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
-</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">printf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"Fizz</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span>
-</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">else</span> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">i</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">5</span> <span style="color: #0550ae">==</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
-</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">printf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"Buzz</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span>
-</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">else</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
-</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">printf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"%d</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">i</span><span style="color: #24292f;background-color: #f6f8fa">);</span>
-</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span>
-</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span>
-</div><div class="codeblock-line"> <span style="color: #cf222e">return</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
-</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span></div></code></pre>
+ <pre class="highlight" style="background-color:#f5f5f5"><code><span class="codeblock-line"><span style="color: #cf222e">int</span> <span style="color: #8250df">printf</span><span style="color: #24292f;background-color: #f6f8fa">();</span>
+</span><span class="codeblock-line">
+</span><span class="codeblock-line"><span style="color: #cf222e">int</span> <span style="color: #8250df">main</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+</span><span class="codeblock-line"> <span style="color: #cf222e">int</span> <span style="color: #24292f;background-color: #f6f8fa">i</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
+</span><span class="codeblock-line"> <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">i</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">i</span> <span style="color: #0550ae">&lt;=</span> <span style="color: #0550ae">100</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">i</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">i</span> <span style="color: #0550ae">+</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+</span><span class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">i</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">15</span> <span style="color: #0550ae">==</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+</span><span class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">printf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"FizzBuzz</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span>
+</span><span class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">else</span> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">i</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">3</span> <span style="color: #0550ae">==</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+</span><span class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">printf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"Fizz</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span>
+</span><span class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">else</span> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">i</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">5</span> <span style="color: #0550ae">==</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+</span><span class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">printf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"Buzz</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">);</span>
+</span><span class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">else</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+</span><span class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">printf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"%d</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">i</span><span style="color: #24292f;background-color: #f6f8fa">);</span>
+</span><span class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span>
+</span><span class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span>
+</span><span class="codeblock-line"> <span style="color: #cf222e">return</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
+</span><span class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span>
+</span></code></pre>
</div>
</section>
<section id="section--development--day2">
@@ -513,13 +515,14 @@
記念すべき (?) 最後のバグはこちら。
</p>
<div class="codeblock">
- <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"> gen_expr(g, ast-&gt;expr1, GEN_RVAL);
-</div><div class="codeblock-line"> } else {
-</div><div class="codeblock-line"> gen_expr(g, ast-&gt;expr1, GEN_RVAL);
-</div><div class="codeblock-line"><span style="color: #82071e;background-color: #ffebe9">- gen_lval2rval(ast-&gt;expr1-&gt;ty);</span>
-</div><div class="codeblock-line"><span style="color: #116329;background-color: #dafbe1">+ gen_lval2rval(ast-&gt;expr1-&gt;ty-&gt;to);</span>
-</div><div class="codeblock-line"> }
-</div><div class="codeblock-line"> }</div></code></pre>
+ <pre class="highlight" style="background-color:#f5f5f5"><code><span class="codeblock-line"> gen_expr(g, ast-&gt;expr1, GEN_RVAL);
+</span><span class="codeblock-line"> } else {
+</span><span class="codeblock-line"> gen_expr(g, ast-&gt;expr1, GEN_RVAL);
+</span><span class="codeblock-line"><span style="color: #82071e;background-color: #ffebe9">- gen_lval2rval(ast-&gt;expr1-&gt;ty);</span>
+</span><span class="codeblock-line"><span style="color: #116329;background-color: #dafbe1">+ gen_lval2rval(ast-&gt;expr1-&gt;ty-&gt;to);</span>
+</span><span class="codeblock-line"> }
+</span><span class="codeblock-line"> }
+</span></code></pre>
</div>
<p>
メモリアドレスから参照先の値を得る際、その型によってロードする命令の種類を変える必要があるのだが、その切替をポインタ型でおこなっていた。正しくは、そのポインタ型が指す型を元にして切り替えなければならない。
@@ -534,16 +537,17 @@
一体どこが異なるのか。<code>hexdump</code> の差分がこちら。
</p>
<div class="codeblock">
- <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">$ diff -u &lt;(hexdump -C p4dcc2) &lt;(hexdump -C p4dcc3)
-</div><div class="codeblock-line">@@ -5090,7 +5090,7 @@
-</div><div class="codeblock-line"> 00015db0 72 72 61 79 5f 65 6e 74 72 79 00 66 72 61 6d 65 |rray_entry.frame|
-</div><div class="codeblock-line"> 00015dc0 5f 64 75 6d 6d 79 00 5f 5f 66 72 61 6d 65 5f 64 |_dummy.__frame_d|
-</div><div class="codeblock-line"> 00015dd0 75 6d 6d 79 5f 69 6e 69 74 5f 61 72 72 61 79 5f |ummy_init_array_|
-</div><div class="codeblock-line">-00015de0 65 6e 74 72 79 00 63 63 6d 69 42 49 59 6b 2e 6f |entry.ccmiBIYk.o|
-</div><div class="codeblock-line">+00015de0 65 6e 74 72 79 00 63 63 53 71 64 47 76 57 2e 6f |entry.ccSqdGvW.o|
-</div><div class="codeblock-line"> 00015df0 00 66 61 74 61 6c 5f 65 72 72 6f 72 00 72 65 61 |.fatal_error.rea|
-</div><div class="codeblock-line"> 00015e00 64 5f 61 6c 6c 00 74 6f 6b 65 6e 69 7a 65 00 74 |d_all.tokenize.t|
-</div><div class="codeblock-line"> 00015e10 79 70 65 5f 6e 65 77 00 74 79 70 65 5f 6e 65 77 |ype_new.type_new|</div></code></pre>
+ <pre class="highlight" style="background-color:#f5f5f5"><code><span class="codeblock-line">$ diff -u &lt;(hexdump -C p4dcc2) &lt;(hexdump -C p4dcc3)
+</span><span class="codeblock-line">@@ -5090,7 +5090,7 @@
+</span><span class="codeblock-line"> 00015db0 72 72 61 79 5f 65 6e 74 72 79 00 66 72 61 6d 65 |rray_entry.frame|
+</span><span class="codeblock-line"> 00015dc0 5f 64 75 6d 6d 79 00 5f 5f 66 72 61 6d 65 5f 64 |_dummy.__frame_d|
+</span><span class="codeblock-line"> 00015dd0 75 6d 6d 79 5f 69 6e 69 74 5f 61 72 72 61 79 5f |ummy_init_array_|
+</span><span class="codeblock-line">-00015de0 65 6e 74 72 79 00 63 63 6d 69 42 49 59 6b 2e 6f |entry.ccmiBIYk.o|
+</span><span class="codeblock-line">+00015de0 65 6e 74 72 79 00 63 63 53 71 64 47 76 57 2e 6f |entry.ccSqdGvW.o|
+</span><span class="codeblock-line"> 00015df0 00 66 61 74 61 6c 5f 65 72 72 6f 72 00 72 65 61 |.fatal_error.rea|
+</span><span class="codeblock-line"> 00015e00 64 5f 61 6c 6c 00 74 6f 6b 65 6e 69 7a 65 00 74 |d_all.tokenize.t|
+</span><span class="codeblock-line"> 00015e10 79 70 65 5f 6e 65 77 00 74 79 70 65 5f 6e 65 77 |ype_new.type_new|
+</span></code></pre>
</div>
<p>
<code>fatal_error</code>、<code>read_all</code>、<code>tokenize</code> <code>type_new</code> はいずれも <code>main.c</code> で定義された関数の名前である。このことから考えると、これは GCC が埋め込んだシンボルテーブルである可能性が高い。わずかに異なっている 6バイトは、ランダム生成された何かのように見える。