CLの設計・開発
CLプログラムは、CLコマンドをグループ化してプログラムにしたものである。WindowsのバッチファイルやWindows PowerShell、Linuxのシェルスクリプトに似ている。一連の処理手順をCLプログラムでバッチ処理化することにより、CLコマンド単体で実行した場合と比較して、操作を高速化し、操作の確実性を向上させられる。
またコンパイルすればプログラム・オブジェクトとして取り扱えるので、RPGなどと同様の実行環境で使用できる点もメリットである。定型的な操作が求められる毎日のシステム運用では、CLプログラムの使用は必須である。
ここではCL開発について紹介するとともに、モジュール、サービス・プログラムといったILE言語共通の概念についても説明する。従来のプログラムモデルであるOPMと比較して、多くの利点をもつILEの理解を深めてほしい。
プログラムの設計
はじめに、プログラム設計の流れについて簡単に説明する。これは開発で使用する言語に依存せず、共通の概念である。
新規の業務アプリケーション要件がまとまり、処理フローが確定したら、システム全体をサブシステム化する。サブシステム化では、その単位での実行および管理が可能である範囲を目安に分割する。
続いて、各サブシステム単位で保守容易性や拡張性を考慮し、コンポーネントに分割する。コンポーネントのなかで処理概要を決定し、使用する入力用・出力用のデータベースファイルを決定する。
さらに、各コンポーネントのなかでモジュール分割を行う。たとえば共通機能はモジュール化し、ロジックの重複を排除し、再利用により有効活用できるようにする。
CLプログラム開発の流れ
CLプログラム開発では、ソース・プログラムを記述し、図表1のようにコンパイルにより最終的に実行可能なプログラム・オブジェクトを生成するが、図表2に示すとおり、ILEとOPMでは方法が異なる。


OPMではソース・プログラムのコンパイルにより、1つのプログラム・オブジェクト(*PGM。以下、プログラム)が生成される。
一方、ILEではプログラムの作成方法が2種類ある。
1つはILEプログラムの一般的な作成手順で、ソース・プログラムをコンパイルし、中間的なオブジェクトであるモジュール・オブジェクト(*MODULE。以下、モジュール)を生成後、1つ以上のモジュールを組み込んで(これを「バインド」と呼ぶ)、プログラムを生成する方法である。
もう1つは、OPMと同様にソース・プログラムからワンステップで、単一モジュールのみを含むプログラムを作成する方法である。
モジュール
ここでモジュールについて説明を補足し、ILEについての理解を深めることとする。
モジュールは単体では直接実行できないので、バインドが必須である。またモジュールは作成言語に依存しないため、ほかの言語で生成されたモジュールもバインドし、ILEプログラムを作成できる。
このような複数の言語で開発し、ILEコンパイラで生成されたモジュールをバインドしてILEプログラムを作成できる環境を、「ILE」(統合化言語環境)と呼ぶ。
つまりILEでは、複数のモジュールでプログラムを作成することが標準モデルであるが、モジュール化によりロジックの重複を排除することでアプリケーションの品質や保守性の向上を実現している。
サービス・プログラム・オブジェクト
なお実際のILEプログラムには、モジュール以外にサービス・プログラム・オブジェクト(*SRVPGM。以下、サービス・プログラム)を組み合わせることも可能である。
サービス・プログラムとは、1つ以上のモジュール、またはほかのサービス・プログラムから生成されるIBM iオブジェクトであるが、ほかのプログラムまたはサービス・プログラムからの呼び出しで実行できる。
サービス・プログラムの利点の1つとして、保守容易性が挙げられる。モジュールでロジックの変更が発生した場合、モジュールの再コンパイルと、該当モジュールを組み込んだすべてのプログラムの再バインドが必要となる。これに対してサービス・プログラムでは、ロジック変更によりモジュールの再コンパイルは必要となるものの、サービス・プログラムを呼び出しているプログラム自体の再バインドは不要である。
利点の2つ目は、実行時のパフォーマンスである。プログラムにバインドされたサービス・プログラムは、プログラムが呼ばれてメモリ上にロードされる時点で、必要なサービス・プログラムも一緒にロードされるため、高速な動作が実現される。
CLプログラムの特徴
CLソース・プログラムを参照しながら、CLプログラムの特徴を説明する。
ソース・プログラムは新規に作成もできるが、CLコンパイラのオプションで検索が許可されていれば、RTVCLSRC(CLソース仕様検索)コマンドを使用して、既存のCLプログラムまたはCLモジュール・オブジェクトからCLソース・コードを検索できる。
図表3は、システムのIPL時に起動するスタートアップ・プログラムを、RTVCLSRCコマンドを用いて検索したCLソース・プログラムである。

とくにスタートアップ・プログラムは、システム提供されるスタートアップ・プログラムに、たとえばWebSphere Appli
cation Server(WAS)などのミドルウェアの開始コマンドを追加するといったカスタマイズを加えることが多いため、この方法がよく利用される。
ソース・プログラムでは、PGMおよびENDPGMを用いてプログラムの始まりと終わりを示す(図表4)。

使用できるコマンドは、対話型インターフェースでCLコマンドとして使用するものと同じであるが、CLプログラムのなかでのみ利用できるコマンドも存在する。
また変数、式、組み込み関数なども扱える。桁位置はRPGのように桁固定ではなく、自由に記述が可能である。各行ではキーボードのPF4キーを押下することによりプロンプト表示されるが、そちらを利用すると桁位置が自動修正され、表記が見やすくなる。
基本的にCLプロシージャー内のコマンドは、プログラムのなかに現れる順序で1つずつ処理されていく。このような順次処理の流れを、他のプログラム言語と同様にロジックの流れを変えるコマンドを使用して変更できる。処理の流れを変える方法として、「無条件分岐」と「条件付き分岐」に分けられる。
無条件分岐とは、分岐命令を出した時点での条件には関係なく、プロシージャー内の他の場所にあるコマンド(または1組のコマンド)へ分岐できることを意味する。無条件処理コマンドには、GOTO、ITERATE、LEAVE、CALL
SUBRがある。
一方、条件付き分岐とは、指定された特定の条件が生じている場合に限り、プロシージャー内の別の場所にあるセクションまたはコマンドに分岐することを意味する。
プロシージャー内のどのようなステートメントにも、分岐することが可能である。これは指定された条件が真である場合に限り分岐が行われるので、条件付き処理と呼ばれる。
条件付き分岐処理には通常、IFコマンドが使用される。また、ELSEコマンドと併用することにより、条件が真でない場合の代替処理を指定できる。
図表4のように単純なDOコマンドを使用すれば、複数のコマンドを1つのグループにして、指定した条件が生じた場合に、それらのコマンドが常にグループとして処理されるように記述することが可能になる。条件付き分岐処理コマンドには、以下がある。
・IFおよびTHEN、ELSE
・SELECT、WHEN、および OTHERWISE
・DOFOR
・DOWHILE
・DOUNTIL
各コマンドの詳細については、マニュアル:CLプログラミングを参照してほしい。

著者
茂木 映典氏
日本アイ・ビー・エム株式会社
テクノロジー事業本部
IBM Power テクニカルセールス
新・IBM i入門ガイド[開発編]
01 IBM iの開発環境
02 IBM iの開発環境選択基準
03 IBM iの開発言語
04 IBM iの基礎[CL設計・開発]
05 IBM iの基礎[データベース]
06 IBM iの基礎[RPG開発]
07 IBM iの基礎[Java開発]
08 IBM iのシステム連携
09 IBM iの新しいアプリケーション例
10 開発編 FAQ
[i Magazine 2025 Spring号掲載]