Write Great Code Vol.2 低いレベルで考え、高いレベルで書く


Write Great Code〈Vol.2〉 ~低いレベルで考え、高いレベルで書く~ (プレミアムブックス版)


マイナビ出版


謝辞
監訳者のことば
はじめに

第1章 低いレベルで考え、高いレベルで書く
1.1 コンパイラの品質に関する誤解
1.2 アセンブリ言語の習得が今でも有益である理由
1.3 アセンブリ言語の習得が必須ではない理由
1.4 低いレベルで考える
1.4.1 コンパイラの働きはソースコード次第
1.4.2 コンパイラがより効率的なマシンコードを生成できるようにする
1.4.3 アセンブリ言語で考えながら高級言語コー ドを書く方法
1.5 高いレベルで書く
1.6 前提
1.7 言語に依存しない手法
1.8 グレートコードを特徴付けるもの
1.9 本書で使用する環境
1.1 さらなる知識のために

第2章 アセンブリ言語習得の勧め
2.1 アセンブリ言語の習得を妨げるもの
2.2 本書を役立てる
2.3 高級アセンブラを役立てる
2.4 High-Level Assembler(HLA)
2.5 高いレベルで考え、低いレベルで書く
2.6 アセンブリ言語プログラミングパラダイム(低いレベルで考える)
2.7 『The Art of Assembly Language』およびその他の情報源

第3章 高級言語プログラマーのための80×86アセンブリ言語
3.1 複数のアセンブリ言語習得の勧め
3.2 80×86アセンブリ言語の構文
3.3 80×86の基本アーキテクチャ
3.3.1 レジスタ
3.3.2 80×86汎用レジスタ
3.3.3 80x86EFLAGSレジスタ
3.4 リテラル定数
3.4.1 2進リテラル定数
3.4.2 10進リテラル定数
3.4.3 16進リテラル定数
3.4.4 文字および文字列リテラル定数
3.4.5 浮動小数点リテラル定数
3.5 アセンブリ言語のシンボル定数
3.5.1 HLAのシンボル定数
3.5.2 Gasのシンボル定数
3.5.3 MASMおよび丁ASMのシンボル定数
3.6 80×86のアドレス指定モード
3.6.1 80×86のレジスタアドレス指定モード
3.6.2 即値アドレス指定モード
3.6.3 変位のみのメモリアドレス指定モー ド
3.6.4 レジスタ間接アドレス指定モード
3.6.5 インデックス付きアドレス指定モード
3.6.6 スケールドインデ ックス付きアドレス指定モード
3.7 アセンブリ言語のデータ宣言
3.7.1 HLAのデータ宣言
3.7.2 MASMおよび丁ASMのデータ宣言
3.7.3 Gasのデータ宣言
3.8 アセンブリ言語でのオペランドサイズの指定
3.8.1 HLAの型強制
3.8.2 MASMおよびTASMの型強制
3.8.3 Gasの型強制
3.9 最小限の80×86命令セット
3.10 さらなる知識のために

第4章 高級言語プログラマーのためのPowerPCアセンブリ
4.1 複数のアセンブリ言語の習得
4.2 アセンブリ構文
4.3 基本的なPowerPCマシンアーキテクチャ
4.3.1 汎用整数レジスタ
4.3.2 汎用浮動小数点レジスタ
4.3.3 ユ ーザーモードでアクセス可能な特殊用途レジスタ
4.4 リテラル定数
4.4.1 2進リテラル定数
4.4.2 10進リテラル定数
4.4.3 16進リテラル定数
4.4.4 文字および文字列リテラル定数
4.4.5 浮動小数点リテラル定数
4.5 アセンブリ言語の宣言(シンボル)定数
4.6 PowerPCのアドレス指定モード
4.6.1 PowerPCのレジスタアクセス
4.6.2 即値アドレス指定モード
4.6.3 PowerPCのメモリアドレス指定モード
4.7 アセンブリ言語でのデータの宣言
4.8 アセンブリ言語でのオペランドサイズの指定
4.1 最小限の命令セット
4.11 さらなる知識のために

第5章 コンパイラによる処理とコード生成
5.1 プログラミング言語で使用される各種ファイルタイプ
5.2 プログラミング言語のソースファイル
5.2.1 トークン化されたソースファイル
5.2.2 言語固有のソースファイル形式
5.3 コンピュータ言語処理システムの種類
5.3.1 純粋なインタプリタ
5.3.2 インタプリタ
5.3.3 コンパイラ
5.3.4 インクリメンタルコンパイラ
5.4 変換プロセス
5.4.1 字句解析とトークン
5.4.2 構文解析(パーシング)
5.4.3 中間コード生成
5.4.4 最適化
5.4.5 各種コンパイラの最適化機能の比較
5.4.6 ネイティブコード生成
5.5 コンパイラ出力
5.5.1 コンパイラ出力として高級言語コードを生成する
5.5.2 コンパイラ出力としてアセンブリ言語コードを生成する
5.5.3 コンパイラ出力としてオブジェクトファイルを生成する
5.5.4 コンパイラ出力として実行可能ファイルを生成する
5.6 オブジェクトファイル形式
5.6.1 COFFファイルヘッダ
5.6.2 COFFオプションヘッダ
5.6.3 COFFセクションヘッダ
5.6.4 COFFセクション
5.6.5 再配置セクション
5.6.6 デバッグ用のシンボル情報
5.6.7 オブジェクトファイル形式に対する理解を深めるために
5.7 実行可能ファイル形式
5.7.1 ページ、セグメント、ファイルサイズ
5.7.2 内部断片化
5.7.3 領域を節約するための最適化は本当に必要か
5.8 オブジェクトファイル内のデータとコードのアライメント
5.8.1 セクションのアライメントサイズの選択
5.8.2 セクションの結合
5.8.3 セクションアライメントの制御
5.8.4 セクションアライメントとライブラリモジュール
5.9 リンカがコードに与える影響
5.1 さらなる知識のために

