Cコンパイラ作成入門のメモ #1

はじめに

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

www.sigbus.info

今回はStep1まで

調べたこと

パッケージ準備

下記を実行した

$ sudo apt update
$ sudo apt install -y gcc make git binutils libc6-dev
  • $ sudo apt update でやっていることは

    • ローカルにある「package index file」というファイル内のリポジトリ情報が更新される
    • リポジトリにはいろんなアプリのインストールパッケージが公開されている。
    • インストールパッケージは「deb」形式のファイル
  • $ sudo apt install package_name でやっていることは

    • /var/lib/apt/lists にあるpackage index file を参照してその中にあるパッケージがインストールされる
    • 参考にしたのはこれ
  • apt と apt-getの違いは

    • ここに書いてある。
    • aptの方がapt-getの上位互換で、とりあえずapt使っとけば良いらしい
  • binutils パッケージとは

    • 詳しくはこちら
    • オブジェクトファイル(バイナリ)を扱うためのツールらしい。
    • objcopyとかobjdumpコマンドとかが使えるようになる
  • libc6-dev パッケージとは

シェルスクリプト 

書いたのはこれ

#!/bin/bash
assert() {
  expected="$1"
  input="$2"

  ./9cc "$input" > tmp.s
  cc -o tmp tmp.s
  ./tmp
  actual="$?"

  if [ "$actual" = "$expected" ]; then
    echo "$input => $actual"
  else
    echo "$input => $expected expected, but got $actual"
    exit 1
  fi
}

assert 0 0
assert 42 42

echo OK

Makefile

書いたのはこれ

CFLAGS=-std=c11 -g -static

9cc: 9cc.c

test: 9cc
  ./test.sh

clean:
  rm -f 9cc *.o *~ tmp*

.PHONY: test clean
  • 詳細にみていくと...
    • これに対してmakeを実行すると実際に実行されるのは下記
      • cc -std=c11 -g -static 9cc.c -o 9cc
    • ccコマンドの構文は下記
      • cc [<オプション>] <ファイル名> [<ライブラリ>]...
  • .PHONYとは

  • make -p をすると暗黙のルール含めてこのmakefileのルールがよく分かる

    • -pオプションすると、そのmakefileのルールと変数の値が出力される
    • -p コマンドを実行して関連するものを抽出すると下記
9cc: 9cc.c 9cc.c
#  Implicit rule search has been done.
#  Implicit/static pattern stem: '9cc'
#  Last modified 2022-12-29 15:01:16.402386
#  File has been updated.
#  Successfully updated.
#  recipe to execute (built-in):
    $(LINK.c) $^ $(LOADLIBES) $(LDLIBS) -o $@
# $@ は自動変数 ターゲット名のこと。つまり 9cc

# default
LINK.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)

# default
CC = cc

# makefile (from 'Makefile', line 1)
CFLAGS = -std=c11 -g -static

思ったこと

Makefileの書き方とか全然知らない。調べたら理解はできるようになるけど、これを自分で0から作るにはスキルが足りないなぁ。

学生の時からシェルスクリプトもあんまり使いこなせてないので、やれるようになったらいいのになぁという感じ。みんなどんなふうにできるようになっていくのだろうか。

こういう技術ブログの良さげな書き方もよくわかってない。参考にさせてもらいたい。 一回書きたいことをざっと書いて、その後他のサイトを参考に体裁を整えると良さそう。