コラム
【第7回】 コリジョン – PHP


第5回、6回の2回に分けて IBM i の開発環境について紹介しましたがいかがだったでしょうか。第5回で扱った RDi は、SEU /PDM の機能を完全に再現し、かつさまざまな機能追加を行っている現在の IBM i システム開発のスタンダードなツールでした。そして前回ご紹介したオープンソースの開発環境である Orion とバージョン管理システムの git は、ブラウザさえあれば利用可能な FFRPG のエディタと、ソースのバージョン管理を IBM i のみで実現できる組み合わせでした。

RDi は 主にJava 言語の開発に利用されている eclipse ベースのツールであり、Orion も Web 系の開発に利用されているツールだということはすでにご紹介した通りです。git に関しては Subversion と並んで、プログラムコードのバージョン管理システムとしてスタンダードだと言っても良いでしょう。このように近年は IBM i 以外で使われていたさまざまなツールが IBM i で利用可能になってきているわけです。

この流れは開発のためのツールだけでなく、言語環境も同様です。RPG / COBOL だけではなく、近年はさまざまなオープンソースの言語が IBM i で利用可能になってきました。そこで第7回と第8回では PHP と Java / Node.js を取り上げ、IBM i の今後の可能性をさらに掘り下げて考えていきたいと思います。キーワードは「コリジョン」です。

IBM i のオープンソースへの対応

IBM i が、積極的に業界標準を取り入れてきたコンピュータであるということはすでにご存知の通りです。UNIX / Linux と同等のファイル・システム(IFS:Integrated File System)を実装し、AIX の実行環境である PASE(Portable Application Solutions Environment)を提供することにより、わずかな変更で UNIX / Linux のプログラムを実行することができる環境が提供されています。また、外部からのアクセスに欠かせない Web サーバーの Apache や SQL なども業界標準機能ですね。ユニークな、そして堅牢な IBM i のオペレーティング・システムはそのままに、常に業界標準の機能を実装し続けている IBM i こそ、真のオープンなコンピュータであると思います。

もちろん、他のシステムで作成したアプリケーションの実行環境を提供するだけでなく、このオープンな機能を最大限に活用するため、IBM i でプログラム開発ができるように多くのオープンソース言語も利用可能になっています。コンパイラ型の Java は 5770-JV1(V7.2の場合)というライセンスとして提供され、インタープリタ型の言語の PHP は Zend 社からこれもライセンスとして提供されています。そして、IBM は今後もサポートされていくオープンソースのツールや言語をより簡単に提供するために、5733-OPS というライセンス・プログラムを提供しています。このライセンスにより、現在は次回紹介予定の Node.js や、それ以外のオープンソース言語である Python、zip などのツールがすでに提供されています。前回取り上げた Orion や git もこのライセンスでの提供となっています。最新の情報は以下のサイトをぜひチェックしてみてください。

参考:https://www.ibm.com/developerworks/community/wikis/home?lang=en#!/wiki/IBM%20i%20Technology%20Updates/page/Open%20Source%20Technologies

他言語との導入・連携が容易なPHP

それではここから、PHP という言語について紹介していきます。 IBM i 用の PHPは、2006年に IBM と Zend 社により「Zend Core for i5/OS」として発表されました。他のプラットフォームではすでに PHP で開発されたアプリケーションが数多く存在していましたので、IBM i で PHP をサポートしたことにより、PHP プログラムの開発だけでなく、これらアプリケーションを IBM i 上で実行できることになったのです。

IBM i の PHP は、以下の機能が提供されています。

  • DB2との連携APIの提供
  • RPG などの IBM i 資源へのシームレスな連携の実現

Zend Core for i5/OS は、V5.4 および V6.1 を前提としており、V7 以降は 2010 年に発表された Zend Server for IBM i のみが利用可能となっています。

PHP は Web ページを作成するために開発された言語と言われています。今でこそ「PHP は “PHP: Hypertext Preprocessor” の再帰的頭字語」と説明されていますが、最初は「Personal Home Page」の頭文字をとって命名されたということからも、このことがよくわかりますね。おそらく現時点でもインターネットで公開されている Web サイトにおける PHP の利用率はかなり高いはずです。

Zend Server for IBM i という名前で分かる通り、IBM i 用の PHP は IBM と Zend によってサポートされています。現在、IBM i でWeb アプリを開発する場合の言語選択として、最初に候補に上がるものとなっています。

言語の特徴としては、インタープリタ型のスクリプト言語であることが挙げられます。RPG のようにソースコードからオブジェクトを生成するコンパイルという手順を必要とせず、実行環境に PHP のソース・ファイルが存在していればすぐに実行できるため、RPG プログラマーにとっても学習しやすい言語といえるでしょう。

