SwiftとKotlinについて調べていて、Youそんなに似てるんなら相互コンパイラや変換環境作っちゃいなよ(俺が作るとは言ってない)、と思ってそんなの作ってる人いないか探してたら、表題のようなものを見つけてしまいました。
Swiftを、Java(JVM)や.NETの上で動くようにコンパイルする無料コンパイラ、Silver
http://elementscompiler.com/elements/silver/
Silverで無料開発Android/iOS/.NET開発できる他、有料だとc#/Oxygenでの開発もできるIDE、Fire
http://elementscompiler.com/elements/fire/
まだβ版で、2015後半での正式版公開を目指しているようですが、とりあえず今でも最低限のものは動くようです。
iOS、Android両方のプロジェクトを含んだソリューション
Androidでの実行結果、デバグコンソール。なんかiOSと違う表示、不安をそそるエラー表示っぽいのが嫌な感じ
とりあえず実行してみて思ったのは、コンパイルが速い!
最低限のビューだけのアプリですし、最終コンパイルはiOS SDKやAndroid SDK使ってるわけですから、それより速いわけは原理的にないのですが、それでも一瞬という印象を受けます。
Xamarinの遅いコンパイルに慣れた身には、すごいと感じました。
が、その他のところはやはりまだまだβクオリティのようです。
- 「最近開いたファイル」が、メニューには出てくるけどスプラッシュスクリーンには出てこない
- 単独プラットフォーム(例:iOS)で作ったソリューションに別プラットフォーム(例:Android)を追加しても、一度ソリューションを閉じないと追加側がコンパイルできない
- マルチプラットフォームソリューションにすると、今現在デバグしているデバイスが画面上に出てこない
- 実機を繋いでも、数分レベルでデバイスリストに上がってこない
などなど、ちょっと触っただけでもアラが目立ちます。
とはいえ、βとして出しているものなので、その辺はレポートを上げていけば、直っていくのでしょう。
XIB/Storyboardや、Androidのデザインxml等はXcodeやAndroid Studioのエディタを積極的に借りていくスタイルのようです。
また、Silverのコンパイルの方も、Apple標準Swiftとの差がこちらに挙げられています。
http://docs.elementscompiler.com/Silver/DifferencesAndLimitations/
現時点でのバグとしての仕様差の他、Silverはマルチプラットフォームを目指しているために、JVMや.NET仕様の側による形で、今後も埋まらない差としての仕様差も挙げられています。
この辺は将来Swiftのライブラリ資産が溜まってきた時に地味に影響してきそうですが、.NET/XamarinでもiOSではAOTであるが故の取り込めない仕様差などがあるわけなので、まあ許容範囲なのかなと思います。
今を時めく言語のSwiftを使って、マルチプラットフォームを実現しようという野心的なプロジェクト、かつSwiftは無料なので、軽くウォッチしておけば、将来化ける可能性もあるかもしれません。
追記:
標準Swiftと差がある仕様だけでなく、上方互換としての機能があるのにも気づきました。
http://docs.elementscompiler.com/Silver/LanguageExtensions/
読んでみると、c#で便利なawait/async系や、マルチキャストイベント、クロスプラットフォーム開発に便利なPartialクラス、等の仕様が加えられているようです。
そのうち、LINQ相当の機能なども、付け加えられるのかもしれません。
追記2:
Swift2やSwiftのOSS化について、対応をRemObjectsに聞いてみました。
結果、
- Swift2には対応するよ。というかもう作業始めてるよ
- SwiftのOSS化は、こちらのコンパイラに対するインパクト自体は少ないと思うけど、AppleのSwiftライブラリとの連携などには活かされそう
ということのようです。