
ソフトウェアの移植性とは、ソースコードを様々なプラットフォームで容易に実行できるようにするための設計目標です。移植性を高めるための有効な手段の一つは、アプリケーションロジックとシステムインターフェース間の抽象化を汎用化することです。同じ機能を持つソフトウェアを複数のコンピューティングプラットフォーム向けに開発する場合、移植性は開発コスト削減の鍵となります。
ソフトウェアの移植性には、以下のような要素が含まれる可能性があります。
同じ系統のオペレーティングシステムを、同様の命令セットを持つプロセッサを搭載した2台のコンピュータにインストールした場合、多くの場合、プログラムファイルを実装するファイルをそれらの間で転送することが可能です。
最も単純なケースでは、ファイルは単に一方のマシンからもう一方のマシンにコピーされるだけです。しかし、多くの場合、ソフトウェアは、特定のデバイス用のデバイスドライバ、インストールされているオペレーティングシステムとサポートソフトウェアコンポーネントの使用、異なるドライブやディレクトリの使用など、詳細なハードウェア、ソフトウェア、および設定に応じてコンピュータにインストールされます。
場合によっては、「ポータブルソフトウェア」と呼ばれるソフトウェアは、互換性のあるオペレーティングシステムとプロセッサを搭載した様々なコンピュータ上で、マシン固有のインストールを必要とせずに動作するように特別に設計されています。ポーティングとは、指定されたディレクトリとその内容を転送することに他なりません。USBメモリなどのポータブル大容量記憶装置にインストールされたソフトウェアは、記憶装置を接続するだけで、互換性のあるコンピュータであればどのコンピュータでも使用でき、すべての構成情報がリムーバブルデバイスに保存されます。ハードウェアおよびソフトウェア固有の情報は、多くの場合、Windowsのレジストリなどの指定された場所にある構成ファイルに保存されます。
この意味で移植性のないソフトウェアは、移行先の環境に対応するために、より大幅な修正が必要となる。
2011年時点では、デスクトップコンピュータとノートパソコンの大部分は、32ビットおよび64ビットのx86命令セットに対応したマイクロプロセッサを使用していた。一方、小型の携帯機器は、 ARMなど、異なる互換性のない命令セットを持つプロセッサを使用している。大型機器と小型機器では、ソフトウェアの動作が細かく異なるため、大型画面で適切に表示するように設計されたアプリケーションを、機能が似ていても、小さな画面のポケットサイズのスマートフォンにそのまま移植することはできない。
Webアプリケーションはプロセッサに依存しないことが求められるため、JavaScriptを用いたWebプログラミング技術を用いることで移植性を実現できます。このようなプログラムは一般的なWebブラウザで実行可能です。ただし、セキュリティ上の理由から、このようなWebアプリケーションはホストコンピュータ、特にファイルの読み書きに関して、制御権限を制限しなければなりません。通常の方法でコンピュータにインストールされる非Webプログラムは、より多くの制御権限を持ちながら、異なるシステムで同じインターフェースを提供する移植性の高いライブラリにリンクすることで、システムの移植性を実現できます。
ソフトウェアは、プラットフォームごとのコンパイルをサポートするプログラミング言語で記述されていれば、ソースコードから異なるオペレーティングシステムやプロセッサ向けにコンパイルおよびリンクすることが可能です。これは通常、プログラム開発者の作業であり、一般ユーザーはソースコードにアクセスすることも、必要なスキルを持ち合わせているわけでもありません。
Linuxのようなオープンソース環境では、ソースコードは誰でも利用できます。以前は、ソースコードは標準化された形式で配布されることが多く、ビルド中にエラーが発生しなければ、ある程度の知識を持つユーザーであれば、標準的なMakeツールを使用して特定のシステム向けの実行可能コードにビルドすることができました。Linuxディストリビューションの中には、ソフトウェアをソースコード形式でユーザーに配布するものもあります。このような場合、通常はシステムに合わせてソフトウェアを詳細に調整する必要はありません。コンパイルプロセスがシステムに合わせて変更される形で配布されます。
CやC++のような一見移植性の高い言語であっても、ソースコードを移植する労力は大きく異なる場合がある。UNIX /32V(1979)の著者らは、「(Bourne)シェルは、移植性がないという単純な理由から、移植性があるとされるプログラムの中で最も大きな変換作業を必要とした」と報告している。[ 1 ]
ソースコードの再コンパイルだけで済む場合もありますが、ソフトウェアの主要部分を書き直す必要がある場合もあります。多くの言語仕様では、実装依存の動作が記述されています(たとえば、C 言語で符号付き整数を右シフトすると、論理シフトまたは算術シフトが実行されます)。オペレーティングシステム関数やサードパーティライブラリがターゲットシステムで利用できない場合があります。一部の関数はターゲットシステムで利用できますが、utime()Windows で EACCES を使用するとディレクトリに対して呼び出されたときに失敗するなど、わずかに異なる動作を示す場合があります。プログラムコードには、インクルードファイルのパス、ドライブ文字、バックスラッシュなど、移植不可能なものが含まれている場合があります。バイト順序やintのサイズなど、実装依存のものも移植作業を増加させる可能性があります。実際には、 CやC++のような言語がWOCA (一度書けばどこでもコンパイル可能) であるという主張は議論の余地があります。