Write Great Code Vol.1〜ハードウェアを知り、ソフトウェアを書く〜
第1章 グレートコードを書くために知っておくべきこと
  1.1 『Write Great Code』シリーズ
  1.2 この巻で扱う内容
  1.3 この巻が前提としていること
  1.4 グレートコードを特徴付けるもの
  1.5 この巻で使用する環境
  1.6 さらなる知識のために
 
第2章 数値表現
  2.1 数値とは
  2.2 記数法
    2.2.1 10進位取り記数法
    2.2.2 基数(ベース)
    2.2.3 2進数
    2.2.4 16進数
    2.2.5 8進数
  2.3 数値と文字列の変換
  2.4 数値の内部表現
    2.4.1 ビット
    2.4.2 ビット列
  2.5 符号付きの数値と符号なしの数値
  2.6 2進値の便利な特性
  2.7 符号拡張、ゼロ拡張、縮小
  2.8 飽和
  2.9 BCD表現
  2.1 固定小数点表現
  2.11 スケール変位形式
  2.12 有理表現
  2.13 さらなる知識のために
 
第3章 2進数の算術演算とビット演算
  3.1 2進数と16進数に対する算術演算
    3.1.1 2進数値の加算
    3.1.2 2進数値の減算
    3.1.3 2進数値の乗算
    3.1.4 2進数値の除算
  3.2 ビットに対する論理演算
  3.3 2進数値とビット列に対する論理演算
  3.4 有益なビット演算
    3.4.1 ANDを使用した、ビット列内のビットのテスト
    3.4.2 ANDを使用して、複数ビットのグループが0/非0かどうかを調べる
    3.4.3 2進数列の中の複数ビットのグループを比較する
    3.4.4 ANDを使用したモジュロnカウンタの作成
  3.5 シフトとローテート
  3.6 ビットフィールドとデータのパック
  3.7 データのパックとアンパック
  3.8 さらなる知識のために

第4章 浮動小数点表現
  4.1 浮動小数点演算の概要
  4.2 IEEE浮動小数点形式
    4.2.1 単精度浮動小数点形式
    4.2.2 倍精度浮動小数点形式
    4.2.3 拡張精度浮動小数点形式
  4.3 正規化と非正規化値
  4.4 丸め
  4.5 特殊な浮動小数点数値
  4.6 浮動小数点の例外
  4.7 浮動小数点演算
    4.7.1 浮動小数点表現
    4.7.2 浮動小数点数の加算と減算
    4.7.3 浮動小数点数の乗算と除算
  4.8 さらなる知識のために
 
第5章 文字表現
  5.1 文字データ
    5.1.1 ASCII文字セット
    5.1.2 EBCDIC文字セット
    5.1.3 ダブルバイト文字セット
    5.1.4 Unicode文字セット
  5.2 文字列
    5.2.1 文字列の形式
    5.2.2 文字列のタイプ:静的、疑似動的、動的
    5.2.3 文字列の参照カウント
    5.2.4 Delphi/Kylix文字列
    5.2.5 独自の文字列形式の作成
  5.3 文字セット
    5.3.1 文字セットのべき集合表現
    5.3.2 文字セットのリスト表現
  5.4 独自の文字セットの設計
    5.4.1 効率的な文字セットの設計
    5.4.2 数字を表す文字コードのグループ化
    5.4.3 英字のグループ化
    5.4.4 英字の比較
    5.4.5 その他の文字のグループ化
  5.5 さらなる知識のために

第6章 メモリの構成とアクセス
  6.1 基本システムコンポーネント
    6.1.1 システムバス
    6.1.2 アドレスバス
    6.1.3 コントロールバス
  6.2 メモリの物理的な構成
    6.2.1 8ビットデータバス
    6.2.2 16ビットデータバス
    6.2.3 32ビットデータバス
    6.2.4 64ビットバス
    6.2.5 80x86以外のプロセッサでの小さなオブジェクトへのアクセス
  6.3 ビッグエンディアンとリトルエンディアンの構成
  6.4 システムクロック
    6.4.1 メモリアクセスとシステムクロック
    6.4.2 ウェイトステート
    6.4.3 キャッシュメモリ
  6.5 CPUによるメモリアクセス
    6.5.1 直接アドレス指定モード
    6.5.2 間接アドレス指定モード
    6.5.3 インデックス付きアドレス指定モード
    6.5.4 スケールドインデックス付きアドレス指定モード
  6.6 さらなる知識のために

