Cコンパイラ作成入門のメモ #3 (Step4, 5)

はじめに

こちらをやってみたときのメモを書いていく。

www.sigbus.info

今回はStep4, 5 commitはこちら Add *, / and () · lvlnaga/9cc@f1b1a96 (github.com)

調べたこと

関数のプロトタイプ宣言について

  • プロトタイプ宣言とは
    • 「関数の名前」と「引数と返り値の型」だけを先に宣言すること。
  • なぜ必要か
    • コンパイラは上から順にコードを読んでいく。
    • 関数が定義されてないのに、関数をcallされると、それが正しいのかわからない。
    • 書き手からすると、関数の中身をまず書かないとcallできないのは面倒。
    • プロトタイプ宣言という構文を用意すれば、さきに関数宣言しておいて、中身は後で書く。ということができるようになる。
  • どういう嬉しさがあるか
    • コンパイラが関数callのミスを検出できる
      • 例えば、引数の数、引数のデータ型、戻り値のデータ型のチェック

参考

C言語入門 - 関数のプロトタイプ宣言 - Webkaru

C言語 プロトタイプ宣言の効果【関数を安全に呼び出す仕組み】

P - 1.15.関数

空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として使うことで、抽出したい文字が含まれるかどうかを確認している
  • 賢い使い方というか、テクニック

参考

C言語 strchr 使い方

思ったこと

マインドマップに書きながら理解

読んでるだけじゃ全然いみ分からなかったのでマインドマップにまとめながら読み進めて言ったら、腹落ちできた。

マインドマップ

再帰的な処理について

  • 再帰的な関数は自分で思いつく気がしない。
  • 「慣れてもこれでできるのが、不思議な感じがするものだよ。」という文章があって、そういうもんか。と思った
  • 再帰的な処理って潜っていくところと、もどってくるところの2フェーズに分けられると思った。

説明の流れについて

  • いきなり具体的な環境の話をするのではなく、自分の伝えたいことを伝えるために、まずはシンプルな仮想的な世界における振る舞いを説明する。という説明の流れでわかりやすい。