AS/400展望台

RPG IV、Vに



by Bryan Meyers
OS/400 V5R1発表大成功の陰にかくれていますが、IBMがほぼ10年前にRPG IVを世に出して以来はじめての大幅な変更と言えます。フリー・フォーマットの演算仕様は、大がかりな宣伝、論争、そして何年も前に初めてこの言語が提案された時点でフリー・フォーマットの概念につきまとっていた不安を喚起することもなく静かに言語の中に入り込んでいきました。

しかし、フリー・フォーマットだけが今回の新リリースにおけるRPGの機能拡張ではありません。改良されたJava統合、より優れたエラー処理機能、およびファイルやデータ構造などに対するより柔軟な命名プロシージャーなど(新しく開発された点はまだ他にもたくさんあります)を備えた新しい組み込み機能が、iSeriesの重要なアプリケーション開発ツールとしてRPGの地位を確固たるものとしています。

RPGは死せり ? RPGよ、永遠なれ!

V5のRPGで最初に気がつくことのひとつに、IBMがRPGコンパイラーを独立したプログラム・プロダクトとして提供するのを止めた、ということが挙げられます。その代わりに、ILE RPG/400コンパイラーが、iSeries 用のIBM WebSphere Development Studio(WDS/プログラム番号:5722-WDS)の組み込み部分としてパッケージされているのです。WDSは、それまで使用していたすべてのツールを再パッケージし、さらに新たに使用してみたいと思われるツールを追加したiSeries用のアプリケーション開発ツールセットで、IBMの戦略的な新製品です。

WDSにはILE RPG/400コンパイラーが含まれるだけでなく、CobolとC/C++のコンパイラーもそれぞれ含まれています。さらに、以下も含まれます。

ホストベース・ユーティリティー(例:プログラム開発管理機能[PDM]、報告者設計ユーティリティー[RLU]、原始ステートメント入力ユーティリティー[SEU]、画面設計機能[SDA])の集まりであるアプリケーション開発ツールセット
VisualAge for Java
モノクロ用アプリケーションのCODE/400 for Windows開発
クライアントGUIアプリケーションのVisualAge RPG for Windows開発
Java Server Pages(JSP)を作成するためのWebSphere Studio for iSeries
DDSディスプレイをJSPに変換するためのWebFacing Tool

これらすべてのツールを1つのツールセットに再パッケージすれば、(すべてではないにしろ)ほとんどのiSeries使用のオフィスは必要とするあらゆる言語やツールに簡単にアクセスできるということが保証されます。また、この戦略により、IBMは新しいツールを便利でパーベイシブな包含的パッケージで発売できるようにもなります。その目的とは何でしょう? iSeiresを使用するすべてのオフィスを、必要とされる新たなスキルを構築し、既存のツールを使っての経験にてこ入れすることで、e-businessのアプリケーションを短時間で開発できる状態に簡単に持っていくためなのです。

なぜって私は/FREEだから(*)

新しいフリー・フォーマットのRPG計算は、C-スペックの従来の演算項目2バージョンと拡張演算項目2バージョンの両方で縦欄制限のすべてが事実上取り払われています。図1は、フリー・フォーマット・コードの一例を示しています。コード全体を読めばお分かりだと思いますが、フリー・フォームと称していてもRPG IVであることに変わりはないので、何の問題もなく理解できるはずです。すべてのフリー・フォーマット・コーディングは、開始の/FREEディレクティブと終了の/END-FREEディレクティブの間のブロックに位置しています。Freeブロック内であれば、8〜80列の任意の場所にフリー・フォーマット指定をコード化することが可能です。また、6列目には指定識別コードは必要ありません。

Freeブロック外のすべてのコードは、標準の縦欄制限に準拠していなければなりません。コンパイラーは、Freeブロック内で/COPYディレクティブを見つけると、固定フォーマットを無条件にコピーされたコードに復帰し、コピーし終わってからフリー・フォーマット・モードを再開します。/COPYメンバーもフリー・フォーマット・コードを含む場合は、コード自身のFreeブロック内で自身のディレクティブを使ってコードを囲む必要があります。