第7章 複合データ型とメモリオブジェクト
  7.1 ポインタ型
    7.1.1 ポインタの実装
    7.1.2 ポインタと動的メモリ割り当て
    7.1.3 ポインタの操作とポインタ演算
  7.2 配列
    7.2.1 配列宣言
    7.2.2 メモリ内の配列表現
    7.2.3 配列の要素へのアクセス
    7.2.4 多次元配列
  7.3 レコード/構造体
    7.3.1 Pascal/Delphiのレコード
    7.3.2 C/C++のレコード
    7.3.3 HLAのレコード
    7.3.4 レコードのメモリ記憶域
  7.4 判別共用体
    7.4.1 C/C++の共用体
    7.4.2 Pascal/Delphi/Kylixの共用体
    7.4.3 HLAの共用体
    7.4.4 共用体のメモリ記憶域
    7.4.5 共用体のその他の用途
  7.5 さらなる知識のために

第8章 ブール論理とデジタル設計
  8.1 ブール代数
    8.1.1 ブール演算子
    8.1.2 ブール公理
    8.1.3 ブール演算子の優先順位
  8.2 ブール関数と真理値表
  8.3 関数番号
  8.4 ブール式の代数操作
  8.5 標準形
    8.5.1 最小項和の標準形と真理値表
    8.5.2 最小項和の標準形を代数的に求める方法
    8.5.3 最大項積の標準形
  8.6 ブール関数の簡約化
  8.7 コンピュータとの関係
    8.7.1 電子回路とブール関数の関係
    8.7.2 組み合わせ回路
    8.7.3 順序同期回路
  8.8 さらなる知識のために

第9章 CPUアーキテクチャ
  9.1 CPUの基本的な設計
  9.2 命令のデコードと実行:ランダムロジックとマイクロコード
  9.3 命令の実行
    9.3.1 mov命令
    9.3.2 add命令
    9.3.3 jnz命令
    9.3.4 loop命令
  9.4 並列化―処理を高速化する鍵
    9.4.1 プリフェッチキュー
    9.4.2 プリフェッチキューのパフォーマンスを低下させる条件
    9.4.3 パイプライン――複数の命令の実行を並列化する
    9.4.4 命令キャッシュ―メモリへの複数のパスを提供する
    9.4.5 パイプラインハザード
    9.4.6 スーパースカラ動作――命令を並列に実行する
    9.4.7 アウトオブオーダー実行
    9.4.8 レジスタリネーミング
    9.4.9 VLIW(Very Long Instruction Word)アーキテクチャ
    9.4.10 並列処理
    9.4.11 マルチプロセッシング
  9.5 さらなる知識のために

第10章 命令セットアーキテクチャ
  10.1 命令セットの設計の重要性
  10.2 基本的な命令の設計目標
    10.2.1 オペコード長の選択
    10.2.2 将来への備え
    10.2.3 命令の選択
    10.2.4 命令へのオペコードの割り当て
  10.3 Y86仮想プロセッサ
    10.3.1 Y86の制限
    10.3.2 Y86の命令
    10.3.3 Y86のアドレス指定モード
    10.3.4 Y86の命令のエンコード
    10.3.5 Y86の命令のエンコード例
    10.3.6 Y86命令セットの拡張
  10.4 80x86の命令のエンコード
    10.4.1 命令オペランドのエンコード
    10.4.2 add命令のエンコード―例
    10.4.3 即値オペランドのエンコード
    10.4.4 8ビット、16ビット、32ビットオペランドのエンコード
    10.4.5 命令の代替エンコーディング
  10.5 プログラマーにとって命令セット設計が意味するもの
  10.6 さらなる知識のために

