Cコンパイラ作成入門のメモ #3 (Step4, 5)
はじめに
こちらをやってみたときのメモを書いていく。
今回はStep4, 5 commitはこちら Add *, / and () · lvlnaga/9cc@f1b1a96 (github.com)
調べたこと
関数のプロトタイプ宣言について
- プロトタイプ宣言とは
- 「関数の名前」と「引数と返り値の型」だけを先に宣言すること。
- なぜ必要か
- コンパイラは上から順にコードを読んでいく。
- 関数が定義されてないのに、関数をcallされると、それが正しいのかわからない。
- 書き手からすると、関数の中身をまず書かないとcallできないのは面倒。
- プロトタイプ宣言という構文を用意すれば、さきに関数宣言しておいて、中身は後で書く。ということができるようになる。
- どういう嬉しさがあるか
- コンパイラが関数callのミスを検出できる
- 例えば、引数の数、引数のデータ型、戻り値のデータ型のチェック
- コンパイラが関数callのミスを検出できる
参考
C言語 プロトタイプ宣言の効果【関数を安全に呼び出す仕組み】
空returnについて
ここ
void gen(Node *node) { if (node->kind == ND_NUM ) { printf(" push %d\n", node->val); return; // ★ } ...
- 戻り値を持たないということ。NULLを返すのとは違う。
参考
【C言語入門】returnで関数の戻り値を返す方法 | 侍エンジニアブログ
strchr を使って特定文字有無のif文
ここ
if (strchr("+-*/()",*p)) // ★ { cur = new_token(TK_RESERVED, cur, p++); continue; } ...
- strchr関数は文字列の先頭から「文字」を検索して見つかった場所をポインタで返す
- これをif文のconditionとして使うことで、抽出したい文字が含まれるかどうかを確認している
- 賢い使い方というか、テクニック
参考
思ったこと
マインドマップに書きながら理解
読んでるだけじゃ全然いみ分からなかったのでマインドマップにまとめながら読み進めて言ったら、腹落ちできた。
再帰的な処理について
- 再帰的な関数は自分で思いつく気がしない。
- 「慣れてもこれでできるのが、不思議な感じがするものだよ。」という文章があって、そういうもんか。と思った
- 競技プログラミングとかコツコツやれば書けるようになる?
- 再帰的な処理って潜っていくところと、もどってくるところの2フェーズに分けられると思った。
説明の流れについて
- いきなり具体的な環境の話をするのではなく、自分の伝えたいことを伝えるために、まずはシンプルな仮想的な世界における振る舞いを説明する。という説明の流れでわかりやすい。