Cコンパイラ作成入門のメモ #1
はじめに
こちらをやってみたときのメモを書いていく。
今回はStep1まで
調べたこと
パッケージ準備
下記を実行した
$ sudo apt update $ sudo apt install -y gcc make git binutils libc6-dev
$ sudo apt update
でやっていることは$ 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
bash -x オプションとは?
- シェルスクリプト内で実際に実行されたコマンドと、変数に設定された値を表示できる
- ちなみに-v オプションだと、変数が展開されずに(変数名のままで)出力される
- 参考にしたのはこちら
exit 0, 1 の違いは
- 終了ステータスと呼ばれるものが変わる。
- コマンド終了時に特殊変数
$1
に自動で設定される - 一般的には下記が設定される
- コマンド成功時には「0」
- コマンド失敗時には「1」(コマンドやエラーの種類によっては0以外)
- 参考にしたのはこちら
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 [<オプション>] <ファイル名> [<ライブラリ>]...
- これに対してmakeを実行すると実際に実行されるのは下記
.PHONYとは
- PHONYターゲットと呼ばれる
- Phony Targetに指定されたtarget はファイルの存在有無に関わらず、常に処理が実行されるようになる
- 参考にしたのはこちら
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から作るにはスキルが足りないなぁ。
学生の時からシェルスクリプトもあんまり使いこなせてないので、やれるようになったらいいのになぁという感じ。みんなどんなふうにできるようになっていくのだろうか。
こういう技術ブログの良さげな書き方もよくわかってない。参考にさせてもらいたい。 一回書きたいことをざっと書いて、その後他のサイトを参考に体裁を整えると良さそう。