第11章 メモリのアーキテクチャと構成
  11.1 メモリ階層
  11.2 メモリ階層の動作方法
  11.3 メモリサブシステムの相対的なパフォーマンス
  11.4 キャッシュのアーキテクチャ
    11.4.1 ダイレクトマップキャッシュ
    11.4.2 フルアソシエイティブキャッシュ
    11.4.3 nウェイセットアソシエイティブキャッシュ
    11.4.4 データアクセスタイプに適合したキャッシュ方式
    11.4.5 キャッシュラインの置き換えポリシー
    11.4.6 メモリへのデータの書き込み
    11.4.7 キャッシュの活用とソフトウェア
  11.5 仮想メモリ、保護、ページング
  11.6 スラッシング
  11.7 NUMAと周辺機器
  11.8 メモリ階層を意識したソフトウェアの作成
  11.9 実行時のメモリ構成
    11.9.1 静的オブジェクトと動的オブジェクト、バインド、存続期間
    11.9.2 コード、読み取り専用、定数セクション
    11.9.3 静的変数セクション
    11.9.4 非初期化ストレージ(BSS)セクション
    11.9.5 スタックセクション
    11.9.6 ヒープセクションと動的メモリ割り当て
  11.1 さらなる知識のために

第12章 入力と出力(I/O)
  12.1 CPUから外部への接続
  12.2 ポートをシステムに接続するその他の方法
  12.3 各種のI/O機構
    12.3.1 メモリマップトI/O
    12.3.2 I/Oとキャッシュ
    12.3.3 I/OマップトI/O
    12.3.4 DMA(ダイレクトメモリアクセス)
  12.4 I/O速度のランク
  12.5 システムバスとデータ転送レート
    12.5.1 PCIバスのパフォーマンス
    12.5.2 ISAバスのパフォーマンス
    12.5.3 AGPバス
  12.6 バッファリング
  12.7 ハンドシェイク
  12.8 I/Oポートにおけるタイムアウト
  12.9 割り込みとポーリング
  12.1 保護モードとデバイスドライバ
    12.10.1 デバイスドライバ
    12.10.2 デバイスドライバと「ファイル」の通信
  12.11 特定のPC周辺デバイスを探る
  12.12 キーボード
  12.13 標準的なPCのパラレルポート
  12.14 シリアルポート
  12.15 ディスクドライブ
    12.15.1 フロッピードライブ
    12.15.2 ハードディスクドライブ
    12.15.3 RAIDシステム
    12.15.4 Zipやその他のフロプティカルドライブ
    12.15.5 光ドライブ
    12.15.6 CD-ROM、CD-R、CD-R/W、DVD、DVD-R、DVD-RAM、DVD-R/Wドライブ
  12.16 テープドライブ
  12.17 フラッシュメモリ
  12.18 RAMディスクと半導体ディスク
  12.19 SCSIデバイスとSCSIコントローラ
  12.2 IDE/ATAインターフェイス
  12.21 マスストレージデバイスにおけるファイルシステム
    12.21.1 空き領域ビットマップによるファイルの維持
    12.21.2 ファイルアロケーションテーブル(FAT)
  12.22 マスストレージデバイス上のデータを操作するソフトウェアの記述
    12.22.1 ファイルアクセスのパフォーマンス
    12.22.2 同期I/Oと非同期I/O
    12.22.3 I/Oの種類による影響
    12.22.4 メモリマップトファイル
  12.23 USB(Universal Serial Bus)
    12.23.1 USBの設計
    12.23.2 USBのパフォーマンス
    12.23.3 USB伝送の種類
    12.23.4 USBのデバイスドライバ
  12.24 マウス、トラックパッド、その他のポインティングデバイス
  12.25 ジョイスティックとゲームコントローラ
  12.26 サウンドカード
    12.26.1 オーディオインターフェイス周辺デバイスがサウンドを作り出す仕組み
    12.26.2 オーディオとMIDIファイルの形式
    12.26.3 オーディオデバイスのプログラミング
  12.27 さらなる知識のために