
コンピューティングにおいて、クロスプラットフォームソフトウェア(マルチプラットフォームソフトウェア、プラットフォーム非依存ソフトウェア、またはプラットフォーム非依存ソフトウェアとも呼ばれる)は、複数のコンピューティングプラットフォームで動作するように設計されたコンピュータソフトウェアである。[ 1 ]クロスプラットフォームソフトウェアの中には、プラットフォームごとに個別のビルドが必要なものもあるが、インタプリタ言語で記述されているか、インタプリタやランタイムパッケージがサポートされているすべてのプラットフォームで共通または標準のコンポーネントであるポータブルバイトコードにコンパイルされているため、特別な準備なしにどのプラットフォームでも直接実行できるものもある。[ 2 ]
例えば、クロスプラットフォームアプリケーションは、 Linux、macOS、Microsoft Windowsで動作する可能性があります。クロスプラットフォームソフトウェアは、多くのプラットフォームで動作する場合もあれば、2つだけの場合もあります。クロスプラットフォーム開発のためのフレームワークには、Codename One、ArkUI-X、Kivy、Qt、GTK、Flutter、NativeScript、Xamarin、Apache Cordova、Ionic、React Nativeなどがあります。[ 3 ]
プラットフォームとは、オペレーティングシステム(OS)やアプリケーションが動作するプロセッサ(CPU)やその他のハードウェアの種類、OSの種類、またはその両方の組み合わせを指すことがあります。[ 4 ]一般的なプラットフォームの例としては、ARMアーキテクチャファミリー上で動作するAndroidがあります。その他によく知られているプラットフォームとしては、 Linux / Unix、macOS、Windowsなどがあり、これらはすべてクロスプラットフォームです。[ 4 ]アプリケーションは、特定のプラットフォーム(ハードウェア、OS、仮想マシン(VM)のいずれか)の機能に依存するように記述できます。たとえば、Javaプラットフォームは、多くのOSやハードウェアの種類で動作する一般的なVMプラットフォームです。
ハードウェアプラットフォームとは、命令セットアーキテクチャを指す場合がある。例えば、ARMアーキテクチャやx86アーキテクチャなどである。これらのマシンは、様々なオペレーティングシステムを実行できる。
スマートフォンやタブレットは一般的にARMアーキテクチャを採用しており、多くの場合、AndroidやiOSなどのモバイルオペレーティングシステムが動作しています。
ソフトウェアプラットフォームは、オペレーティングシステム(OS)またはプログラミング環境のいずれかですが、一般的には両方の組み合わせです。例外としてJavaがあり、 Javaバイトコードを実行するためにOSに依存しない仮想マシン(VM)を使用します。ソフトウェアプラットフォームの例としては、以下のようなものがあります。
Java言語は通常、Javaプラットフォームの一部である仮想マシン(VM)上で実行するようにコンパイルされます。Java仮想マシン(Java VM、JVM)は、ソフトウェアで実装されたCPUであり、すべてのJavaコードを実行します。これにより、JVMを実装するすべてのシステムで同じコードを実行できます。Javaソフトウェアは、ハードウェアベースのJavaプロセッサによって実行することもできます。これは主に組み込みシステムで使用されます。
JVMで実行されるJavaコードは、適切な権限が付与されていれば、ディスク入出力(I/O)やネットワークアクセスなどのOS関連サービスにアクセスできます。JVMはJavaアプリケーションに代わってシステムコールを実行します。これにより、ユーザーはアクセス制御リスト(ACL)に基づいて適切な保護レベルを決定できます。たとえば、デスクトップアプリケーションでは通常ディスクアクセスとネットワークアクセスが有効になりますが、ブラウザーベースのアプレットでは有効になりません。Java Native Interface(JNI)を使用してOS固有の機能にアクセスすることもできますが、移植性は低下します。
現在、Java Standard Editionソフトウェアは、Microsoft Windows、macOS、複数のUnix系OS、および組み込み機器向けの複数のリアルタイムオペレーティングシステムで動作します。モバイルアプリケーションの場合、WindowsおよびMacベースのデバイスではブラウザプラグインが使用され、AndroidはJavaを標準でサポートしています。また、Java CardやJava Platform Micro Editionなど、リソース制約のあるデバイス向けに設計されたJavaのサブセットも存在します。
ソフトウェアがクロスプラットフォームであるとみなされるためには、複数のコンピュータアーキテクチャまたはOS上で動作する必要があります。異なるOSは異なるアプリケーションプログラミングインターフェース(API)を持つため、このようなソフトウェアの開発は時間のかかる作業となる場合があります。
あるOS向けに書かれたソフトウェアが、そのOSがサポートするすべてのアーキテクチャで自動的に動作するとは限りません。CやC++といった一般的なプログラミング言語で書かれたソフトウェアであっても、その言語をサポートするすべてのOS、あるいは同じOSの異なるバージョンで動作するとは限らないのです。
ウェブアプリケーションは、理想的にはどのウェブブラウザからでもアクセスできるため、一般的にクロスプラットフォームと呼ばれます。つまり、ブラウザがプラットフォームとなるのです。ウェブアプリケーションは一般的にクライアント・サーバーモデルを採用していますが、その複雑さや機能は多岐にわたります。機能の充実と互換性の必要性を両立させるのは難しい場合があります。
基本的なWebアプリケーションは、ステートレスサーバーで処理のすべてまたは大部分を実行し、その結果をクライアントのWebブラウザに渡します。アプリケーションとユーザーとのやり取りはすべて、データ要求とサーバー応答の単純な交換で構成されます。このタイプのアプリケーションは、World Wide Webアプリケーション開発の初期段階では標準でした。このようなアプリケーションは、静的Webページを提供するのと同様の単純なトランザクションモデルに従います。今日でも、特に高度な機能よりもクロスプラットフォーム互換性とシンプルさが重要視される場合、このようなアプリケーションは比較的よく使われています。
高度なウェブアプリケーションの代表的な例としては、 Gmailや Googleマップのウェブインターフェースが挙げられます。こうしたアプリケーションは、多くの場合、人気のあるウェブブラウザの最新バージョンにのみ搭載されている追加機能に依存しています。これらの機能には、Ajax、JavaScript、動的HTML、SVG、その他リッチウェブアプリケーションの構成要素が含まれます。
互換性と機能性という相反する利害関係が存在するため、数多くの設計戦略が生まれてきた。
多くのソフトウェアシステムは階層型アーキテクチャを採用しており、プラットフォームに依存するコードは最上位層と最下位層に限定されている。
グレースフルデグラデーションとは、すべてのユーザーとプラットフォームに対して同じまたは類似の機能を提供しつつ、機能が制限されたクライアントブラウザ向けには、その機能を最小限の機能レベルまで縮小する手法です。例えば、機能が制限されたブラウザを使用してGmailにアクセスしようとしたユーザーは、Gmailが基本モードに切り替わり、機能が制限されるものの、依然として利用できることに気づくでしょう。
一部のソフトウェアは、異なる(ハードウェアおよびOS)プラットフォーム向けに、同等の機能を持つ別々のコードベースで保守されています。これはコードの保守に多くの労力を必要としますが、プラットフォーム固有のコード量が多い場合には、その価値があると言えます。
この戦略は、複数のプラットフォーム固有の形式にコンパイルできる単一のコードベースを持つことに依存しています。 1 つの手法は条件付きコンパイルです。 この手法では、すべてのプラットフォームに共通するコードは繰り返されません。 特定のプラットフォームにのみ関連するコードブロックは条件付きにされ、必要な場合にのみ解釈またはコンパイルされます。 もう 1 つの手法は機能の分離で、ブラウザや OS でサポートされていない機能を無効にしながら、完全なアプリケーションをユーザーに提供します。 (参照:関心の分離) この手法は、解釈コード (スクリプト言語など) が実行中のプラットフォームに問い合わせて、異なるブロックを条件付きで実行できる Web 開発で使用されます。[ 6 ]
サードパーティライブラリは、ベンダーロックインという代償を伴いながら、クライアントの差別化の複雑さを単一の統一されたAPIの背後に隠すことで、クロスプラットフォーム機能を簡素化しようと試みます。
レスポンシブウェブデザイン(RWD)とは、モバイル端末からデスクトップパソコンのモニターまで、幅広いデバイスにおいて、最小限のリサイズ、パン、スクロールで読みやすく、操作しやすい、最適な閲覧体験(読みやすさとナビゲーション性)を提供するようにサイトの視覚的なレイアウトを設計することを目的としたウェブデザインの手法です。この手法では、プラットフォーム固有のコードはほとんど、あるいは全く使用されません。
クロスプラットフォームアプリケーションには、より多くの統合テストが必要です。一部のWebブラウザでは、同じマシンに異なるバージョンをインストールすることが禁止されています。複数のプラットフォームを対象とするためのアプローチはいくつかありますが、いずれもテストとメンテナンスにかなりの手作業を必要とするソフトウェアになります。[ 7 ]この問題の回避策として、完全仮想化などの技術が使用されることがあります。
Page Object Modelなどのツールを使用すると、クロスプラットフォームテストをスクリプト化して、1つのテストケースで複数のバージョンのアプリをカバーできます。異なるバージョンでもユーザーインターフェースが似ている場合は、1つのテストケースですべてをテストできます。
ウェブアプリケーションはますます普及しているが、多くのコンピュータユーザーは依然として、クライアント/ウェブサーバーアーキテクチャに依存しない従来型のアプリケーションソフトウェアを使用している。従来型アプリケーションとウェブアプリケーションの区別は必ずしも明確ではない。ウェブアプリケーションと従来型アプリケーションの機能、インストール方法、アーキテクチャは重複しており、その区別は曖昧になっている。とはいえ、この簡略化された区別は、一般的で有用な一般化である。
従来のアプリケーションソフトウェアは、バイナリファイル、特に実行可能ファイルとして配布されてきました。実行可能ファイルは、それが構築されたプラットフォームのみをサポートするため、単一のクロスプラットフォーム実行可能ファイルには、特定のプラットフォームでは実行されないコードが大量に含まれてしまう可能性があります。そのため、一般的には、それぞれが特定のプラットフォーム向けに構築された複数の実行可能ファイルが用意されています。
C言語やC++で記述されたソフトウェアのように、バイナリ実行ファイルとして配布されるソフトウェアの場合、単一のコードベースを複数のバイナリ実行ファイルに変換する(トランスコンパイルする)ツールセットを使用して、プラットフォームごとにソフトウェアをビルドする必要があります。たとえば、オープンソースのWebブラウザであるFirefoxは、Windows、macOS( Apple社がユニバーサルバイナリと呼ぶものを介してPowerPCとx86の両方)、Linux、およびBSDで、複数のコンピュータアーキテクチャ上で利用可能です。4つのプラットフォーム(この場合はWindows、macOS、Linux、およびBSD)は、ほぼ同じソースコードから作成されていますが、それぞれ独立した実行ファイルです。まれに、複数のプラットフォーム向けにビルドされた実行コードが、ファットバイナリと呼ばれる単一の実行ファイルにまとめられることがあります。
異なるツールセットを使用するだけでは、異なるプラットフォーム向けに動作する実行可能ファイルを作成するには不十分な場合があります。この場合、プログラマーはソースコードを新しいプラットフォームに移植する必要があります。例えば、x86ファミリーのWindowsで既に動作しているFirefoxのようなアプリケーションは、x86(および場合によっては他のアーキテクチャ)上のLinuxでも動作するように変更および再ビルドできます。コードの複数のバージョンは、別々のコードベースとして保存することも、1つのコードベースに統合することもできます。
移植の代替手段として、クロスプラットフォーム仮想化があります。これは、あるプラットフォーム向けにコンパイルされたアプリケーションを、ソースコードやバイナリを変更することなく、別のプラットフォームで実行できる技術です。例えば、IntelベースのMacintoshコンピュータに組み込まれているAppleのRosettaは、PowerPC CPUを使用していた前世代のMac向けにコンパイルされたアプリケーションを実行できます。また、IBM PowerVM Lx86は、Linux/x86アプリケーションをLinux/Power OS上で変更せずに実行できる技術です。
クロスプラットフォームバイナリソフトウェアの例:
スクリプトは、そのインタプリタが複数のプラットフォームで利用可能であり、かつスクリプト自体が言語に組み込まれた機能のみを使用している場合に、クロスプラットフォームであるとみなされます。例えば、Unix系システム向けにPythonで書かれたスクリプトは、PythonがWindowsでも動作するため、ほとんど、あるいは全く変更を加えることなくWindows上で実行できる可能性が高いです。実際、多くの実装が存在します(例:.NET Framework用のIronPython)。これは、多くのオープンソースのスクリプト言語にも当てはまります。
バイナリ実行ファイルとは異なり、スクリプトは、スクリプトを解釈するソフトウェアがインストールされているすべてのコンピュータで使用できます。これは、スクリプトが通常、テキストファイルにプレーンテキストで保存されているためです。ただし、改行文字の表現など、些細な問題が発生する場合があります。
人気のあるクロスプラットフォームスクリプト言語には以下のようなものがあります。
クロスプラットフォームまたはマルチプラットフォームという用語は、さまざまなゲーム機でリリースされるビデオゲームにも適用されます。クロスプラットフォームゲームの例としては、 Miner 2049er、Tomb Raider: Legend、FIFAシリーズ、NHLシリーズ、Minecraftなどがあります。
それぞれが、 Wii、PlayStation 3、Xbox 360、パソコン、モバイル端末など、さまざまなゲームプラットフォーム向けにリリースされている。
プラットフォームによっては、他のプラットフォームよりも開発が難しく、同じ水準のビデオゲームを開発するにはより多くの時間が必要となる場合があります。これを補うため、ビデオゲームはまずいくつかのプラットフォームでリリースされ、その後他のプラットフォームでリリースされることがあります。これは通常、新しいゲーム機が発売された際に起こります。なぜなら、ビデオゲーム開発者はそのハードウェアとソフトウェアに慣れる必要があるからです。
開発者とゲーム機メーカー間のライセンス契約により、開発が特定のゲーム機に限定されるため、一部のゲームはクロスプラットフォームに対応していない場合があります。例えば、ディズニーが最新の任天堂とソニーのゲーム機向けにゲームを開発した場合、ディズニーが最初にソニーとライセンス契約を結んだ場合、短期間または無期限にソニーのゲーム機のみでゲームをリリースする必要が生じる可能性があります。
いくつかの開発者は、異なるプラットフォームを使用しながらオンラインでゲームをプレイする方法を実装しました。Psyonix 、Epic Games、Microsoft、Valveはすべて、Xbox 360とPlayStation 3のゲーマーがPCゲーマーと一緒にプレイできる技術を持っており、どのプラットフォームを使用するかは消費者の判断に委ねられています。PCとコンソールゲーム(特別に作られたキーボードとマウスを備えたドリームキャスト)の間でこのレベルのインタラクティブ性を可能にした最初のゲームはQuake 3でした。[ 11 ] [ 12 ]
クロスプラットフォームのオンラインプレイに対応しているゲームには、ロケットリーグ、ファイナルファンタジーXIV、ストリートファイターV、キラーインスティンクト、パラゴン、フェイブルフォーチュン、そしてWindows 10、VR版、ポケットエディション、Xbox One版でBetter Togetherアップデートが適用されたマインクラフトなどがあります。
クロスプラットフォームプログラミングとは、複数のプラットフォームで動作するように意図的にソフトウェアを作成する手法のことです。
クロスプラットフォームアプリケーションを開発するには、さまざまな方法があります。1つのアプローチは、同じソフトウェアの複数のバージョンを異なるソースツリーに作成することです。つまり、Microsoft Windows版のアプリケーションには1つのソースコードファイルセットがあり、Macintosh版には別のソースコードファイルセットがあり、FOSSの*nixシステムにはさらに別のソースコードファイルセットがあるといった具合です。この方法は単純ですが、1つのプラットフォームのみ向けに開発する場合と比べて、開発チームの規模が大きくなったり、製品のリリースが遅くなったりするため、コストが大幅に増加する可能性があります。また、追跡および修正が必要なバグが増えるというデメリットもあります。
別の方法として、プラットフォーム間の違いを隠蔽するソフトウェアを使用する方法があります。この抽象化レイヤーによって、アプリケーションはプラットフォームから切り離されます。このようなアプリケーションはプラットフォームに依存しません。JVM上で動作するアプリケーションは、この方法で構築されています。
アプリケーションによっては、さまざまなクロスプラットフォームプログラミング手法を組み合わせて最終的なアプリケーションを作成するものがあります。例えば、Firefoxウェブブラウザは、抽象化を用いて低レベルコンポーネントを構築し、プラットフォーム固有の機能(GUIなど)を実装するためのソースサブツリーを別々に用意し、複数のスクリプト言語を実装することでソフトウェアの移植性を高めています。Firefoxは、従来のNetscapeスタイルのブラウザプラグインに加え、ブラウザの拡張のためにXUL、CSS 、JavaScriptを実装しています。ブラウザ自体の大部分は、XUL、CSS、JavaScriptで記述されています。
クロスプラットフォームプログラミングのプロセスを支援するために利用できるツールは多数あります[ 13 ] [ 14 ] 。
クロスプラットフォームソフトウェアの開発には、多くの課題が存在します。
Collabora Office は、Microsoft Office スイートに代わる人気のオープンソースの代替ソフトです。LibreOffice をベースにしており、Windows、Linux、iOS、Android などさまざまなプラットフォームで利用できます。今年 7 月、このオフィス スイートのメジャー アップデートにより、Chrome OS デバイスのサポートが追加されました。
...タッチ操作に最適化されたインターフェース:タブレット用とスマートフォン画面用。 ...(iOS、iPadOS、Chromebook、Android)。
初の実用的なセルフホスト型Webオフィスソリューション。