C/400

63. System i へのポーティングのテクニック

GNU や CPAN などで有用なオープン・ソースが数多く紹介されている。
古くは PERL に始まって最近では PHP, gSOAP などが有名である。
オープン・ソースの System i への PORTING は System i の AIX 環境や
PASE 環境で利用することではない。
Tomcat を 使用する場合でも AIX に入れる必要はないし、OS400 の環境でも
Tomcat は稼動することができる。
PASE 環境での稼動はあまりにもパフォーマンスが悪いので
PASE 環境は実験用と見なすべきであろう。
Rubby を PASE 環境で動作させたとしても実用的なパフォーマンスは
全く期待することはできないのである。
やはりオープン・ソースというのであれば System i の OS400上で
ソースをコンパイルすることが望ましい。
ここでは公開されているオープン・ソースをどのように System i上で
コンパイルすればよいかテクニックをいくつか紹介しよう。

1.ソース・ファイルの作成

ソース・ファイルは 240バイトで CCSID=65535 で作成する。

【 例 】
CRTSRCPF FILE(MYSRCLIB/QCPPSRC) RCDLEN(240) IGCDTA(*YES) CCSID(65535) AUT(*ALL)

良くソース・ファイルは Web開発では CCSID=5035 で作成するように紹介している例が
あるが厳に誤りであるので注意されたい。CCSID=65535 であれば、どのような CCSID にも
対応することができる。最も望ましい CCSID は 65535 である。
またIGCDTA(*YES) にしておけば PORTING したソースに漢字のコメントを後から自分で
入れることもできる。
レコード長を 240バイトとして指定しているのは、これが後から SEU や PDM で編集することが
できる最大長であるからである。
C や C++ソースでは横幅の制限はないが System i 上で編集可能な最大長は 240 バイトである。
しかしオープン・ソースではこのことはほとんど考慮されていない場合が多いので
アップロード中に警告エラー・メッセージが出たソースはあとから手動で補正しなければならない。

2. 5250 エミュレータによるアップロード

PCOMM などの 5250エミュレータによってソースを System i にアップロードするときは

ホスト・コード・ページ に 37 (米国) を指定する。

オープン・ソースは大抵は英語環境が前提となっているので CCSID=37 を指定しておけば
文字コードが化けることはない。

3. ヘッダー・ファイルへのアップロード

オープン・ソースの拡張子 .h はヘッダー・ファイルであることを意味している。
このため QCSRC や QCPPSRC だけでなく H という名前のヘッダーを示すソース・ファイルも
用意して、そこにアップロードする必要がある。

4. ソースの補正

1.アップロード でレコード長をオーバーした場合は警告メッセージが出るので
SEU を使って手動で補正しなければならない。
SEU を使用する前は

  CHGJOB CCSID(5035)

によって CCSID=5035 環境にセットしておくこと。
また2つの文字、 [ ] が ロ, ワ に文字化けしているので、これも SEU によって
一挙に変換する必要がある。
さらに \ マークは、バックスラッシュ (X'e0') に変換すること。
C言語を使用するには改行のためのバック・スラッシュ(\) は必須であるが
日本語Windows PC + 5250エミュレータでは。キー・ポードの右下に位置している
「ろ」のキーがバックスラッシュであるべきだが、バックスラッシュと設定されていない。
このためキーポード・マップで「ろ」のキーに ansi 5c を指定して変更しておく必要がある。
もうひとつ厄介であるのが文字「@」である。
Windows 等のオープン開発環境では「@」を変数名にも使用することができるが
System i では「@」は禁則文字であり、使用することはできないので他の「#」などに
置き換える必要がある。

5.コンパイル環境

例えば、

  #include "includes.h"

というヘッダー includes の指定があれば System i ではコンパイルのときには
ライブラリー・リストに従って H という名前のソース・ファイルの INCLUDES という名前の
メンバーが検索されることを意味している。
このため「3. ヘッダー・ファイルへのアップロード」で用意した H という名前のある
ソース・ファイルが保管されているライブラリーをライブラリー・リストに設定しておく必要がある。

6. オープン・ソースのコンパイル

オープン・ソースは、そのままで単純に CRTCMOD, CRTCPPMOD 等でコンパイルしても
コンパイル・エラーになることが多い。
そのオープン・ソースが System i でのコンパイルも考慮されているのであれば

  #ifdef AS400
  # pragma convert(819)   /* EBCDIC to ASCII */
  #endif

のようにして外部定義を期待している場合がある。
このようなときには CRTCMOD や CRTCPPMOD 等のコンパイル・コマンドで
名前の定義 に 'AS400=10' にして明示的に AS400 という文字列を定義すると
上記のような考慮を生かすことができる。
MAKEFILE も用意されている場合も多いが、この話をすると長くなるので
ここでは割愛する。

7. EBCDIC/ASCII を考慮すること

首尾よくコンパイルに成功したとしてもオープン・ソースでは EBCDIC コードのことが
正しく考慮されていない場合が多いので実行してみて問題があれば
ソースを調べたりディバッグする必要がある。
特に日本語環境への配慮は全くないと考えて差し支えないだろう。

8. もうひとつの PORTING 手法

もうひとつの方法はオープン・ソースを思い切って IFS へアップロードしてしまうことである。
IFS であれば横方向の制限は全くないので、この点において苦労することはない。
実は IFS にあるストリーム・ファイルは C, C++, Java だけでなく RPG であっても
コンパイルすることができる。