Publickey新野淳一IT羅針盤

「マルチプラットフォーム対応」へと進化するプログラミング言語たち

.NET、Kotlin、Dartなどのプログラミング言語は、1つのソースコードでWindowsやMac、Linux、iOS、Androidなどの複数のプラットフォームのアプリケーションが開発できる「マルチプラットフォーム対応」への動きを本格化させている。そのトレンドを追った。

マルチプラットフォームが1つのトレンドに

アプリケーションのコードを変更することなく、どんなOSでもそのまま、あるいは再コンパイルすればすぐに実行できるという、いわゆるマルチプラットフォーム対応の実現には、これまで多くのプログラミング言語やフレームワークが挑戦してきました。よく知られたところでは、Javaの登場当初にキャッチフレーズとして用いられた「Write Once, Run Anywhere」(一度書けば、どこででも実行できる)が有名でしょう。

実際のところ、サーバーサイドのアプリケーションについてはかなりの完成度でマルチプラットフォーム対応が進んでいると言っていいと思います。例えばNode.js/JavaScriptやJava、Python、Rubyなどで記述したサーバーサイドアプリケーションであれば、LinuxやWindows、Macなど異なるOSの上でも、そのまま実行可能なマルチプラットフォーム対応を現実的な範囲で実現できています。

一方のクライアントサイドについては、Windows用に開発されたアプリケーションをそのままプログラムを変更せずにMacで実行する、もしくはLinuxで実行するといったことは、例えば表計算のマクロやWebアプリケーションといったものを除けば、これまであまり実現していません。

一般に、Windows対応のアプリケーションを開発するには.NETなどのマイクロソフトが提供する開発環境を用い、macOSやiOSなどに対応したアプリケーションの開発にはXcodeやSwift言語といったAppleが提供するテクノロジーを用いた開発環境を利用します。

それぞれのOSごとに用意された開発環境に加えて、ユーザーインターフェースの違いも、クライアントサイドにおけるマルチプラットフォーム対応の大きな課題となっています。それぞれのOSごとに異なるボタンやスクロールバーなどのコンポーネントの違い、フォントの違い、iPhoneやAndroidなどのモバイルデバイスまでカバーしようとすれば画面の大きさも違います。

これらの違いをすべて吸収し、プログラムを書けばすべてのOSに対応するというマルチプラットフォーム対応は、Webアプリケーションでは実現できたとしても、ネイティブアプリケーションでは困難とみられてきました。

もちろん一部では、クライアントサイドにおけるマルチプラットフォーム対応を実現する開発環境が過去にありました。エンバカデロのRAD Studioなどはそうした製品の1つでしたが、広く使われたとは言い難い面があります。またWeb技術をベースにしたプロダクトとしては、古くはAdobe FlashやMicrosoft Silverlightをベースにしたもの(Adobe Airなど)がありましたし、いわゆるハイブリッドアプリケーションのためのフレームワークであるApache CordvaやElectronも広く使われています。

そうした中でいま起きているのは、ネイティブアプリケーションにおいてマルチプラットフォーム対応を実現しようとするプログラミング言語やフレームワークが複数登場しており、1つのトレンドになっていることです。

例えばマイクロソフトの.NET環境は、WindowsもmacOSもLinuxもサポートします。Appleが開発したSwift言語も、Windowsをサポートするようになっています。今回はその動向をお伝えしましょう。

野心的な取り組みを見せる「.NET」

マルチプラットフォームに対して最も野心的な取り組みをみせるのは、マイクロソフトの.NETでしょう。.NETはもともとWindowsアプリケーション開発のために、プログラミング言語のC#などを含むフレームワークとして登場しました。

しかし、マイクロソフトは2014年に.NETのマルチプラットフォーム対応とオープンソース化という方向転換を発表。2021年11月に登場予定の「.NET 6」ではWindows、Mac、Linuxのデスクトップアプリケーション、iPhoneやiPad、Androidなどのモバイルアプリケーション、クラウド上で実行できるLinuxサーバーやWindowsサーバーなどのサーバーアプリケーション、Webアプリケーション、IoTアプリケーション、ゲームなど、あらゆるプラットフォームに対応することを明らかにしています。

この.NET 6には、単一のソースコードでWindows、macOS、iOS、Androidそれぞれのネイティブユーザーインターフェイスインターフェースを記述できるUIフレームワークの「.NET Multi-platform App UI」(.NET MAUI)も含まれています。これにより、異なるルック&フィール、異なる画面サイズに対して、1つのソースコードで記述できるようになると説明されています。

マイクロソフトはこの.NET以外にも、開発環境のVisual StudioやVisual Studio Codeを用いることでマルチプラットフォーム対応の開発もカバーしており、マイクロソフトテクノロジーによって、すべてのプラットフォーム向けのアプリケーション開発を統合するという戦略を積極的に推し進めています。

写真1●.NETはマルチプラットフォーム対応へ https://www.youtube.com/watch?v=mZRNjixZEMg
写真2●.NET MAUIはクロスプラットフォームのネイティブUIに対応 https://www.youtube.com/watch?v=mZRNjixZEMg

モバイルアプリ開発からマルチプラットフォームへ「Dart」

Googleが主導してオープンソースで開発しているDart言語も、マルチプラットフォームを強力に推進しています。C#言語にフレームワークの.NETが用意されているように、Dart言語にもフレームワークとして「Flutter 2」が用意されています。