第6章 コンパイラ出力を分析するためのツール
6.1 基礎知識
6.2 アセンブリコードを出力するためのコンパイラオプション
6.2.1 GNUのコンパイラとBollandのコンパイラのアセンブリ出力
6.2.2 Visual C++コンパイラのアセンブリ出力
6.2.3 アセンプリ言語出力の例
6.2.4 コンパイラから出力されるアセンブリコードの分析
6.3 オブジェクトコードユーティリティを使用したコンパイラ出力の分析
6.3.1 Microsoftのdumpbin.exeユーティリティ
6.3.2 FSF/GNU obldumpユーティリティ
6.4 逆アセンブラを使用したコンパイラ出力の分析
6.5 デバッガを使用したコンパイラ出力の分析
6.5.1 統合開発環境のデバッガの使用
6.5.2 単体のデバッガの使用
6.6 2回のコンパイル出力の比較
6.6.1 コード変更前と変更後のdiffによる比較
6.6.2 手作業での比較
6.7 さらなる知識のために

第7章 定数と高級言語
7.1 リテラル定数とプログラムの効率
7.2 リテラル定数とマニフェスト定数
7.3 定数式
7.4 マニフェスト定数と読み取り専用メモリオブジェクト
7.5 列挙型
7.6 ブール定数
7.7 浮動小数点定数
7.8 文字列定数
7.9 複合データ型定数
7.1 さらなる知識のために

第8章 高級言語の変数
8.1 実行時メモリの構成
8.1.1 コー ド、読み取 り専用、定数セクション
8.1.2 静的変数セクション
8.1.3 BSSセクション
8.1.4 スタックセクション
8.1.5 ヒープセクションと動的メモリ割り当て
8.2 変数とは
8.2.1 属性
8.2.2 バインド
8.2.3 静的オブジェクト
8.2.4 動的オブジェクト
8.2.5 スコープ
8.2.6 存続期間
8.2.7 変数とは-結論
8.3 変数の記憶領域
8.3.1 静的バインドと静的変数
8.3.2 疑似静的バインドと自動変数
8.3.3 動的バインドと動的変数
8.4 一般的な基本データ型
8.4.1 整数変数
8.4.2 浮動小数点変数
8.4.3 文字変数
8.4.4 ブール変数
8.5 変数のアドレスと高級言語
8.5.1 グローバル変数と静的変数用の記憶領域の割り当て
8.5.2 自動変数を使ってオフセットのサイズを抑える
8.5.3 中間変数用の記憶領域の割り当て
8.5.4 動的変数とポインタ用の記憶領域の割り当て
8.5.5 レコードまたは構造体を使って命令オフセットのサイズを抑える
8.5.6 レジスタ変数
8.6 メモリ内の変数割り当て
8.6.1 レコードとアライメント(整列)
8.7 さらなる知識のために

第9章 配列データ型
9.1 配列とは
9.1.1 配列宣言
9.1.2 メモリ内の配列表現
9.1.3 配列の要素へのアクセス
9.1.4 パディングとパッキング
9.1.5 多次元配列
9.1.6 動的配列と静的配列
9.2 さらなる知識のために

第10章 文字列データ型
10.1 文字列の形式
10.1.1 ゼロ終端文字列
10.1.2 長さ接頭辞付き文字列
10.1.3 7ビット文字列
10.1.4 HLA文字列
10.1.5 記述子ベースの文字列
10.2 静的文字列、疑似動的文字列、動的文字列
10.2.1 静的文字列
10.2.2 擬似動的文字列
10.2.3 動的文字列
10.3 文字列の参照カウント
10.4 Delphi/Kylix文字列
10.5 高級言語での文字列の使用
10.6 文字列内の文字データ
10.7 さらなる知識のために