1行につき1つのステートメントしか入れることはできませんが、1つのステートメントがコードの複数行にわたってもかまいません(ただし、数値リテラルは複数行にわたって継続されることはありません)。ステートメントは、8列目から80列目の間であれば任意の場所から始められ、ステートメントを字下げしてコードの構造を明確にすることができます。フリー・フォーマット・ステートメントは常にセミコロン(;)で終了します。新しい構文では、行上の任意の場所に2本のスラッシュ(//)で始まるインライン・コメントを入れられるようになっています。

通常、ステートメントは命令コードで始まります。始まっていない場合、コンパイラーは、ステートメントにEVALまたはCALLPの命令コードがあるものとして実行します。ステートメントが(=代入演算子を持つ)代入式で構成されていると、コンパイラーはEVALの命令コードであるとみなします(図1のA)。それ以外の場合はCALLPの命令コードであるとみなされます(図1のB)。

また、図1のBで示すように、空括弧のコード化が示すパラメーターを持たないプロシージャーもオプションで参照できるようになったことに注目してください。プロシージャーが関連パラメーターを持つ、持たないにかかわらず、括弧を使ってすべてのプロシージャーをコード化することで、コード中のプロシージャーを簡単に識別できるようになり、RPGの手続き呼び出しをJavaやCのメソッドの呼び出しと同じように見せることが可能になりました。

括弧内であれば、命令コードのすぐ後に任意の命令コードを持つ命令コード拡張を入れることができます。命令コード(および拡張)の後には少なくとも1つのブランクが必要です。

一般に、新しい構文は従来のRPGの命令コードをサポートしますが、演算項目1は、以下のような先行する命令コードではなく後に続く命令コードでなければなりません。

命令コード 演算項目1 演算項目2 結果

ステートメントの各要素は、少なくとも1つのブランクを使って分離する必要があります。図2は、RPG IVの各命令コードのフリー・フォーマット構文を簡単に示したものです。各命令コードの下線部のみが必須です。

フリー・フォーマット構文では、計算中に作業フィールドを定義したり、演算結果標識を使用することはできません。演算結果標識の代わりに、組み込み関数(%EOF, %EQUAL, %FOUND)を使って演算の結果を照会します。また、(E)拡張を連結した%ERROR関数や%STATUS関数を使えばエラー状況をチェックすることもできます。エラーが発生すると、他の関数の一部が正しく設定されない場合があるので、%EOF、%EQUALおよび%FOUNDを使用する前に、必ず%ERRORや%STATUSの状況をチェックしてください。

図3はフリー・フォーマット構文でサポートされない命令コードを表にまとめたもので、図2よりも注意する必要があります。ADD、Z-ADD、MOVE、SETONといった多くのベテランの命令コードは引退し、後輩のフリー・フォーマット用代替コードにその道を譲りました。ほとんどの場合、引退した命令コードは廃止され、めったに使われることはありません。優秀なRPGスタイルは、提案する代替構造を使うように指示しています。固定フォーマットのいずれかの命令コードを必要とするまれなインスタンスについては(戦略的に配置されたTESTBの値ほど衝撃的な命令は他にないでしょう)、コードを/END-FREEディレクティブと/FREEディレクティブの間でブロックできます。

好みのうるさいコーダーはBIFを選びます(**)

初期の段階では、IBMが新リリースを発売するたびに、新規または変更された命令コードを探すために、筆者はRPGの参照マニュアルの「命令コード」の章を熟読したものです。結局のところ、命令コードは、すべての新しい関数をRPGで可能にするための要素でした。でも今は違います! 現在、筆者が最初にチェックする章は、組み込み関数(BIF)に関するものなのです。RPG IV独自の8個のBIFは、’70年代の初頭にV5R1で急成長したものでした。図4は新しいBIFを表にしたものですが、これらは、日付関連関数、命令コード置換関数、Java関連関数の3つのカテゴリーに大まかに分けられます。

日付関連関数は、固有の日付サポートをフリー・フォーマット式(やっと出ました!)で活用できるようにするものです。ADDDUR(期間加算)、SUBDUR(期間減算)、およびEXTRACT(日付の一部の抽出)は事実上廃止されており、フリー・フォーマット構文では使用できません。その代わりに、日付を加算したり減算したりするときは+記号や−記号を使用し、期間を処理できる関数を使用することになっています。2つの日付の差を知りたいときは、SUBDURの代わりに%DIFF関数を使います。EXTRACTに代わる%SUBDT関数が日付からのサブセットを入手します。図5は、DayOfWeekとWeekofYearという2つの実用的なプロシージャーで使用する新しい関数の一部を示したものです。

命令コード置換関数は、対応する固定フォーマットの命令コードにとって代わるもの(必ずしも日付に関連しているわけではありません)なので、式で使用することが可能です。筆者は、特にこのグループに注目せざるを得ません。LOOKUPに代わるものとして10個もの関数を作成する必要が本当にあったのでしょうか? 確かに、比較的使用頻度の低いGT比較、LT比較、GE比較およびLE比較に対するオプションの引き数を加えれば、%LOOKUPと%TLOOKUPで十分だったでしょう。

Java関連関数は、真に新しいBIFである%THISに代表されるもので、%THISは、RPGをシームレスなJava統合に一歩近づけるものです。%THISを使えば、クラスの名前を特に知らなくてもクラスの現行インスタンスに対するネイティブなメソッドを呼び出すことができます。%THIS関数は、Javaのこの予約修飾子に対応しています(Java関連の拡張の詳細については後述します)。

強制的なブロック監視

3つの新しい命令コード − MONITOR(モニター・ブロックの開始)、ENDMON(モニター・ブロックの終了)およびON-ERROR − は、プログラム内のコードのモニター・ブロックに対する特殊なエラー処理を目的とする機能を提供します。以前は、%ERROR関数と%STATUS関数を使ってコード1行に対するエラーを処理したり、ファイル例外/エラー(*PSSR)ルーチンを使ってプログラム全体のエラー処理を行っていました。新規サポートはJavaのtry/catchブロックに酷似しており、処理を試行したいコード・ブロックを指定できるようになっています。そのブロック内であればどこにエラーが発生しても、エラーをキャッチし、エラーに応じて実行するコードを指定できるようになっています。

図6は、その処理を示したものです。モニター・ブロックはMONITOR命令コードで開始しています。次に、プログラムはそのブロック内の後続行を最初のON-ERROR命令コードまで処理します。モニター・ブロック内のすべてのコードがエラーなしに処理すると、制御は、ENDMON命令コードに続く最初の行に進みます。ただし、ブロック内の行が1つでもエラーを起こすと、制御は、適切なON-ERRORグループに進みます。

プログラム/ファイル状況コードは、どのON-ERRORグループが制御を受けているかを定義します。これは、%STATUS関数が提供する状況コードと同様です。00100から09999までの任意の状況コードを指定できます。また、汎用プログラム・エラーには*PROGRAMを、汎用ファイル・エラーには*FILEを、すべての汎用エラーには*ALLを、それぞれ指定することもできます。エラー状況をカバーする最初のON-ERRORグループが1つだけ処理されます。汎用ON-ERRORグループを特定のグループの後に配置し、起こりうる可能性のあるエラーをすべてカバーできるようにしておくとよいでしょう。ON-ERRORグループの処理が終了すると、制御は、ENDMON命令に続くステートメントに進みます。

モニター・ブロックは、IFグループ、DOグループ、SELECTグループを含むプログラム内の任意の場所に指定できます。他のモニター・ブロック内やON-ERRORグループ内にネストすることさえ可能です。モニター・ブロックは、IFグループ、DOグループ、SELECTグループを囲むこともできます。

これを「フレキシブル」にファイルして

2つの新しいファイル・キーワードを使えば、ある特定のファイル指定用にどのファイルやメンバーがオープンしているかを実行時に迅速に示すことができるようになります。EXTFILEキーワードとEXTMBRキーワードは、オープンしたいファイルおよび/またはメンバーを命名できるようにするためのものです。名前はリテラルである必要はなく、プログラムの実行中に変更できるプログラム変数でもかまいません。

ファイル名をパラメーターとして渡したり、*INZSRサブルーチンでファイル名を提供したり、他のモジュールからグローバル変数をインポートしたり、USROPNをコード化してプログラム実行中のファイルのオープンやクローズを明示的に制御したりすることができます。ファイル名は、filename、libname/filename、または*LIBL/filenameのうちのいずれかの形式でなければなりません。RPGがオープンするファイルに変更を指定した時点でその変更が有効になります。

処理されるメンバーをEXTMBRキーワードを使って命名できますが、ここでもリテラルまたは変数のどちらでもかまいません。また、許容値としてEXTMBR(‘*ALL’)やEXTMBR(‘*FIRST’)を指定することもできます。EXTFILEキーワード値、EXTMBRキーワード値の両方とも大文字と小文字を区別しますから、名前をタイプするときはシフト・キーに注意してください。

蛙の子は蛙

新しいD-スペックのキーワードの一部には、名前を修飾する − つまり、ドットで分けられたデータ構造名とサブフィールド名(例:構造.サブフィールド)の両方をコード化する − ことで特定のデータ構造サブフィールドを簡単に識別できる機能が追加されています。この機能を使用すれば、同じデータ構造の複数のコピーを含めたり、同一プログラム内で変数名を再使用することが可能になります。データ構造の定義でQUALIFIEDキーワードをコード化した後は、そのデータ構造のサブフィールドには修飾名で参照しなければなりません。

同様に、LIKEDSキーワードを使用すれば、あるデータ構造は、サブフィールドを明示的にコード化しなくても、別のデータ構造からのサブフィールド構造を継承できるようになります。修飾データ構造については、修飾名でサブフィールドに参照しなければなりません。また、データ構造のサブフィールドをプロシージャー間に渡すときは、LIKEDSをプロトタイプ化されたパラメーターや戻り値用に指定することができます。

INZキーワードの機能拡張により、INZ(*LIKEDS)を指定して、子データ構造をその親データ構造と同様に初期化することができるようになっています。

さらに続きが!

筆者が、シリーズ5作目となるRPG IVの映画の監督をしていると仮定すれば、今ごろ相応な時間内で映画を終わらせるよう悪戦苦闘していることでしょう。結局、一部の機能拡張をカットしてDVD版でのみの公開ということになったと思います。カットした中から重要なシーンをいくつかご紹介しましょう。

Java関連機能拡張には、新しい状況コード、Javaオブジェクトをお使いのRPGプログラム(データ・タイプO、CLASSキーワード)に定義する機能、JavaメソッドとCメソッド(コンストラクター・メソッドを含む)をプロトタイプ化できるEXTPROCキーワードの機能拡張、およびオブジェクトをサポートするD-スペックLIKEキーワードの機能拡張が含まれています。
新しいELSEIF命令コードはELSEとIFの組み合わせですが、ENDIFを追加する必要はありません。
新たな事前定義条件が、*VnRnMn, *ILERPG, *CRTBNDRPG, *CRTRPGMODといった/DEFINEコンパイラー・ディレクティブに対して導入されています。
/INCLUDEコンパイラー・ディレクティブが新たに導入されています(SQLプリプロセッサーが/INCLUDEファイルを展開しない、という点を除いて/COPYと同様の働きをします)。

OFLINDキーワードは、名前付き標識(や他の任意の標識)を使えるようになっています。

PREFIXファイル・キーワードは、PREFIX(‘CUST.’)のように、ドットで終わる大文字のリテラルをサポートできるようになっています。

主役登場だけでは終わらない

e-business、インターネット、Java、WebSphere、その他同種の風評を利用すれば、これまでのOS/400のリリース中最大のV5でRPGに主役を張らせることはIBMにとって容易なことだったでしょう。そうする代わり、これは十分に論証できますが、V5のRPG IVは、(サブプロシージャーを導入した)V3R2以来最も目を見張る機能拡張をフィーチャーすることになったのです。IBMは、RPGを他の言語やアプリケーション開発ツールと再パッケージすることで、iSeriesのリーディング言語としてのRPGの地位を確固たるものとしたのです。

Bryan Meyersは、NEWS/400のテクニカル・エディターであると同時に、The 400 School, Inc.の社長を務めています。



↑このページのトップへ
TOPPAGE

BELLDATA, Inc. Copyright reserved.