Flutter 2は2021年3月に登場したフレームワークです。単一のコードベースでAndroid、iOSのネイティブなモバイルアプリケーション、Windows、Mac、Linuxのネイティブなデスクトップアプリケーション、Webアプリケーション、そして組み込みデバイスのアプリケーションまでを生成できる、マルチプラットフォームのアプリケーション開発に対応するフレームワークです。

Flutter 2の前身として2018年に登場した「Flutter」は、AndroidとiOSのネイティブアプリケーション、そしてWebアプリケーションに対応したモバイルアプリケーションを、1つのコードで記述できるマルチプラットフォーム対応フレームワークとして登場しました。

とくに美しく高速なUIにこだわったフレームワークとして、ピクセル単位で記述可能な能力を備え、デザイン面で妥協することなくマテリアルデザインに対応した美しいユーザーインターフェースを表現でき、ハードウェアアクセラレーション対応の2Dグラフィックスエンジンを搭載し、高速な画面描画などを特長としています。

.NETがWindows用フレームワークからマルチプラットフォーム対応へと進化したように、FlutterもFlutter 2へ進化する過程で対応プラットフォームを広げ、Android、iOS、Windows、Mac、Linux、Web、IoTにまで対応することになります。

ちなみに、トヨタが新しい自動車向けのインフォテインメントシステム(インフォメーション+エンターテインメント)の開発にFlutter 2を採用したことが発表されています。

写真3● Flutter 2は単一コードでマルチプラットフォーム対応を目指す https://developers.googleblog.com/2021/03/announcing-flutter-2.html
写真4●トヨタがFlutter 2採用を発表 https://developers.googleblog.com/2021/03/announcing-flutter-2.html

KotlinもAndroidからマルチOS対応へ

Android用の開発言語として人気が高いプログラミング言語Kotlinも、マルチプラットフォーム化を推進しているところです。

Kotlinは、統合開発ツールIntelliJ IDEAなどの開発を行っているJetBrainsが中心となってオープンソースで開発されているプログラミング言語。2017年にGoogleがKotlinをAndroidの正式な開発言語にしたことで脚光を浴びるようになりました。

2018年にはKotlinの対応言語が拡張され、AndroidだけでなくiOS、Windows、Mac、Linuxのネイティブアプリケーションも開発できる「Kotlin/Native」が登場します。

マルチプラットフォームに対応したUIフレームワークも登場しました。KotlinでAndroidアプリケーションを開発するためのUIフレームワークとして、GoogleのJetpack Composeが用意されています。もともとAndroidのUIを構成するにはXMLのコードを記述しなければならず、開発者はKotlinでプログラミングするのに加えて、UIをXMLで構成するという手間がかかっていたのですが、Jetpack ComposeによりXMLを用いることなく、UIもすべてKotlinのコードで記述できるようになりました。

etBrainsはこのJetpack Composeをもとに、Windows、Mac、Linuxのデスクトップアプリケーションを開発できるように拡張した「Jetpack Compose for Desktop」を2020年に発表。そして2021年には、Webアプリケーションの開発に対応した「Jetpack Compose for Web」も発表します。これによりKotlinでAndroid、iOS、Windows、Linux、Webと、さまざまなアプリケーションの開発が容易になるのです。

ほかにアップルが主導して開発しているSwift言語も、Windowsなどに対応し始めており、WebAssemblyもWebブラウザだけでなく、各種OSを含むマルチプラットォーム対応のAPI「WASI」の策定が進むといった動きがあります。

写真5●Kotlinもマルチプラットフォーム対応を表明 https://youtu.be/PsaFVLr8t4E

プログラミング言語の「マルチプラットフォームへの条件」

なぜ、このようにマルチプラットフォーム対応を積極的に推進するプログラミング言語やフレームワークが登場しているのでしょうか。

その大きな理由の1つは、言語とフレームワークを発展・成長させる重要な選択肢としてマルチプラットフォーム対応があるからでしょう。現在、コンピュータープラットフォームは数多くあります。iPhoneやAndroidのようなスマートフォンやタブレット、 WindowsやMac、Linuxのデスクトップ、さらにIoTやクラウドなどの選択肢もある中で、特定のプラットフォームしかサポートしていないとすれば、その言語を使う開発者の数はそれほど増えず、人気も上がらず、エコシステムも発展せずに衰退していく可能性が高まってしまいます。プログラミング言語やフレームワークが発展する上で、開発者の人気を集めようとする努力を怠るわけにはいかないのです。そのなかの施策の一つとしてマルチプラットフォーム対応もあるのです。

しかし、どんなマルチプラットフォーム対応を推進するにも多くの人的リソースが必要で、ある程度の規模の組織のバックアップがなければ推進できないことも事実です。そうした能力と覚悟を持つ組織のバックアップによって、言語を発展させるための大胆な施策の1つとして、マルチプラットフォーム対応は進められています。

※このコラムは不定期連載です。
※会社名および商標名は、それぞれの会社の商標あるいは登録商標です。

新野淳一

新野淳一Junichi Niino

ブログメディア「Publickey」( http://www.publickey1.jp/ )運営者。IT系の雑誌編集者、オンラインメディア発行人を経て独立。新しいオンラインメディアの可能性を追求。