私のネイティブアプリプログラマとしての三種の神器

三種の神器といいつつ、分類毎に分けてるので三つ以上あります。前提条件としては、マルチプラットフォームに対応したネイティブアプリケーションを開発する、という感じです。

  1. OS
    1. Mac OS X
    2. Windows
    3. Linux
  2. 言語
    1. C/C++
    2. Objective-C
    3. Lua
  3. IDE
    1. Eclipse
    2. Xcode
    3. Visual Studio
  4. ビルドツール
    1. Autotools
    2. SCons
    3. Rake
  5. テスト
    1. CUnit または CppUnit
    2. gcov + lcov
    3. google-perftools
  6. GUI ツールキット
    1. Qt
    2. WTL
    3. MFC
  7. インストーラ
    1. WiX
    2. InnoSetup
    3. PackageMaker
  8. ネットワークライブラリ
    1. c-ares
    2. libcurl
    3. OpenSSL
  9. 圧縮ライブラリ
    1. zlib
    2. bzip2
    3. Info-ZIP
  10. グラフィックライブラリ
    1. libjpeg
    2. libpng
    3. WebP

OS

Mac OS X をベースにします。理由は Mac OS X 向けの開発が Mac OS X でしかできないことと、比較的軽快に動作するということです。軽快さにおいては Linux というか Ubuntu が気に入っているので、Mac OS X が動作しないハードウェアでは Ubuntu を使います。Windows はなんといっても PC で最も大きなシェアがあるので外せません。Windows は基本的に VirtualBox で仮想化したものを使います。

言語

C をベースにします。C を使う理由は、On Loving C.. 日本語訳にあります。最も強い動機付けとなっている部分を引用しておきます。

C は過敏なので、そのアフォーダンスに注意しなくてはならない。注意して C のコードに取り組まないと、トラブルに巻き込まれる。C の概念的な単純さとその過敏さは強力な組み合わせなのだ。

Android で NDK を使って C コードを書いて、それを他のプラットフォーム向けに移植したときにこれを強く感じました。C++ は、アプリケーション層に近いコードで使うことがあります。Objective-C は、Mac OS XiOS 向けに使います。Lua は、サーバアプリケーションの設定ファイル向けに使います。XML は書くのに冗長ですし、独自形式の設定ファイルは好きではありません。Luaスクリプト言語なので名前をちゃんとつけることができますし、テーブルを使えば階層構造や配列を容易に表現できます。

IDE

Eclipse をベースにします。Eclipse は私が使ってきた開発環境の中では最もストレスなく開発ができます。特に、コード補完、リファクタリングが優秀なことと、マルチプラットフォームで動作するという点が気に入っています。プラットフォーム非依存な開発を Eclipse でやって、あとはプラットフォームに併せて XcodeVisual Studio を使う、という具合です。

ビルドツール

過去の記事であるC/C++ 開発のストレスを軽減する - DELPHIER@はてなに大体書きました。ビルドプロセス中に文字列処理が多くなると私は Python よりも Ruby が好きになるので、そういうときは Rake を使います。

テスト

CUnit、CppUnit をベースにします。単体テストが通るようにしておいて、gcov + lcov でカバレッジを確認し、コード網羅率を確認するという感じです。性能面でのテストについては、google-perftools の CPU プロファイラを使い、意外なボトルネックを探します。

GUI ツールキット

私は GUI 開発があまり得意ではないので、詳しくはありませんが・・・。サンプルプログラム程度なら、Qt でマルチプラットフォームに対応できるようにしておきます。Windows なら必要に応じて MFCWTL を使います。なんだかんだで MFC の方が強力です。Mac OS XiOS では Cocoa で十分なので、特に追加のライブラリは使いません。

インストーラ

Windows では MSI を作るときは WiX、そうでないときは InnoSetup を使います。InnoSetup は最近では Unicode に対応していたりと、かなり仕上がってきています。NSISを使ってみたいものの、手を出せていません。Mac OS X では mpkg を作るときには PackageMaker を使います。PackageMaker は Xcode についてます。dmg を作るときには hdiutil を使うので特に追加のツールは使いません。

ネットワークライブラリ

ソケット通信をするプログラムを作るときに c-ares を使います。非同期名前解決は大きい魅力です。libcurl は、プラットフォーム 依存の証明書ストアに依存しない HTTPS 通信をするときに使います。そうでない場合は、素直にプラットフォームが提供している HTTP ライブラリを使います。そうでないと余計大変です。OpenSSL は SSL/TLS ソケット通信をするときに使います。他の選択肢については考えたことがありません。Windows では SSPI を使えば同等のことができると思いますが、Windows のためだけに複雑なコードを書くのは割に合わないと考えています。ただし、それによりバイナリサイズを小さくすることができるので、そこだけはずっと心残りです。

圧縮ライブラリ

メモリ内圧縮には zlib か bzip2、ファイル圧縮には Info-ZIP を使います。

グラフィックライブラリ

大抵 libpng と libjpeg で事足りてます。他に使っているものがないので、あえて WebP を挙げてみました。libjpeg は、高速版が二種類ほどありますが、ライセンス的に libjpeg with x86 SIMD extension の方を使っています。ちなみにもうひとつとは、libjpeg-turbo です。


というわけで、身近なものをひと通り挙げてみました。何かいいのをご存知でしたら是非教えてください。