こんなに違う? AndroidとiOSの開発流儀

山本 隆一郎

tag: 組み込み Interface

コラム 2011年9月 9日

●GCと参照カウンタ

 iPhoneとAndroidでは,メモリの確保と解放も異なります.

 AndroidのJavaはGC(ガベージ・コレクション)を実装しているので,オブジェクトの解放は全てシステム側で自動的に行われます.クラスをnewで作成することはあっても,C++のようにdeleteでプログラマが明示的に削除する必要はありません.プログラマは何も気にせず,必要なときに欲しいだけインスタンスをnewして,後はAndroid任せのほったらかしです.GCでリアルタイム性が損なわれようが,重くなろうが,それはハードウェアの進化がきっと解決してくれる課題なのです.だから,プログラマがいちいちメモリ解放のタイミングを巧妙に設計したり,CやC++のようにfreeやdeleteを忘れていたり,やりすぎてしまって,メモリリークやsegmentation faultでデバッグに悩むという泥臭いこととは無縁です.これは一体,いいのか悪いのかは微妙ですが.

 対して,iOSのメモリ管理はちょっと中途半端です.Mac OSではLeopard(MacOS X 10.5)からObjective-C2.0としてGCを持つので,Objective-C単体でのMac OSのプログラミングではそれほど悩みません.しかし,iPhoneやiPadでは組み込み向けということもあってか,GCは採用されませんでした.その代わりに,参照カウンタというしくみを実装しています.メモリを確保して参照したら参照カウンタをアップして,不要になったらカウンタを下げるというものです.進化してるんだか,泥臭いんだか分かりません.

 実はこれがくせ者で,プログラマの意図しないところでメモリ解放が行われたり,逆にメモリに残ったりと,iOSプログラミングの一つの壁になっています.バグの原因としても,上位にあげられる問題です.

 個人的には,GCを採用しないのは一つの美学として理解できるので,それなら参照カウンタのような中途半端なものを用いずに,ここは漢らしく,C言語やC++言語のmalloc/freeやnew/deleteで100%明示的に記述する方がよかったのではないかと感じています.

 プログラマにとって,いつの時代もメモリ管理は永遠の課題です.AndroidとiPhoneでは,その設計と実装によって,プログラミング・スタイルもデバッグの労力も異なります.

 

●開発用ハードウェア

 開発用のハードウェアも忘れてはなりません.Androidは例によって自由です.Windowsだけでなく,LinuxやMac OSでも開発できます.Windowsに関しては,XPやVista, 7もOKで,64ビットOSでも大丈夫です.

 それに対して,iPhoneはAppleがMacを製造販売するメーカということもあり,iPhoneのアプリの開発は正規の方法ではMacでしかできません.当たり前と言えば当たり前なのですが,最低でもMacを購入しないとiOSの開発はできないのです.

 事実,AppleはiPhoneの販売台数増加とともに,Mac製品の販売台数も増加しているようです.

 筆者は,WindowsもLinuxもMacも使う三刀使いではありますが,ベースの開発用ハードウェアは長らくIBMのThinkPadでした.PC110からThinkPad X61まで,次々にThinkPadを乗り換えて,IBMがLenovoに変わってもしばらくThinkPad派で居続けました.漢のノートPCといえば断然ThinkPad!というぐらいThinkPad党で,客先に出向くバッグには,ThinkPad2台とiPhone開発用のMacBookの合計3台を入れて,腰痛になりながらもえっちらおっちらモバイルしていました.

 しかし,現在はあっさりとMacBook Pro(写真1)1台のみです.MacBook Proがあれば,iPhoneはもちろん,Androidの開発もできます.VMWare fusionを導入すれば,LinuxもWindowsも仮想環境で動かし放題です.そして,Macの持つExposとSpacesのような仮想デスクトップ機能や数々の便利な機能,アルミニウムのブロックから削り出された堅牢なユニボディ,滑らかで官能的なガラス処理をしたトラックパッドを体験してしまうと,もうほかのデバイスには戻れません.

 

写真1 MacBook Pro

 

 こうして筆者も,結局はApple信者になっていったのでした.... おそるべしApple!

 

●エミュレータ

 最近の携帯向けデバイスの開発では,必ずしも実機は必須でなく,開発プロセスの大半をエミュレータとともに過ごします.

 例えばWindows MobileやBREWアプリの開発では,パソコンのVisual Studio上のエミュレータで携帯機器そっくりの仮想のデバイスが表示され,その上でプログラムを走らせてデバッグします.AndroidやiPhoneでも同じスタイルですが,この二つのプラットホームは決定的に異なります.

 Androidのエミュレータ(図2)は文字通りエミュレーション(模倣)をする正真正銘のそれであり,Androidデバイスだけでなく,そのベースとなるLinux OSやARMのCPUレベルからエミュレートします.つまり,エミュレータとはいえ,動いているのは本物のLinuxとAndroidなのです.そのため,とても重いのですが,エミュレータで動作確認のとれたプログラムは,実機でもほぼ同じように動きます.Androidのエミュレータの精度と確度はとても高いものといえます.

 

図2 Androidエミュレータ

 

 それに対してiPhoneは厳密にはエミュレータでなくシミュレータ(図3)です.事実,Mac OS上ではiPhoneシミュレータと表示されています.アプリからコールされたiOSのAPIは,iPhoneシミュレータ上で全てMac OSのCocoaフレームワークに変換され,Mac OSのフレームワークとして処理され実行します.そのため,シミュレータでは動いたけれど,実機では動かないというようなことも多くあります.完全にエミュレートしているわけではないのです.

 

図3 iPhoneシミュレータ

 

 また,土台となるMac OSを搭載したCore i7やマルチコアのPCパワーで処理しているので,ゲームやビデオ関連の重いアプリもシミュレータでは韋駄天の早さです.シミュレータで,「これは早い,最高!」と自画自賛した処理も,iPhoneの実機では亀のような遅さでがっくりした経験を筆者も持ちます.また,ゲームのようなタイミング調整が必要なアプリも要注意です.その反面,シミュレータは軽く,すぐに実行できるので,開発中のデバッグやトライ&エラーはとても快適です.

 これに対してAndroidでは,いったんエミュレータを落とすと,再立ち上げに時間がかかるので,ひとまずカップラーメンでも作ろうかな?という気分になります.

組み込みキャッチアップ

お知らせ 一覧を見る

電子書籍の最新刊! FPGAマガジン No.12『ARMコアFPGA×Linux初体験』好評発売中

FPGAマガジン No.11『性能UP! アルゴリズム×手仕上げHDL』好評発売中! PDF版もあります

PICK UP用語

EV(電気自動車)

関連記事

EnOcean

関連記事

Android

関連記事

ニュース 一覧を見る
Tech Villageブログ

渡辺のぼるのロボコン・プロモータ日記

2年ぶりのブログ更新w

2016年10月 9日

Hamana Project

Hamana-8最終打ち上げ報告(その2)

2012年6月26日