PHP はコンパイルしないと言いましたが、それはプログラマーが行わなくても良いという意味であり、実際には、

  1. 構文解析(パース)
  2. 仮想マシン(VM)の命令コードにコンパイル
  3. そのコードを逐次実行

という手順を実行時にとっています。PHP のランタイム(仮想マシン)が理解する命令コードに、内部的に「コンパイル」をしているわけです。

それに対して、次回少し触れる予定の Java はオブジェクト指向言語です。そして、詳細はここでは記述しませんが、RPG にはないオブジェクトという概念を理解しないとプログラミングすることができないものです。実は PHP もオブジェクト指向型言語なのですが、従来同様の「手続き型の記述」も許されています。両方の記述が可能なことが良いか悪いかの議論は他に譲るとして、この点でも RPG プログラマーが挑戦しやすい言語といえると思います。

PHP はオープンソースの言語であるがゆえ、インターネット上にさまざまな情報があふれています。RPG とはそれこそ比較にならないぐらい豊富な情報が存在しています。RPG でわからないことがあった場合にそれを解決するためにかける労力と比べると、PHP の場合は瞬時に解決できるといっても過言でなないでしょう。サンプル・コーディングなども豊富に存在しており、勉強する材料には事欠きません。また、書籍も数多くの関連本が出版されています。IBM i において PHP だから生じるネックは DB2 との連携に関する部分ぐらいであり、文法的な説明や Web サーバーとの連携(他のプラットフォームでもWeb サーバーは Apache が多いはず)に関する情報はほぼ全て書籍でも出ていると言っても良いと思います。

インターネットや書籍などで良く「LAMP」という言葉を目にすることがあると思いますが、これは以下の頭文字を取ったものです。

  • 「L」 Linux
  • 「A」 Apache
  • 「M」 MySQL
  • 「P」 PHP

Linux 上で Web サーバーは Apache、データベースは MySQL、そして言語は PHP という環境のことを指します。この言葉が出てきたら、頭の中で「iADP」という言葉で置き換えましょう。これは以下の言葉の頭文字です。

  • 「i」 i/OS
  • 「A」 Apache
  • 「D」 DB2
  • 「P」 PHP

IBM i 上で Web サーバーは Apache、データベースは DB2、そして言語は PHP ということですね。PHP環境について、インターネットや書籍ではデータベースを MySQLとして解説したものが多いため、DB2 とは異なる点を考慮して読んで頂く必要はあると思います。ただし、IBM i 上の DB2 への PHP からのアクセスも SQL インターフェースが基本ですから、十分参考にしていただけるのではないかと思います。

SoRとして稼働中の資産を活かしたモダナイゼーション

それではここで IBM i の Web 化ということについて改めて考えてみましょう。Web 化を表す言葉として、モダナイゼーションという用語が使われていますね。モダナイゼーションの本来の意味は、「稼働中の資産を活かしながら最新の製品や設計に置き換えていく」ということです。対象は企業で長年使用されてきた基幹システムの場合が多いので、四半世紀以上使用されている IBM i のシステムはまさにモダナイゼーション対象に該当します。しかし間違ってはいけないのは、IBM i で稼働する基幹システムを他の言語で書き換えたり、他のプラットフォームに移行したりすることがモダナイゼーションではないということです。SoR としてはすでに「枯れている」システムやデータベースの「稼働中の資産を活かし」ながら、最新の要求にどのように答えていくかが IBM i におけるモダナイゼーションなのです。

ここでいう最新の要求とは、さまざまな外部システムとの連携やクライアントの多様化にどう対応していくか、ということです。特にクライアントの多様化に関しては、Web 化が必須といっても過言ではないでしょう。基幹システムとの連携を、多様化するクライアントとどのように連携していくのかがモダナイゼーションであり、それを実現する部分が SoE です(第2回および第3回の記事も参照してください)。

IBM i をオフコンという括りで理解している場合、その資産を活かしながらシステムの Web 化をしていくというのはなかなか大変な作業に思われることでしょう。Web 化するには Web サーバーが必要となり、そのためには別のサーバー(Lunix や Windowsなど)を用意せねばならず、クライアントに魅力的な画面を用意しつつ、バックエンドの IBM i の資産と連携するために Java や PHP でシステムを再作成しなければ……、と想像してしまうのではないでしょうか。技術面や費用面を考慮すると思わず腰が引けてしまいそうなほど、ハードルが高そうですね。しかし、先進的なユーザー企業は、この仕組みで早くからモダナイゼーション(この言葉が認知される以前から)に挑戦されていました。

  • Windows サーバーを用意し、ASP 経由で IBM i のデータベースにアクセス
  • Linux サーバーを用意し、PHP から IBM i のデータベースにアクセス