第11章 ポインタデータ型
11.1 ポインタの定義(ポインタの神話的要素の除去)
11.2 高級言語でのポインタの実装
11.3 ポインタと動的メモリ割り当て
11.4 ポインタの操作とポインタ演算
11.4.1 ポインタヘの整数の加算
11.4.2 ポインタからの整数の減算
11.4.3 ポインタからのポインタの減算
11.4.4 ポインタ同士の比較
11.4.5 論理積(AND)/論理和(OR)とポインタ
11.4.6 ポインタを使ったその他の演算
11.5 シンプルなメモリアロケータの例
11.6 ガーベジコレクション
11.7 オペレーティングシステムとメモリ割り当て
11.8 ヒープメモリのオーバーヘッド
11.9 ポインタにおける一般的な問題
11.9.1 未初期化のポインタを使ってしまうミス
11.9.2 無効な値を格納したポインタを使ってしまうミス
11.9.3 解放された記憶領域を引き続き使ってしまうミス
11.9.4 使い終えた記憶領域の解放を忘れてしまうミス
11.9.5 誤ったデータ型を使って別のデータにアクセスしてしまうミス
11.10 さらなる知識のために

第12章 レコード、共用体、クラスの各データ型
12.1 レコード
12.1.1 各種言語におけるレコードの宣言
12.1.2 レコードのインスタンス化
12.1.3 コンパイル時におけるレコードデータの初期化
12.1.4 レコードのメモリ記憶域
12.1.5 メモリ効率が向上するレコードの使用方法
12.1.6 動的レコード型とデータベース
12.2 判別共用体
12.3 各種言語における共用体の宣言
12.3.1 C/C++における共用体の宣言
12.3.2 Pascal/Delphi/Kylixにおける共用体の宣言
12.3.3 HLAにおける共用体の宣言
12.4 共用体のメモリ記憶域
12.5 共用体のその他の用途
12.6 バリアント型
12.7 名前空間
12.8 クラスとオブジェクト
12.8.1 クラスとオブジェクトの対比
12.8.2 C++における単純なクラス宣言
12.8.3 仮想メソッドテーブル
12 8.4 VM下の共有
12.8.5 クラスの継承
12.8.6 クラスの多態性
12.8.7 クラス、オブジェクト、パフォーマンス
12.9 さらなる知識のために

第13章 算術式と論理式
13.1 算術式とコンピュータアーキテクチャの関係
13.1.1 スタックベースのマシン
13.1.2 アキュムレータベースのマシン
13.1.3 レジスタベースのマシン
13.1.4 算術式の典型的な形式
13.1.5 3アドレス方式のアーキテクチャ
13.1.6 2アドレス方式のアーキテクチャ
13.1.7 アーキテクチャの相違点とプログラミング
13.1.8 複雑な式を処理する
13.2 算術ステートメントの最適化
13.2.1 定数畳み込み
13.2.2 定数伝播
13.2.3 無効コードの除去
13.2.4 共通部分式の除去
13.2.5 演算強度の軽減
13.2.6 帰納変数の除去
13.2.7 ループ不変式の移動
13.2.8 オプティマイザとプログラマー
13.3 算術式の副作用
13.4 副作用を取り入れる:シーケンスポイント
13.5 副作用によって生じる問題を回避する
13.6 特定の評価順序を強制的に設定する
13.7 短絡評価
13.7.1 短絡評価とブール式
13.7.2 短絡評価または完全評価を強制的に設定する
13.7.3 効率性の問題
13.8 算術演算の相対的なコスト
13.9 さらなる知識のために

第14章 制御構造とプログラム内での条件判断
14.1 制御構造は演算より低速
14.2 低レベルな制御構造の概要
14.3 gotoステートメント
14.4 break、continue、next、returnなど、機能を限定したgotoステートメント
14.5 ifステートメント
14.5.1 if/elseステートメン トの効率の向上
14.5.2 ifステートメントでの強制的な完全評価の実現
14.5.3 ifステートメントでの強制的な短絡評価の実現
14.6 switch/caseステートメント
14.6.1 switch/caseステートメントの動作
14.6.2 ジャンプテーブルと一連の比較
14.6.3 switch/caseのその他の実装方法
14.6.4 switchステー トメントに対するコンパイラの出力
14.7 さらなる知識のために

第15章 反復制御構造
15.1 whileループ
15.1.1 whileループで強制的に完全評価を行う
15.1.2 whileループで強制的に短絡評価を行う
15.2 repeat..until(do..until/do..while)ループ
15.2.1 repeat..untilループで強制的に完全評価を行う
15.2.2 repeat..untilループで短絡評価する
15.3 forever..endforループ
15 3.1 foreverループで強制的に完全評価を行う
15.3.2 foreverループで強制的に短絡評価する
15.4 確定ループ(forループ)
15.5 さらなる知識のために

第16章 関数とプロシージャ
16.1 単純な関数およびプロシージャの呼び出し
16.1.1 戻リアドレスの格納
16.1.2 オーバーヘッドのほかの要因
16.2 リーフ関数とリーフプロシージャ
16.3 マクロとインライン関数
16.4 関数やプロシージャへの引数渡し
16.5 アクティブ化レコードとスタック
16.5.1 アクティブ化レコードの構成
16.5.2 ロ ーカル変数へのオフセットの割り当て
16.5.3 引数とオフセットの関連付け
16.5.4 引数とローカル変数へのアクセス
16.6 引数渡しの仕組み
16.6.1 値渡し
16.6.2 参照渡し
16.7 関数の戻り値
16.8 さらなる知識のために

Engineering Software
付録A
オンラインリソース
索引
著者紹介/監訳者紹介

書籍目次

Posted by shi-n