関連サイト
本書の関連ページが用意されています。
内容紹介
本書はポータビリティ(移植性)にフォーカスした書籍です。本書における「ポータビリティ」とは、ソースコード、特にCのソースコードをさまざまなOS、アーキテクチャで移植可能にしていくかということを指します。しかし、本書で取り上げていることは、C/C++だけに当てはまるものではなく、どのような開発環境でも通用するものです。本書では、ポータビリティを考える上で見落しがちな罠(必ずあると思っている関数は特定のアーキテクチャでは存在しない、テキストファイルですら互換性の問題を孕んでいるなど)、数値計算やデータ処理における各OS・アーキテクチャでの特徴的な事項といった多様な事柄を取り上げています。
特に前半では、実例のCコード、筆者の作ったSALオーディオライブラリでの経験談、ポータビリティを実現するライブラリであるPOSH(Portable Open Source Harness)の利用例を豊富に掲載し、どういったところに留意すべきかをわかりやすく説明しています。いかに移植性の高いソフトウェアを書くか、つまり、いかに幅広い環境で動くようにするかについて留意すべきことはたくさんありますが、そのための簡単な法則というものはなく、移植性を高くするための多くの知識は散在しており、移植性の高いソフトウェアを開発するにはそれなりの経験がなければできませんでした。そのような知識・経験に基づく知恵を一冊の本にまとめたのが本書です。本書を読めば、移植性の高いコードをどのように書けばよいのかが理解できるようになるでしょう。
名著『Write Portable Code』(2006年6月 日本語版、弊社刊行)、待望の復刊です。
書誌情報
- 著者: Brian Hook(著), 株式会社トップスタジオ(訳), 鵜飼文敏(監修), 田郷明(監修)
- 発行日: 2015-04-02 (紙書籍版発行日: 2015-04-02)
- 最終更新日: 2015-04-02
- バージョン: 1.0.0
- ページ数: 370ページ(PDF版換算)
- 対応フォーマット: PDF
- 出版社: マイナビ出版
対象読者
著者について
Brian Hook
主にゲームおよびエンターテインメント業界で活躍を続けている職業ソフトウェア開発者。id software、3Dfx Interactive、Pyrogonをはじめとする企業でクロスプラットフォームの開発に携わってきた経験から、クロスプラットフォームのソフトウェア開発プロセスに対する独自の考えを展開しています。
鵜飼文敏
Debian Projectオフィシャルメンバー、元Debian JP Projectリーダー、日本Linux協会理事、The Free Software Initiative of Japan副理事長、平成15年度16年度「未踏ソフトウェア創造事業」プロジェクトマネージャー。大学院在籍中に386BSDやLinuxをPC98アーキテクチャで動かして以来、フリーなオペレーティングシステムの世界にはまる。Debian JP Project創設時のメンバーで以後Debianを中心に活動。debian.or.jpおよ びlinux.or.jpなどの運用管理を行っている。
田郷明
日本GNOMEユーザー会副会長、Debian Projectオフィシャルメンバー、Fedora Core Internationalization Projectメンバー。主に国際化方面で活動。
目次
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のユーティリティ関数とマクロ