RPG# は System i の Web開発のために EnterpriseServer で提供される新しい [イベント駆動型] の RPG開発言語です。
Web開発の手法としては、CGI
、JSP
、PHP
、...などの多くの開発言語がありますが、Web2.0 powerd by Ajax による
ブラウザ・インターフェースのリッチ・クライアント化は目覚しい勢いで普及を遂げています。
これは HTML画面上に多くの、しかも動的に制御できるGUIコントロールを配置してユーザビリティに貢献するというものです。
Web2.0 であれば、その場で動的に GUIコントロールや HTMLインターフェースを動的に変化させることができます。
しかし、Ajax の普及とともに、従来からの 手続き型(ウォーターフォール型) の開発言語では、ひとつの画面に対して、
各GUIコントロールの動作をサポートする CGI が、数多く必要となってしまいます。
これでは、ひとつの画面を保守する CGI が複数個となってしまい、開発や保守もかなり複雑なものとなってしまいます。
また、閉ざされた 5250エミュレータの世界では、イベントと言えば、せいぜい実行キーや機能キーだけでしかありませんでしたが、
多くのGUIコントロールを抱えるHTMLインターフェースではユーザーが、別のサイトに自由に移動してしまうことも珍しくはありません。
つまり、これまでメイン・ルーチンによってプログラムが処理の主導が行っていたのに対して処理の主導権は
ユーザーの操作そのものに移っているのである、と考えねばなりません。
従来の手続き型(ウォーターフォール型) の開発言語は、Web2.0の普及とともにもはや限界であると言えるのです。
ところがWebの開発言語の、ほとんどが未だに、レガシーな手続き型(ウォーターフォール型)です。
そこで Web開発の豊富な実績と長い経験を持つ、EnterpriseServer では
イベント駆動型の開発言語である「RPG#」を生み出しました。
イベント駆動型の言語にすることによって前述のような多くの GUIコントロールの
処理をすべて、ひとつの CGI の中にまとめることができるようになります。
C++ や BASIC が、イベント駆動型として VC++ や VisualBASIC として進化した
ように RPG も、やはりイベント駆動型としての RPG# への進化が必要で
あったのはごく自然な流れでした。
しかし RPG をイベント駆動型の RPG# へ進化させるには、長い経験と技術の積み重ねが必要であったのです。
RPG# は、メイン・ルーチンを持たない、それゆえ軽く動作するという Web開発には、おあつらえ向きの開発言語です。
もとより ILE-RPG は VC++ や VisualBASIC のような統合型開発言語(ILE) としての構造は、備えており、
その機能性においては、VC++ や VisualBASIC をも凌ぐものを持っています。
ILE-RPG から進化した RPG# も 特殊なものではなく 文法は RPG であり、これまでのように、RPGコンパイラーによって
コンパイルすることができます。
イベント駆動とは、ユーザーがマウスをクリックしたとか、ボタンを押したなどのイベント(事象) をとらえて、
そのイベントを処理するプロシージャーを記述するだけというごく「直感的」で「わかりやすい」ものです。
例えば、次の RPG# によるイベント記述をご覧ください。
/FREE ON_CLICK('DSPHEAD': 'GO': %PADDR(DSPHEAD_GO)); ON_CLICK('DSPDTA01': 'UPDATE': %PADDR(DSPDTA01_UPD)); ON_CLICK('DSPDTA01': 'DELETE': %PADDR(DSPDTA01_DLT)); /END-FREE
3つのイベントに対する記述が行われていますが、最初の
ON_CLICK('DSPHEAD': 'GO': %PADDR(DSPHEAD_GO));
とは、DSPHEAD.HTM という名前の HTML画面上における GO
という名前の
識別(ID
) のボタンが押された(ON_CLICK
) ときには、DSPHEAD_GO
という名前の
プロシージャーを呼び出して実行しなさい、というものです。
これらのイベント処理の記述は eStudio の Wizard生成によって
自動生成されますがユーザーが手動によっても自由に追加することも
できます。
Web開発が初めての人であれば HTMLに対する入出力の方法については多少の不安があるかも知れません。
表示装置ファイル(DSPF) に対する入出力は、ご存知のとおり、READ/WRITE命令 によるごく簡単なものでした。
実は RPG# でも表示装置ファイル(DSPF) のときと同じように READ/WRITE命令 だけによって簡単に入出力を行うことができます。
次の DSPHEAD.HTM 上で [GOボタン] が押されたときに処理する プロシージャー: DSPHEAD_GO
をご覧ください。
********************************************************* P DSPHEAD_GO B EXPORT ********************************************************* * GO ボタンが押されたときの記述を行います。 D PI C READ DSPHEAD 99 C *NOKEY CLEAR SHOHINR C SETOFF 90 C TRNKEY CHAIN SHOHIN 90 C WRITE DSPDTA01 P E
最初に READ DSPHEAD
によって DSPHEAD.HTM に定義されている変数値をすべて読み取ってから、
商品マスター(SHOHIN
) を CHAIN
命令によって検索して、その結果を WRITE DSPDTA01
によって
DSPDTA01.HTM として出力しているだけです。
EXFMT
は使うことはできませんが、その他においては表示装置ファイル(DSPF) のものと何ら変わるところはありません。
このプロシージャーを見て、これが HTML への入出力であると気づく人はいないでしょう。
HTML は外部ファイルとしてファイル仕様書では次のように定義されています。
FPGM001H CF E SPECIAL PGMNAME('ASNET.COM/HTMLDVR')
この CGI をコンパイルするときには CRTRPGMOD
コマンドではなく、RPG# で提供される、
CRTWEBMOD
(WEB モジュールの作成) というコマンドを使って一時的なモジュール(*MODULE
) を作成しますが、
このとき CRTWEBMOD はHTMLファイルから自動的にコンパイルに必要な DSPF: PGM001H を生成してから
CRTRPGMOD
を実行します。
HTML は PGM001H という名前の SPECIALファイル(DSPF) として定義されており、
PGM001H というファイルに対して READ/WRITE
の入出力が実行されると OS400 は
ASNET.COM/HTMLDVR
という名前のRPG# が提供する「HTMLドライバー」を呼び出します。
この HTMLドライバーが実際に HTML とのインターフェースの役割を果たす、ゲートウェイです。
それでは変数は、HTMLにどのように記述されているのでしょう?
次の HTML 記述をご覧ください。
入力フィールドの商品単価(7S0
)は次のように定義されています。
<input type="text" name=SHTANK id="SHTANK" value="##########" maxlength="10" size="12" alt="7S0" EDTCDE(J)>
id="SHTANK"
によって、この記述の項目名が SHTANK
(商品単価) であることがわかります。
注目すべきは、
alt="7S0" EDTCDE(J)
という記述です。
これは 7桁のゾーン十進数(小数以下0) であり、編集コード J
が EDTCDE(J)
によって定義されています。
これは DSPF の DDS記述と基本的に同じです。
出力は EDTCDE(J) によって編集されて value="##########"
に出力結果が埋め込まれますし
入力は alt="7S0"
の記述によって数字としての入力時における妥当性検査も RPG# が用意する
JavaScript によって行われますのでユーザーは DSPF のときと同じようにユーザー自身による
妥当性検査に配慮する必要は全くありません。
RPG# のリッチな HTMLインターフェースには次のような様々な GUIコントロール を備えています。
各 GUIコントロールにはメソッドとプロパティが用意されています。
メソッドとは GUIコントロールの振る舞いを行うための公開関数(EXPORTプロシージャー
) です。
プロパティとは GUIコントロールの属性(EXPORT変数
) です。
GUIコントロールのメソッドとプロパティを処理することによって、従来ではできなかったような GUIコントロールの細かな
制御を動的に行うことができるようになります。
これは VC++ 等の GUI対応開発言語と同じ GUIコントロール機能の搭載を意図しています。
各コントロールは使用を宣言して初めて RPG# にモジュールが組み込まれるよう設計されています。
これは不要なオブジェクト・サイズの増大を最小限に抑えて RPG# が軽く動作するために配慮されています。
いわゆる MVC 3階層モデル とは
に分離するというソフトウェアの理想的な設計モデルのことです。
MVC 3階層モデルとしてソフトウェアを構築することの重要性は、
などを挙げることができます。
それでは、なぜ MVC 3階層モデルが重要なのでしょうか?
HTML の内部にスクリプトを埋め込んでいる PHP
やJSP & Servlet
、または ASP
を考えてみてください。
これらの Web開発手法では HTML というビューの中にビジネス・ロジックとなるモデルとしての処理構造を埋め込んでしまっています。
System i ではありえないことですが、RPGソース の中に DSPF記述が 混在 して記述されていることを想像してみてください。
開発だけでなく、保守がどれほど複雑で困難なものになるか容易に想像がつくはずです。
しかし現実の Web用のスクリプト言語の大半はビジネス・ロジックと HTML などの記述が混在して記述されています。
しかも新しい言語を学習する必要があります。
RPG# であれば、RPG の知識と経験だけで理想的な MVC 3階層モデルとして Webアプリケーションを無理なく自然な形で
構築することができます。
RPG# であればメイン・ルーチンがないのですからプログラマーの個性による記述は極力、抑えられて後から誰が見ても
容易に
ソースを判別することができます。