Zigで学ぶ計算機科学
チェックポイント
- 論理値 Basis Zigの bool 型の仕組み、比較演算子と論理演算子がどのように論理値を生成・結合するか、そして短絡評価(short-circuit evaluation)が条件式をより安全かつ効率的にする仕組みを解説する。
- コールスタック Basis コールスタックが実行時に関数呼び出しをどう管理するかを学ぶ — スタックフレームの中身、スタックポインタによるフレーム追跡、そしてスタックオーバーフローの原因。
- コードブロック Basis Zigにおけるコードブロックとは何か、どのように独自のスコープを生成して変数の生存期間を管理するか、そしてラベル付きbreakを使ってブロックを式として値を生み出すZig独自の機能について学ぶ。これにより、一時変数の多くが不要になる。
- 条件文 Basis Zigで if/else if/else、式としての if、if によるオプショナルのアンラップ、そして switch を使ってプログラムの実行を分岐させる方法を解説する。Zigの厳格な bool 要件と網羅的な switch マッチングが、より安全で正確な分岐ロジックの記述にどう役立つかも取り上げる。
- 浮動小数点数 Basis ZigのFloat型を深く掘り下げる。IEEE 754が小数をどう表現するか、Zigが提供する5つのFloat幅、Floatリテラルと科学的表記の書き方、算術演算子、特殊値(NaNと無限大)、精度に関する落とし穴、そしてFloatと整数型の間の安全な変換について解説する。
- 関数 Basis Zig で関数を宣言・呼び出す方法、引数と戻り値の仕組み、pub キーワードが可視性をどう制御するか、そして関数を小さく単機能に保つことがコードをどれだけ読みやすく変更しやすくするかを学ぶ。
- Zig でグラフを表現する Basis 隣接行列と隣接リストは同じグラフを相反するトレードオフで格納する:行列は $O(1)$ の辺検索を提供するが $O(n^2)$ の空間を使い、リストは $O(n+m)$ の空間を使うが隣接頂点の列挙を実際の次数に比例した時間で行う。両方を Zig で実装し、それぞれが適切な選択である場面を学ぶ。
- ハッシュマップ Basis ハッシュマップ(hash map)はキーと値のペアを格納し、キーによって平均 $O(1)$ 時間で任意の値を取り出す。Zig の標準ライブラリのハッシュマップをブラックボックスとして使う方法:作成、エントリの挿入と検索、そしてハッシュマップが適切なツールかどうかの判断を学ぶ。
- 整数 Basis Zig の整数型システムを深く掘り下げる:任意ビット幅の型、異なる基数での数値リテラル、算術演算、ビルドモードごとのオーバーフロー挙動、そして `@as`、`@intCast`、`@truncate` を使った安全な型キャスト。
- 標準入出力 Basis プログラムは外部の世界と通信する必要がある。このチェックポイントでは Zig の標準 I/O を扱う — stdout への出力、stdin からの読み取り、テキストからの数値解析、そして I/O に付きもののエラー処理を学ぶ。
- ループ文 Basis Zigの `while` ループと `for` ループの仕組み、`break` と `continue` によるループフローの制御、そしてループを値を生み出す式として使う方法を学ぶ。
- ヒープメモリの確保 Basis スタックは大きすぎるデータや、コンパイル時にサイズがわからないデータを保持できない。このチェックポイントでは、Zig のアロケータインターフェイスを使ってヒープメモリを確保・解放する方法、確保と解放の対応を間違えると深刻なバグになる理由、そして Rust の所有権システムがそうしたバグをコンパイル時に排除する仕組みを解説する。
- メモリレイアウト Basis
- ポインタ Basis ポインタは値そのものではなくメモリアドレスを格納する変数だ。Zig でポインタを作成・参照解除する方法、指す型に関わらずすべてのポインタが同じサイズである理由、そして再帰的データ構造にポインタが不可欠な理由を学ぶ。
- Zig 環境の準備 Basis このコースが計算機科学の基礎を学ぶのに Zig を使う理由を学び、Unix ライクなシステムに Zig をセットアップして低レベルなコードを書いて実行できる状態にする。
- 再帰 Basis 再帰(recursion)関数は同じ問題のより小さなバージョンを解くために自分自身を呼び出す。このチェックポイントでは再帰がコールスタックをどのように使うか、すべての再帰に基底ケースが必要な理由、そして反復ループの方が適している場合を解説する。
- 変数の基本 Basis 変数とは何かを学び、Zig で `const` と `var` を使って宣言する方法、4 つの基本型(整数、浮動小数点数、真偽値、ポインター)、値を出力する方法、そしてスコープルールが変数の有効範囲を制御する仕組みを理解する。
- 文字列 Basis Zigにおける文字列は `[]const u8`(バイトのスライス)だ。このチェックポイントでは、文字列リテラルがメモリにどのように格納されるか、バイト数が必ずしも見える文字数と一致しない理由、そして表示・スライス・比較・実行時の文字列構築といった一般的な操作の方法を説明する。
- Zigコースのまとめ Basis Zigコースで扱った内容 — プリミティブ型から手動メモリ管理と再帰アルゴリズムまで — の総復習と、この先のRustおよびJavaScript/TypeScriptコースへの橋渡し。