酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

iOSアプリからWindowsストアアプリやXamarin.iOSへ移植したい方へ。Objective-C to C#変換ツール「Automagical」が出ました

生存戦略しましょう! by Akkun on pixiv

スマートフォンアプリ開発に従事している方は、案件によってC#(Windows Mobile、Windowsストアアプリ)であったりObjective-C(iPhone/iPad)であったり、Java(Android)であったり各プラットフォームによって様々な言語を使い分けられていると思います。

日本市場の場合は同程度iOSとAndroidの勢力が強いため、同じタイトルのアプリをそれぞれで動くようにObjective-CとJavaで書いているという方も多いのではないでしょうか。

2回も3回も同じ処理をそれぞれのプラットフォームごとに書きたくない、そのような状況におかれた開発者がいつも夢見るのがwrite once, run anywhereです。*1

プラットフォーム固有の機能やUIパーツが存在しているので、実際には1回書けばそれで全て終わりという魔法のようなことはありませんが、処理の共通化が可能なJavaScriptで書く「Titanium Mobile」や「PhoneGap」、Luaで書く「Corona SDK」といったようなソリューションが存在しています。

以前、このブログでも取り上げたことのあるC#でAndroidアプリやiOSアプリを書くことができるソリューション「Xamarin」もそのひとつです。Xamarinは、.NET Framework互換環境を提供するMonoプロジェクトから派生したプロダクトです。詳しくは国内販売代理店であるエクセルソフト株式会社の「Xamarin 特長 - C# で iOS、Android アプリを開発 : エクセルソフト」をご覧ください。

スマートフォンアプリを開発している会社は多々ありますが、その中でもMicrosoftのテレBingやNHKの紅白アプリなどを開発したことでも有名な「フェンリル株式会社」でも、iOSやAndroid、Windowsストアアプリなど複数のクロスプラットフォーム開発でXamarinを使っていることを発表しました。このニュースを見てTwitterやFacebookでC#erの方々が沸いていたのが記憶に新しいです。

しかし、クロスプラットフォーム開発できるといっても弊社など今までのObjective-C資産が多々ある会社がいきなり飛びつくことができません。個人開発でも手持ちのObjective-Cで書かれたオレオレライブラリをC#へ移植するのが躊躇してしまいます(めんどうくさいし)。

……ということで前置きが遅くなりましたが、僕のような面倒くさがり屋な開発者のため(かどうかはわからないのですが)にObjective-CのソースコードをC#のソースコードへ変換してくれるツール「Automagical」が発売されました。

このツールで何ができるの?

Automagicalでできることが「Automagical features: Objective-C to C# source code translation」で紹介されています。少し和訳してみました。

  • コードの変換
  • コードを変換するためのGUIの提供
  • #defineをスタティッククラスへまとめる機能
  • CからC#の列挙型の変換
  • (Objective-Cの)メモリ管理の呼び出しやポインタ操作の削除
  • 指定した名前空間でコードをラッピング
  • Objective-Cの@interfaceをC#のクラスへ変換
  • Objective-Cの@protocolをC#のインターフェースへ変換
  • Unmangle method signatures into CamelCase method names.
  • Translate expressions, statements and literals (strings, booleans, NSLog, for-in).
  • Translate some types (NSString, BOOL, NSObject, NSTimeInterval, id<>).
  • Translate C array syntax.
  • Translate NSArray/NSMutableArray messages into ArrayList method calls.
  • Changes C math functions into Math class calls.
  • Unroll #define macros.
  • Translate block syntax into anonymous delegates.
  • Translate exception throwing and some exception types.
  • Handle NSCoding with a special C# library.

などなど*2沢山な機能がサポートされています。

まとめ

この手の自動変換ツールは完璧な移植してくれるわけではないのが常ですが、様々なプログラミング言語で書かれたプロダクトをC#(そしてXamarin)で統一したいと考えている方の取っ掛かりになればと思います。

*1:id:donayamaさんのコメントを見て追記。開発者が夢見るのが「一度書いたら全ての環境で動いてほしいな」で、Titaniumが「write once, run anywhere」を掲げていると書いたつもりはなかったので段落を分けました。分かりにくくてすみません……

*2:すみません、途中で飽きました...