C
https://gyazo.com/d193b920f95dd4cc153789dcedb1c8e1
はじめに
本書の表記法
本書の想定する開発環境
著者について
機械語とアセンブラ
CPUとメモリ
アセンブラとは
Cとそれに対応するアセンブラ
簡単な例
関数呼び出しを含む例
本章のまとめ
電卓レベルの言語の作成
ステップ1:整数1個をコンパイルする言語の作成
ステップ2:加減算のできるコンパイラの作成
ステップ3:トークナイザを導入
ステップ4:エラーメッセージを改良
文法の記述方法と再帰下降構文解析
木構造による文法構造の表現
生成規則による文法の定義
BNFによる生成規則の記述
単純な生成規則
生成規則による演算子の優先順位の表現
再帰を含む生成規則
再帰下降構文解析
スタックマシン
スタックマシンの概念
スタックマシンへのコンパイル
x86-64におけるスタックマシンの実現方法
ステップ5:四則演算のできる言語の作成
ステップ6:単項プラスと単項マイナス
ステップ7: 比較演算子
トークナイザの変更
新しい文法
アセンブリコードの生成
分割コンパイルとリンク
分割コンパイルとは
分割コンパイルとその必要性
ヘッダファイルの必要性とその内容
リンクエラー
グローバル変数の宣言と定義
C標準ライブラリとアーカイブファイル
ステップ8: ファイル分割とMakefileの変更
ファイルの分割
Makefileの変更
関数とローカル変数
ステップ9:1文字のローカル変数
スタック上の変数領域
トークナイザの変更
パーサの変更
左辺値と右辺値
任意のアドレスから値をロードする方法
コードジェネレータの変更
メイン関数の変更
ステップ10:複数文字のローカル変数
ステップ11:return文
1973年のCコンパイラ
ステップ12: 制御構文を足す
ステップ13: ブロック
ステップ14: 関数の呼び出しに対応する
ステップ15: 関数の定義に対応する
バイナリレベルのインターフェイス
コンピュータにおける整数の表現
符号なし整数
符号あり整数
符号拡張
符号の反転
ポインタと文字列リテラル
ステップ16: 単項&と単項*
ステップ17: 暗黙の変数定義を廃止して、intというキーワードを導入する
ステップ18: ポインタ型を導入する
ポインタを表す型を定義する
ポインタが指している値に代入する
ステップ19: ポインタの加算と減算を実装する
ステップ20: sizeof演算子
ステップ21: 配列を実装する
配列型を定義する
配列からポインタへの暗黙の型変換を実装する
ステップ22: 配列の添字を実装する
ステップ23: グローバル変数を実装する
ステップ24: 文字型を実装する
ステップ25: 文字列リテラルを実装する
ステップ26: 入力をファイルから読む
ステップ27: 行コメントとブロックコメント
ステップ28: テストをCで書き直す
プログラムの実行イメージと初期化式
実行ファイルの構造
データセグメントの内容
初期化式の文法
グローバル変数の初期化式
ローカル変数の初期化式
スタティックリンクとダイナミックリンク
スタティックリンク
Cの型の構文
型を表す図
型を表す記法
Cの型の読み方
ネストしていない型の読み方
ネストしている型の読み方
練習問題
おわりに
付録1:x86-64命令セット チートシート
整数レジスタの一覧
メモリアクセス
関数呼び出し
条件分岐
条件代入
整数・論理演算
Gitを使ったワークフロー
コミットするときの注意点
Gitの内部構造
付録3:Dockerを使った開発環境の作成
セットアップ手順
コンテナを使ったビルド
コンテナに新たなアプリケーションを追加
参考資料
索引