移植性
概要
ソフトウェアにおいては、他のプラットフォームに合わせてプログラムのソースコードを書き換えるときに、修正が少なくて済む場合を「移植性が高い」と表現する。通例、ソースコードを静的コンパイルあるいはアセンブルして実行プログラム（マシンコード）を事前生成する方式のソフトウェアは、コンパイル時に指定したCPUアーキテクチャやOSなどに応じて、特定の環境でのみ動作する。一般に、移植の際の手間やコストを減らすために、できる限りこの移植性が高いプログラムを書くことが望まれる。
ただし、マーケティング手法によっては移植性の低いプログラミングモデルを用いた方がビジネスとしては成功するケースも存在する。Microsoft Windowsシリーズが現在もデファクトスタンダードの地位を維持できている理由は、他のプラットフォームとの移植性が低く、移行が非常に困難であることによって、極めて強固なベンダーロックインが発生しているからである。
一般的に低級言語 (アセンブラなど) で作成されたプログラムは移植性が低く、高級言語で書かれたプログラムは移植性が高いと言われる。プロセッサ固有の命令を直接記述しなければならない低級言語よりも、命令の生成をコンパイラに任せることのできる高級言語のほうが、ハードウェアを抽象化しやすく、ソフトウェアのロジックに集中できるからである。
C++言語に関しては、規格への準拠度がコンパイラごとに大きく異なることなどを理由に、テンプレートや例外といった比較的後発の機能の使用を制限するコーディング規約を定めることでポータビリティを確保しているプロジェクト例もある。
Javaや.NET Frameworkなど、仮想機械上で動作するプログラムは、仮想機械がプラットフォームの差異を埋めるため、移植性が非常に高い。しかし、仮想機械ごとに実装が違ったり、インストールされているフォントが異なったりと、移植性に関する問題が完全に解決したわけではない。また、移植性を高めるためにプログラムを高度に抽象化しすぎると、プログラマーがプロセッサ固有の命令や機能を使用した最適化を施しにくくなり、性能面に問題を抱えるというジレンマもある。C#のunsafeや、P/InvokeもしくはJNIによるプラットフォーム固有機能あるいはネイティブコードの使用、System.Numerics.VectorsによるSIMD命令の活用 など、安全性・移植性と性能のトレードオフを提供する動きもある。
エンディアンの違いが移植性の問題点となるケースもある。