IBM i には API(=Application Programming Interface)と呼ばれるプログラム(*PGM)が
公開されていてユーザーでも使用することができる。
APIはシステム・ライブラリー(QSYS)に保管されているプログラムである。
APIは旧リリースでも存在しているプログラムであり公開されていなくても
使用できる場合もある。
このため新しいリリースのマニュアルで公開されたAPIは旧リリースでも
使用可能な場合がある。

それではユーザーでも勝手にQSYSのプログラムをCALLで呼び出して使用すれば
立派なAPIとして使えるではないかという疑問がある。
例えば WRKOUTQコマンドを実行しているプログラムは
DSPCMD で調べると
コマンド情報の表示
コマンド . . . . . . . : WRKOUTQ ライブラリー . . . . . : QSYS
コマンドを処理するプログラム . . . . . : QSPDSPQ
ライブラリー . . . . . . . . . . . . : QSYS
プログラムを呼び出すために使用される
状態 . . . . . . . . . . . . . . . : *SYSTEM
ソース・ファイル . . . . . . . . . . . : S000014846
ライブラリー . . . . . . . . . . . . : QTEMP
ソース・ファイル・メンバー . . . . . . : WRKOUTQ
妥当性検査プログラム . . . . . . . . . : *NONE
有効なモード . . . . . . . . . . . . . : *PROD
*DEBUG
*SERVICE
実行可能な環境 . . . . . . . . . . . . : *IMOD *BMOD *IREXX
*BREXX *BPGM *IPGM
*EXEC *INTERACT *BATCH
続く ...
続行するには,実行キーを押してください。
F3= 終了 F12= 取り消し
(C) COPYRIGHT IBM CORP. 1980, 2007.
WRKOUTQが呼び出しているプログラムは QSYS/QSPDSPQ であることがわかる。
それでは自分で独自のWRKOUTQと良く似たコマンドを作成して実行を
プログラム : QSYS/QSPDSPQ にやらせることができるかというとそれはできない。
保護違反となってユーザーがQSYSのプログラムを実行することは許されない。
この仕組みは DSPOBJD QSYS/QSPDSPQ *PGM を見てみると
オブジェクト記述の表示-明細
ライブラリー 1 の 1
オブジェクト . . . . : QSPDSPQ 属性 . . . . . . . . :
ライブラリー . . . : QSYS 所有者 . . . . . . . : QSPL
ライブラリー ASP 装置 . : *SYSBAS ライブラリー ASP グループ : *SYSBAS
タイプ . . . . . . . : *PGM 1 次グループ . . . . : *NONE
ユーザー定義の情報 :
属性 . . . . . . . . . . . . . . . . :
テキスト . . . . . . . . . . . . . . :
作成情報 :
作成日/時刻 . . . . . . . . . . . . : 08/12/19 11:24:17
作成ユーザー . . . . . . . . . . . . : *IBM
作成システム . . . . . . . . . . . . : 00000000
オブジェクト定義域 . . . . . . . . . : *SYSTEM
続く ...
続行するには,実行キーを押してください。
F3= 終了 F12= 取り消し
のようになっていて
オブジェクト定義域なるものが *SYSTEM となっている。
一方、API として公開されている例えばAPI: QUSLOBJD を DSPOBJD *PGM で見てみると
オブジェクト記述の表示-明細
ライブラリー 1 の 1
オブジェクト . . . . : QUSROBJD 属性 . . . . . . . . :
ライブラリー . . . : QSYS 所有者 . . . . . . . : QSYS
ライブラリー ASP 装置 . : *SYSBAS ライブラリー ASP グループ : *SYSBAS
タイプ . . . . . . . : *PGM 1 次グループ . . . . : *NONE
ユーザー定義の情報 :
属性 . . . . . . . . . . . . . . . . :
テキスト . . . . . . . . . . . . . . :
作成情報 :
作成日/時刻 . . . . . . . . . . . . : 07/09/30 14:35:39
作成ユーザー . . . . . . . . . . . . : *IBM
作成システム . . . . . . . . . . . . : 00000000
オブジェクト定義域 . . . . . . . . . : *USER
続く ...
続行するには,実行キーを押してください。
F3= 終了 F12= 取り消し
(C) COPYRIGHT IBM CORP. 1980, 2007.
のようになっていて
オブジェクト定義域 は *USER と表示されている。
一般に私達ユーザーがコンパイルして作成するプログラムやファイルのオブジェクト定義域はすべて *USER である。
しかしユーザーが作成するコマンドとパネル・グループのオブジェクト定義域は *SYSTEM となる。
コンパイラーでこれらのオブジェクト定義域を指定することはできない。
・ユーザーがオブジェクト定義域が *SYSTEM となっているプログラムを呼出して実行することはできない。
...これがAPIと通常のシステム・プログラムとの違いである。
APIは *USER であるのでユーザーでも呼び出して使用することができるが
*SYSTEM であるシステム・プログラムを呼び出すことはできない。
・機密保護レベル(QSECURITY)が40以上では*SYSTEMであるオブジェクトを直接読むことはできない。
(しかしダンプ・リストは可能である)
…
[結論]
システム・プログラムはオブジェクト定義域が *SYSTEMであるのでユーザーが勝手に呼び出して使用することはできないが
API は *USER であるのでユーザーが呼び出すことができる。
