portability(移植性)とcompatibility(互換性)のちがいについて

組み込みOSにはPOSIXの他にもiTRONという仕様があるようだが、iTRONはわりと自由にゆるく設定されているし、一部ハードウェアもいじらなければならないこともあるようで、アプリケーション開発者の負担が大きいらしい。POSIX仕様はハードウェアが完全に抽象化されているので電気回路について頭を悩ます必要はなく、またアプリケーション開発者からするとインターフェイスがびっちり決まっているからやりやすいみたいだ。POSIXは偉大だ。ソフトウェア設計の課題は、「いかにハードのリソースを有効に活用するか」にあるという理解だったが、もうひとつの大きな課題は「互換性」つまり、、つまりなんだ、互換性って実際のところなんだっけ。

というわけでなんとなくあやふやになっている移植性(portability)(あるいは可搬性ともいう)と互換性(compatibility)について調べることにする。どちらもソフトウェア開発において重要な指標になっているのはたぶん間違いない気がする。

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

コンパイラというソフトウェアの移植性が取り上げられている。どのようなハードやOSのマシンであっても同じコードを同じ実行ファイルにコンパイルできるなら、そのコンパイラは移植性が高いソフトウェアだと言える。というか移植性って、コンパイラインタープリタなどの言語処理系を評価するための指標なのではないだろうか。と思ったが、OSについてもそういう評価がされている(windowsは移植性の低いOSだが市場で大きな成功を収めた)ので、どうやらソフトウェア全般を評価するためのもののようだ。いずれにせよ、想像するに、エンジニアたちが問題にしているのは、「自分が書いたコードは他の環境でも作動するのだろうか?修正が必要なのだとしたらどれくらい必要なのだろうか」ということであって、その懸念を移植性という言葉で表したのだと言えるだろう。

次に互換性だが、

ある部品やコンポーネント(構成要素)などを置き換えても同様に動作させることができる性質のこと。

とある。上位互換、下位互換という言葉もあるとおり、これはハードウェアが進化することにより、それまでのソフトウェアが使い物にならなくなってしまうのではないかというエンジニアの懸念がもとになっていると思われる。

これらの例からわかるとおり、エンジニアにとっては、自分の書いたコードが使えなくなることをかなり恐れているっぽい。それで今回のPOSIXの例は互換性のことを話題にしていたのだということがわかる。ソフトウェアの側がPOSIXというインターフェイス仕様を公開することで、ハードウェアベンダもそのインターフェイスに準じる形でハードを設計進化させるようになる。そうすると、その仕様に則って作った過去のソフトウェアは新しいハードの上でもしっかりと作動することが保証されるわけだ。もちろんソフトウェアの実装のほうが先に進化することもあるはずで、(つまりたとえばより良いアルゴリズムを開発したとかそういうの?)そういう場合もインターフェイスを統一することで古いハードウェアでも作動できるようにする。

互換性とはいわばインターフェイスをきっちり統一することなのだという理解にいたった。ちなみに組み込みLINUXの仕様はPOSIXを拡張したLSBという仕様を採用している模様。より厳しい仕様になっているのだろう。