移植性

移植性（いしょくせい）、ポータビリティ（）とは他の環境への移行のしやすさの性質のこと。

概要
ソフトウェアにおいては、他のプラットフォームに合わせてプログラムのソースコードを書き換えるときに、修正が少なくて済む場合を「移植性が高い」と表現する。通例、ソースコードを静的コンパイルあるいはアセンブルして実行プログラム（マシンコード）を事前生成する方式のソフトウェアは、コンパイル時に指定したCPUアーキテクチャやOSなどに応じて、特定の環境でのみ動作する。一般に、移植の際の手間やコストを減らすために、できる限りこの移植性が高いプログラムを書くことが望まれる。

ただし、マーケティング手法によっては移植性の低いプログラミングモデルを用いた方がビジネスとしては成功するケースも存在する。Microsoft Windowsシリーズがもデファクトスタンダードの地位を維持できている理由は、。

一般的に低級言語 (アセンブラなど) で作成されたプログラムは移植性が低く、高級言語で書かれたプログラムは移植性が高いと言われる。プロセッサ固有の命令を直接記述しなければならない低級言語よりも、命令の生成をコンパイラに任せることのできる高級言語のほうが、ハードウェアを抽象化しやすく、ソフトウェアのロジックに集中できるからである。

C++言語に関しては、規格への準拠度がコンパイラごとに大きく異なることなどを理由に、テンプレートや例外といった比較的後発の機能の使用を制限するコーディング規約を定めることでポータビリティを確保しているプロジェクト例もあるC++ Portability Guide | MDN。

Javaや.NET Frameworkなど、仮想マシン上で動作するプログラムは、仮想マシンがプラットフォームの差異を埋めるため、移植性が非常に高い。しかし、仮想マシンごとに実装が違ったり、インストールされているフォントが異なったりと、移植性に関する問題が完全に解決したわけではない。また、移植性を高めるためにプログラムを高度に抽象化しすぎると、プログラマーがプロセッサ固有の命令や機能を使用した最適化を施しにくくなり、性能面に問題を抱えるというジレンマもある。C#のunsafeunsafe の限界や、P/InvokeもしくはJNIによるプラットフォーム固有機能あるいはネイティブコードの使用、System.Numerics.VectorsによるSIMD命令の活用Using System.Numerics.Vector for Graphics Programming | .NET Blog System.Numerics.Vectorsなど、安全性・移植性と性能のトレードオフを提供する動きもある。

エンディアンの違いが移植性の問題点となるケースもある。

 脚注 

関連項目
移植 (ソフトウェア)
ベンダーロックイン

Category:コンピュータアーキテクチャ
Category:インタフェース