Write Portable Code 複数プラットフォームに移植可能なソフトウェアの開発技法
Write Portable Code 複数プラットフォームに移植可能なソフトウェアの開発技法 (Mynavi Advanced Library)
マイナビ
著者:Brian Hook
訳者:株式会社トップスタジオ
監訳:鵜飼文敏、田郷明
謝辞
監訳者序文
まえがき
Introduction 移植可能なソフトウェアの開発技法
1. 移植性によって得られるメリット
2. プラットフォームの要素
3. 「前提条件」に関する問題
4. コーディングの標準
5. 移植可能なプログラミングのための枠組み
第1章 「移植性」という概念
1.1 移植性とは「精神状態」であり、「状況」ではない
1.2 移植性を意識した正しい習慣を身に付ける
1.3 正しい習慣は、バグや標準に関する具体的な知識に勝る
移植は早く、かつ頻繁に
異機種環境で開発を進めること
多様なコンパイラを使うこと
複数のプラットフォームでテストすること
複数のライブラリをサポートすること
1.4 新しいプロジェクトの移植性を計画する
移植性の実現に関する手間を省くこと
合理的なレベルの移植性を選ぶこと
プロジェクトを特定ベンダーの独自製品に結び付けないこと
1.5 古いコードの移植
移植されたことが一度もないコードを「移植可能」とは呼ばないこと
変更は必要最小限にとどめること
作業計画を立てること
リビジョン管理で、すべてを文書化すること
第2章 ANSI CとC++
2.1 ほかの言語を使わない理由
CとC++では低レベルアクセスが可能
CおよびC++のコードからネイティブコードへのコンパイル
2.2 CとC++の「方言」
2.3 C /C++と移植性
第3章 移植性を実現する各種のテクニック
3.1 新しい機能を避ける
3.2 「多様な機能が使えるかどうか」という問題への対処
3.3 安全なシリアライズとデシリアライズ
3.4 テストの統合
3.5 コンパイルオプションの使用
コンパイル時間のアサーション
厳密なコンパイル
3.6 プラットフォーム依存のファイルと移植可能な
3.7 単刀直入なコードの記述
3.8 一意名の使用
3.9 抽象化の実装
ディスパッチによる抽象化
抽象データ型(typedef)
不測の事態に備える
通信システム依存の情報
3.10 低レベルプログラミング
可能ならば自己変更コード/動的生成コードの使用を避けること
高レベルのフォールバックの保持
第4章 編集とソース管理
4.1 テキストファイルの行末の違い
4.2 移植可能なファイル名
4.3 ソース管理
ソース管理システム
プロキシによるチェックアウト
4.4 ビルドツール
プラットフォーム固有のビルドツール
移植可能なビルドツール
4.5 エディタ
4.6 まとめ
第5章 プロセッサの違い
5.1 アラインメント(位置合わせ)
5.2 バイトオーダーとエンディアン
ビッグエンディアンとリトルエンディアンの値
標準化された格納フォーマット
固定されたネットワークバイトオーダー
5.3 符号付き整数の表現
5.4 ネイティブタイプのサイズ
5.5 アドレス空間
5.6 まとめ
第6章 浮動小数点
6.1 浮動小数点の歴史
6.2 標準CとC++における浮動小数点のサポート
6.3 浮動小数点に関する問題
一貫性のない評価
浮動小数点とネットワークアプリケーション
変換
6.4 固定小数点の整数演算
6.5 浮動小数点値から整数ビットを抽出する
6.6 実装クエリ
6.7 例外的な結果
6.8 特別な値
例外
浮動小数点環境へのアクセス
6.9 格納フォーマット
6.10まとめ
第7章 プリプロセッサ
7.1 定義済みシンボル
7.2 ヘッダファイル
ヘッダファイルパスの仕様
7.3 ヘッダのファイル名
7.4 設定マクロ
7.5 条件付きコンパイル
7.6 プラグマ
7.7 まとめ
第8章 コンパイラ
8.1 構造体のサイズ、パッキング、アラインメント
8.2 メモリ管理の特異性
解放(free)の効果
アラインメントされたメモリ割り当て
8.3 スタック
スタックサイズ
alloca()に関する問題
8.4 printfルーチン
8.5 型のサイズと動作
64ビット整数型
基本型のサイズ
signed char型とunsigned char型
enum型をint型として使う
数値定数
符号付きと符号なしの右シフト
8.6 呼び出し規則
名前の修飾
関数ポインタとコールバック
移植性
8.7 構造体を返す
8.8 ビットフィールド
8.9 コメント
8.10 まとめ
第9章 ユーザーとの対話
9.1 ユーザーインターフェイスの進化
コマンドライン
ウインドウシステム
9.2 ネイティブGUIかアプリケーションGUIか?
9.3 低レベルのグラフィック
9.4 デジタルオーディオ
9.5 入力
キーボード
マウス
ジョイスティックとゲームパッド
9.6 クロスプラットフォームのツールキット
9.7 まとめ
第10章 ネットワーク処理
10.1 ネットワークプロトコルの進化
10.2 プログラミングインターフェイス
ソケット
RPCとRMI
分散オブジェクト
10.3 まとめ
第11章 オペレーティングシステム
11.1 オペレーティングシステムの進化
11.2 ホスト環境と自立環境
11.3 オペレーティングシステムの移植性の矛盾
11.4 メモリ
メモリの制限
メモリマッピング
メモリ保護
11.5 プロセスとスレッド
プロセスの制御および通信機能
プロセス間通信(IPC)
マルチスレッド処理
11.6 環境変数
11.7 例外処理
Cの例外処理
C++の例外処理
11.8 ユーザーデータの記憶領域
Microsoft Windowsのレジストリ
Linuxのユーザーデータ
Mac OS Xのプレファレンス
11.9 セキュリティとパーミッション
アプリケーションのインストール
権限のあるディレクトリとデータ
低レベルのアクセス
11.10 まとめ
第12章 動的ライブラリ
12.1 動的リンク
12.2 動的ローディング
12.3 共有ライブラリに付随する問題(またの名をDLL地獄)
バージョン管理の問題
拡散
12.4 GNU LGPL
12.5 Windows DLL
12.6 Linuxの共有オブジェクト
12.7 Mac OS Xのフレームワーク、プラグイン、バンドル
フレームワーク
バンドル
プラグイン
12.8 まとめ
第13章 ファイルシステム
13.1 シンボリックリンク、ショートカット、エイリアス
WindowsのLNKファイル
Unixのリンク
13.2 パスの指定
ディスクドライブとボリューム指定
パス区切り子とその他の特殊文字
カレントディレクトリ
パスの長さ
大文字と小文字の区別
13.3 セキュリティとアクセス権限
13.4 Macintoshの特異な処理
13.5 ファイル属性
13.6 特別なディレクトリ
13.7 テキスト処理
13.8 Cのランタイムライブラリと移植性のあるファイルアクセス
13.9 まとめ
第14章 スケーラビリティ
14.1 アルゴリズムが良いほどスケーラビリティも良い
14.2 スケーラビリティの限界
14.3 まとめ
第15章 移植性とデータ
15.1 アプリケーションデータとリソースファイル
バイナリファイル
テキストファイル
XML
データファイルとしてのスクリプト言語
15.2 移植可能なグラフィックの作成
15.3 移植可能なオーディオの作成
15.4 まとめ
第16章 国際化と地域化
16.1 文字列とUnicode
16.2 通貨
16.3 日付と時刻
16.4 インターフェイスの要素
16.5 キーボード
16.6 まとめ
第17章 スクリプト言語
17.1 スクリプト言語の短所
17.2 JavaScript / ECMAScript
17.3 Python
17.4 Lua
17.5 Ruby
17.6 まとめ
第18章 クロスプラットフォームなライブラリとツールキット
18.1 ライブラリ
18.2 アプリケーションフレームワーク
Qt
GTK+
FLTK
wxWidgets
18.3 まとめ
付録A POSH
A.1 POSHの事前定義済みシンボル
A.2 POSHの固定サイズの型
A.3 POSHのユーティリティ関数とマクロ
付録B 移植性のルール
参考文献
索引
著者紹介
監訳者紹介