また RPG を使った Web アプリケーション開発事例も多くあります。

  • RPG-CGI を作成し、IBM i 上の Web サーバー(apache)から呼び出す

RPG-CGI の場合は、IBM i だけで完結できる仕組みであり、データベースへのアクセスも RPG だから簡単ですね。しかし、CGI(Common Gateway Interface)の機能を実装するためには API プログラミングが必須となり、そこには TCP/IP および HTTP プロトコルの知識も必要となるため、これも十分に浸透したかというと疑問が残ります。

ではここで、これまでのことを少し整理しましょう。まず、IBM i におけるモダナイゼーションとは、既存のシステムを書き換えることをせずに、それを利用する形でさまざまなクライアントの多様化に対応していくということでした。それを進めるために、別のサーバーを別途用意することなく、IBM i で完結させていくことを目標にしていくことも重要でした。

そこでこのモダナイゼーションを進めるためのその第一歩として、PHP を捉えることが大事だと思います。

クライアントの多様化のスピードは我々が想像する以上に速いものです。この要求に対する回答を用意するのが SoE ですが、そのスピードに答えるためには、より早く新しい要求を実現可能な言語と開発手法が必要になってくると思います。それを IBM i で実現できるのが PHP という言語なのです。

IBM i の PHP は Standard PHP のスーパーセットです。IBM i 独自の PHP Toolkit を含んでいるからです。この Toolkit を使えば、既存の RPG プログラムやサービス・プログラムとの連携が可能になります。また、スプールファイル、データ待ち行列、ユーザー空間オブジェクトなどにもアクセス可能です。また、CL プログラムを呼び出すこともできるのです。これは、ユーザーとのインターフェース部分を PHP で記述し、データベース連携部分は RPG で記述するということが可能になることを意味します。RPG は古いから、すべて PHP で記述すべきという考えではなく、PHP という言語とそれを取り巻く新しい技術者や開発手法を積極的に取り入れていくこと、これが本当に大切だと思います。

重要なのはデータベースDB2との連携

この連載でも何度もお話していますが、IBM i はデータベース・マシンであり、企業にとって最も大事なものは DB2 のデータです。四半世紀以上に渡って利用されているということは、それだけデータが蓄積されていることになり、それがそのままお客様の大切な資産です。RPG という言語はもともとがこの DB2 のデータを利用するために開発されている言語ですから当たり前ですが、Java や PHP およびその他の言語ももちろんこの DB2 のデータを操作できなければ意味がありません。IBM i の PHP には SQL ベースで DB2 にアクセスするためのドライバーが用意されているので、これを使用することにより PHP から透過的に IBM i 上の DB2 にアクセス可能です。

そしてここが一番重要なところですが、アクセスするデータベースはどのインターフェースで作成されたのかに関係なく、すべてのデータベースに対して可能という点です。DDS / SQL 双方で作成されたファイルを区別なく利用できると言うことです。AS/400の時代(まだ SQL が利用可能でなかった時)に作成されたデータベースがそのまま PHP からアクセス可能である点が、「資産を活かしながら」行うモダナイゼーションにとって必須であるということがおわかりいただけるでしょう。

さらに PHP の Toolkit を使用すれば、すでに安定的に動いている RPG のビジネスロジックをまとめた小さなプログラムやサービス・プログラムを PHP から呼び出すことも可能です。SoR のビジネスロジックを SoE で呼び出すということが、開発コストや期間および将来の保守の用意性にどれだけ貢献するかも理解していただけると思います。

IBM i における PHP の現状とこれからの可能性

IBM i で PHP が利用できるようになった当初、オープンソースで提供されているさまざまなツールを IBM i で稼働させようという動きがありました。実際の導入実績や稼働確認情報などが多く発表され、当時はこれが起爆剤になって IBM i がさらに発展していくことが期待されていました。しかしながら、現在にいたるまで思ったような利用がなされているとは言えない状態です。理由は大きく2つあると思います。

  • オープンソースの文化に対する我々技術者の理解が進まなかった
  • DB2 との連携を行うためにはハードルが高かった

