IBM i のエキスパートであるジョン・パリスとスーザン・ガントナーが10年にわたるRPGの進歩についてじっくり考えます。
02/03/2020 スーザン・ガントナー、ジョン・パリス
過去10年にわたるIBM i アプリケーション開発の主要なもののいくつかを振り返ることで、新たな10年の到来を祝おうと思います。 *(正確には新たな10年は2021年から始まることは承知していますが、ほぼ全員今がその時だと考えているようであり、振り返って見るのに良いタイミングだと思われます。)2020年最初のこの記事で、RPGの世界において最も重要な変化であると個人的に理解している事柄について概観します。
「死せる言語」にしては悪くない
これまで長年にわたって「RPGは死んだ」「IBMはもうRPGの機能強化はしない」等々の言説を耳にしてきました。何らかの確信をもって「RPGは死んだ」というコメントが出されたのを初めて聞いたのは1980年代に遡りますが、それ以来この話は一定の周期で繰り返されてきました。
明らかにRPGは死から懸け離れています。事実、この10年間いくつかのRPGの機能には極めて目覚ましい成長が見られ、IBMがRPGを捨てるという心配が誤っていることを示しています。
過去10年間、ISVやユーザーが作成したコードを言語構造の単純さに影響を与えることなくシームレスに統合できるようにRPGはオープン化されてきました。コンパイラーが提供するフックによって、強力で柔軟な機能をあたかもRPGの一部であるかのように追加できます。フリーフォーマットの宣言により、構文的に柔軟性と自由度が高まっているだけでなく、配列サイズからプロシージャの終了動作やRPGでの長いSQL列名の使用に至るまで、RPGの様々なコーディング上の制約が大幅に緩和されたことによっても柔軟性と自由度が高まってきています。
RPGを「開放する」
一つには、将来出てくるであろう物のための準備をしたという理由で、最も重要な変更の一つは、おそらく2010年のOpen Access(OA)(IBMは「Rational Open Access: RPG版」という名称を主張していますが)の発表でしょう。(私たちは、いまだにCOBOL版を待っていますが、固唾を飲んではいません。)
OAはISVに5250画面のアプリケーションをウェブ化するためのより良いアプローチを提供していますが、我々の見解ではそのことはOAの最も重要な特徴ではありません。確かにそれは大きな影響を及ぼし、(3社だけを挙げるなら)Profound Logic社、Fresche社、そしてRocket社がその機能をすぐに活用しました。しかし違うのです。OAの真の力は「ISVに可能性を与えた」という言葉に表れています。OAは(社内開発者を含む)サードパーティーがRPGに対して、その構造に完全に統合された拡張機能を開発できるようにするための第一ステップだったのです。OAに続いてDATA-INTO命令が、さらに最近ではDATA-GEN命令が出てきました。それらについては後で述べることにして、先に進みましょう。
悲しいかな、多くのISVがブラウザー化のためにOAを利用した一方で、他の領域でISVが示したイニシアチブが無いことに私たちは驚きました。私たちの知る限りでは、RJS社(現在のHelpSystems社)だけがOAベースのRPG拡張機能を発表しています。それは「RPG2SQLインテグレーター」という製品の一部で、従来のRPGの命令コードを使って、RPGプログラムがOracleやSQL Serverのような他のデータベースと対話できるようにします。
数多くの会社がCSVファイルの処理、ウェブサービスの呼び出しその他の目的で私たちが公開したOAユーティリティを採用していることは知っていますが、OAが提供する可能性を理解したISVまたはオープンソース・グループがあまりにも少ないのは、やはり期待外れです。
フリーフォーマットの導入
OAの発表の後、状況は暫くの間ちょっと静かで、IBMはいくつかの物を「整頓」することに注力していました。例えば、XML-INTO命令がXML文書処理のための本格的ソリューションになるのを妨げてきたギャップを埋める数多くの追加オプションが、XML-INTO命令(これは2006年に最初に発表されました)に加えられました。
それから2013年(本当にそんなに昔でしたっけ?)に古いH、F、D仕様書を新しいフリーフォーマットオプションで置き換える予定であるという発表がありました。「RPG Ⅳの歴史」という連載記事を読まれた方々はご存知のように、RPGが要求された元々の計画はフリーフォーマットにすることでした。遡ることV3R1の時代に、RPG Ⅳとして発表されたハイブリッド版の方が良いと判断され、この考えは立ち消えになりました。
私たちは、いつの日かフリーフォーマットのRPGという夢が完全に実現されることを常に願ってきました。2013年、フリーフォーマットのコーディングは、少なくともすべてがフリーフォーマットではあるものの、依然として8-80桁に制限されていました。当時、私たちはフリーフォーマットのお陰で新しいプログラマーにRPGの楽しさを紹介するのがどれほど容易になるかについて記事を書きました。この2~3年間に私たちが訓練した各初心者グループによって意見は裏付けられてきました。もちろんPDM/SEUはフリーフォーマットの宣言をサポートしませんが、どのみち我々にとって争点でなくなったそんな時代遅れのツールを新しいRPGプログラマーに教えようと私たちが試みることは絶対にありません。
もちろん2015年の**Freeの導入によって、RPGはすべての列の制約からようやく解放されました。今や1桁目からプログラムを書き始めることができるだけでなく、行の長さの制限も最早ありません。なんと幸せなことでしょう!(注:今日、唯一のRPGの固定形式の名残が、**Freeディレクティブの開始位置に関する規則であるのは確かに幾分皮肉なことです。**Freeディレクティブはソース・メンバーの第1行目の1桁目から書かなければなりません。)
柔軟性と可読性の向上
フリーフォーマット宣言が利用可能になってすぐに、RPGでSQLの長いフィールド名(列名)あるいは実際にDDSのALIAS名で提供される長い名前を使えるようにしたのは理に適ったことでした。この長いフィールド名のサポートは、2014年にデータ構造(以下、DSと略記)の入力/出力に対する機能拡張と共に追加されました。外部記述DSを生成するときに長い名前を使用できるだけでなく、ALIASキーワードをファイル宣言に追加できることで外部記述ファイルが長いフィールド名を使用できるようになりました。
2016年にはサブプロシージャに対するON-EXIT機能が追加されました。これにより、サブプロシージャから正常に戻っているか異常終了しているかに関係なくON-EXITセクションのコードが必ず実行されるので、サブプロシージャの実行中に起こるかもしれないあらゆるエラーを処理する便利な機構が提供されました。
次いで2017年には、LikeDSを使用せずにデータ構造を直接入れ子状にできるように、新しいフリーフォーマットのデータ宣言が機能拡張されました。これによって、XML-INTOのような命令のためのDSをコーディングするのが大変容易になりました。というのも、この機能のお陰でXMLが表す「データの形」を持つように文字通りDSをコーディングできるからです。私たちはこの機能強化にとりわけ満足しています。なぜなら、これが役に立つというだけでなく、機能拡張の要望(REFs:Request for Enhancements)を書けばIBMは本当にこれに耳を傾けてくれるという更なる証拠でもあるからです。まさにこの拡張機能に関しては、筆者(ジョン・パリス)がRFEを書いたのでその事を知っています。
DATA-INTOによる開放
RFEと言えば:XML-INTO命令の発表以来、RPGプログラマーたちは、急速に人気を集めていたJSONと同等なものを要望してきました。しかし、IBMはJSON-INTOを提供するのではなく、代わりにOAの設計の背後にある考え方を継続し、2018年にDATA-INTO命令をRPGに追加しました。
DATA-INTO命令はXML-INTO命令とほぼ同じように動作します(つまり、文書を入力し、その内容をDSにアンロードします)が、一つ大きな違いがあります。XML-INTO命令のようにIBMがパーサーを供給するのではなく、DATA-INTO命令は私たちユーザーがパーサーを供給できます。これには、データ交換のための次の「今月の特徴」が登場したときに、IBMが新しい命令コードを考え出すのを待つ必要がないという大きな利点があります。私たちは単に新しいパーサーが必要なだけです。そしてそれは回りまわって新しい機能を使用できる最新のリリースを使う必要はないということを意味します。DATA-INTO命令の使用についてもっと詳しく知りたい方はこちらをご覧ください。
DATA-GENによる開放
XML-INTO命令のJSON版の要求に加えて、RPGプログラマーたちは通常「逆XML-INTO命令」と呼ばれるもの(つまり、DSを入力としてその内容からXML形式の文書を生成する命令コード)をIBMに要求してきました。またしても幸運なことにIBMはOAやDATA-INTO命令によって確立された道を辿り、ユーザー独自のフォーマット用プログラムを供給できるようにすることでこの要求に応えました。
この機能は2019年にDATA-GEN命令と共に発表されました。システム内部では、RPGは供給されたフォーマット用プログラムを呼び出し、DSから読み込んだ各要素の値、名前、データ型をフォーマット用プログラムに通知します。フォーマット用プログラムは、渡された情報からデータ形式に必要なタグ等を追加し、それをRPGに返します。次に、RPGはその結果を指定されたファイルまたはフィールドに統合します。これにより、DATA-INTO命令と同様、将来どのようなデータ転送機構が出現してもRPGはそれを処理できます。DATA-GEN命令についてもっと詳しく知りたい方はこちらをご覧ください。
オブジェクト指向RPG?
数多くの要望が寄せられていたにもかかわらず、ずっと昔にIBMはRPGをオブジェクト指向(OO)言語にするつもりは無いと言明しました。全体として、私たちはこの状況に満足しています。にもかかわらず、私たちの多くがRPGに追加されれば便利だろうと感じる、通常はOO言語に関連付けられるいくつかの機能がありました。
2019年に、最初のその種の機能がプロシージャ・オーバーローディングという形でRPGに追加されました。それぞれが異なるパラメーター・リストを取る一連のルーチンに対して同じプロシージャ名を使用できるようにする機能というのが、この概念に馴染みがない人に対する最も簡単な説明です。今日に至るまで、これに代わる唯一の選択肢は、プロシージャの変種ごとに少し違う名前を付けることでした。この機能についてもっと知りたければ、それに関する記事はこちらにあります。
水晶玉は不要:可変長配列
これまでRPGプログラムで配列定義をする場合には必ず、保持すべきエントリーの最大数を事前に決定しなければなりませんでした。そのためにはメモリー使用率と安全性のバランスを取らなければなりませんでした。どんなに一生懸命その数を正しいものにしようと努力しても、配列要素の数が想定以上に増えてしまい、そのうちある時点でプログラムが機能停止するという経験を私たちは何度もしました。
この問題は2019年に可変長配列の導入によって解決されました。これは多分RPGに対する最も長い期間未解決であった要望です。RPG Ⅳが初めて導入されたV3R1の頃にこの機能がいつ利用可能になるか尋ねられたのを思い出します。唯一の欠点は、これがコンパイラーのあらゆる面に非常に広範囲にわたって影響を与える稀な機能強化の一つであったために、V7.4でようやく利用可能になったということです。その結果、最近RPGに加えられた他の機能の多くと比べて、この機能が採用されるテンポはずっと遅いものになるでしょう。この機能についてもっと知りたければ、こちらの記事をお読みください。
新たな次の10年は?
この10年でこのような機能強化がコンパイラーに加えられるとは、10年前には全く想像もできませんでした。ですから次の10年でどのような機能が追加されるのか予想もつきません。追加される機能のいくつかは、十中八九今日商用プログラミングの周縁にあるまたは研究所の外にはまだ姿を現していない状況に対処するためのものでしょう。
IBMが考慮すべきもう1つのことは、更なる機能強化をRPGに対して行うよりもDb2に対して行う方が時には良いかもしれないということです。結局、そうした機能がDb2で利用可能であれば、それはRPG、COBOL等々で使えるからです。
1つ確かなことは、RPGは成長し続けIBM i アプリケーションの中心に居続けるであろうということです。あなたは、その将来方向を決定する手助けができるのです。
どうやって?様々な新機能を要求する数多くのRPG RFEがありますが、次の10年でどれがコンパイラーに組み込まれるかは誰にも明確には分かりません。あなたが最も実現してほしいRFEに投票することで、どの機能が実装されるかに影響を及ぼすことができます。現在の要求一覧はここにあります。
もしあなたがRPGに加えるべきだと考える機能が入っていないなら、忘れずにあなた自身のRFEを書いてください。やり方の詳細は新しいRPG Cafeに載っています。
私たち自身第一に目にしたい事がRPGだけに制限されたりしないよう願うばかりです。あなたの要望は何ですか?新たなオープンソース言語と伝統的なILE言語の間のもっと良く且つもっと簡潔な相互運用性でしょうか。どのような形をとるべきか確信はありませんが、それがIBMの注力している分野であり、そう遠くない将来に機能強化がされ始めることを願っています。