1本のソースモジュールで複数のOSに対応させる?

By 神居 - Posted: 2009/12/16 Last updated: 2009/12/16 - Leave a Comment

本来はOSによって対応するソースを分ける方が、作ることだけ考えれば簡単で楽です。しかしパッケージソフトなどの商用プログラムの場合、作って終わりになることはありません。バグの対応もあるし、バージョンアップなどのエンハンスもあります。むしろ作るコスト(工期、費用)よりもメンテナンスのコストの方が何倍も掛かります。
まったく違うOSならばともかく、基本的には互換だけど、細かなところに違いがある、と言う程度ならば、プログラム本来のロジックがまったく変わってしまうことはまずありません。9割は同じロジックのままでOKだが、残りの1割はOSに合わせて変える必要がある、と言う場合ならOS毎にソースを分けると、同じ9割の部分をダブって作成することになります。コピーしてペーストすればいいので、作る分には手間は掛かりませんが、後のメンテナンスはそういうわけにも行きません。
ほとんどのロジックが共通なら、なるべく同じソースモジュールで対応させたいものです。OSに依存する部分をサブルーチン化して対応し、サブルーチンだけをOS毎に分けて作る方法もあります。しかし場合によってはサブルーチン化することで、プログラム外の領域を参照しなくてはならなくなったり、返って元のロジックが複雑になってしまうこともあります。サブルーチン化などのプログラム分割ではない方法も併せて検討します。


AIFアセンブラー命令の活用

AIFはアセンブラー・ソース上での条件分岐を行います。条件が成立していれば、AIF命令の次から分岐先までの間にある、ソース・ステートメントはアセンブルされずにスキップされます。AIFは条件によってアセンブルさせるソース展開を変更させる場合などに用いることができます。

ここではプログラムを動かすOSによってソースモジュール内の展開命令を変更する目的でAIFを使う例を紹介します。

ファンクションで完全に分割できるならサブルーチン化がいいでしょう。汎用化して特定のプログラムに依存しないデザインにすれば、さまざまなプログラムで共用することもできます。しかしSAVEAREAを持たないリエントラントルーチンや、プログラム内のDCB領域などのように、サブルーチンを呼び出すことが困難な場合や、ファンクションルーチンにならないものは、無理に分割しなくても、必要な部分の命令展開をアセンブル時にOSに合わせて変更するようにすれば、オブジェクトとロードモジュールは別になっても、元のソースモジュールは共通して管理、保守することができるようになります。

Posted in ポーティング、ローカライズ手法 • • Top Of Page