最初の問題ですが、IBM i の技術者はユニークなオペレーティング・システムに慣れ親しんでおり、またインターフェースも 5250 を中心に考える癖がついています。使用している IBM i はすでにオープン化を始めて長い時間が過ぎているにもかかわらず、我々技術者がそれに追いついていないのです。オープンソースの世界では、世界中のさまざまな技術者が日々コードを洗練させていく中で、細かなリリースを行っていくという開発方法(アジャイルなどの用語で表現されています)が取られたり、インターネット上で議論を交わしながらシステムの機能が日々洗練されていくという開発が行われていますが、IBM i の技術者にはこういった点が不慣れなためなかなか理解できません(誤解のないように言っておきますが、どちらが優れているのかをここで言っているのではなく、単に文化が違うということを言っています)。

2番目の問題は、本コラムを読んでいただいている皆さんならすぐにおわかりいただけると思います。IBM i でシステムを稼働させる最終目標は データベースであるDB2 との連携です。最も大切な資産であるデータを参照および操作できて始めて目的を達成することができます。この点を考えると、すでに他のプラットフォームで稼働実績のある PHP のシステムが IBM i 上で稼働できたとしても、既存の DB2 との連携が実現されなければ、ただ単に「IBM i で xxxxxx が動きました」というだけです。確かに、わざわざ他のシステム(Linux や Windows)を用意して、そこに PHP 環境を作ってシステムを動かすよりは、IBM i さえあれば気軽に試せるというメリットはあるかもしれません。ですが、そのメリットは「気軽に試せる」だけにとどまり、DB2 との連携がない以上、そのままではそれ以上のメリットを望むことができないのです。

これから IBM i のモダナイゼーションを実現するために、SoE を意識した開発は必須となっていきます。その開発言語の候補として、習得のしやすさや IBM と Zend のサポート等を考慮すると、PHP が最有力になることは間違いありません。言語の文法はネットや書籍などに情報がたくさんありますし、PHP の技術者もたくさんいらっしゃると思います。そういう方々にどんどん IBM i のプロジェクトに参加していただき、IBM i の技術者は DB2 との連携部分をしっかりサポートしながら、いろんな文化の方が一緒に開発していく、そういった「異文化の衝突」プロジェクトを IBM i でどんどん実践していきましょう。IBM i は、その準備がすでにできています。

おわりに

異文化が衝突すると、必ずマイナスの事象が最初に発生します。そしてどちらかに従わせようとするとその衝突は大きくなり、取り返しのつかないことになってしまう事例は、歴史を振り返るまでもなく日々のニュースでも良く目にするものです。IBM i における PHP の登場は我々 IBM i の技術者にとって異文化への最初の衝突(コリジョン)だったと思います。RPG Ⅲ プログラマーにとっては、RPG Ⅳ でさえなかなか受け入れることができなかったほどですから、まったく背景の異なるオープンソースの言語となれば言わずもがなですね。

しかし、異文化の衝突は紆余曲折を経て発展していくものです。どちらかの文化に同化を強制するのではなく、それぞれの文化をお互いが尊重し、住み分け、徐々に協力していきながら新しい文化が形成されていきます。IBM i でも SoR は RPG で、SoE は PHP などのオープンソース言語で実現しながら、それぞれの役割、相手の立場を理解して協力しながら、これからのシステムにあるべき姿を目指して成長を始めていく。今、まさにそのような岐路に立っていると実感しています。

コリジョンを良い意味で捉え、いろんな言語やプラットフォームの考え方、開発者とともに意見を戦わせながら、良いシステムを IBM i でこれからも作っていきたいと思います。

おまけのコラム

最近、FFRPG を書きながら「今までの常識を捨てないとだめだな」と考えています。昨日まで当たり前と思っていたことが今日は当たり前でなくなっている。例えばプログラムの変数の命名規則や、ロジックの書き方、設計の方法などなど。IBM i はどんどん進化しているのに、技術者である私が追いついていけてない現状に焦りを感じる今日この頃です。今回のキーワードを「コリジョン(衝突)」としたのは、実は私のこの焦りからでてきたものでした。IBM i というマシンは、そのユニークな特徴はそのままに、真の意味でオープンな姿勢で業界標準の機能を取り入れているにもかかわらず、自身がついていけていないと感じている根底には、このさまざまな業界標準の機能(つまり異文化)に対するある種の抵抗感から来ているのではないかと思うのです。本当の意味でのモダナイゼーションを IBM i で実現するために、できることを少しずつ始め、コリジョンを超えて共存および融合できるようにしていきたいと思います。そういえば IFS が実装された時に、その機能を理解するために読んだのは Linux のファイル・システムを解説している本でした。そういう視点で、また勉強する材料を見つけていきたいですね。

著者プロフィール

img_evolution_profile