CL

148. CLPでポインタを学習する(1)

CLPでなくてもポインタは苦手という人が多い。
ポインタは開発言語では基本的な概念のはずであるが
理解できないという人が多い。

CLPでポインタを使う機会はないだろう思われるかも
知れないがCLPでポインタがわかれば使いたくなるし
ポインタの概念を学習するにはCLPで記述すると
わかりやすくなる。
そこでこのシリーズではIBM i開発者にCLPのポインタの概念の
学習を通じてポインタを学習してもらいたい。
ポインタという概念は開発者にとって非常に重要な大切な
概念である。
ポインタを理解して一段高い開発者になって頂きたい。

■ポインタはなぜ難しいのか?

ポインタという概念がなぜ難しく思えてしまうのかと
言うと解説する解説者側がポインタの概念を真に
理解していないからである。
理解していない人に説明されるので聞き手が
理解できないのは当然のことである。
初めての今回は用語の説明を行いたい。

■JavaはC言語からポインタをなくした言語である

Javaはそれまで難しいと言われてきたポインタの概念を
無くしてしまった開発言語である。
それでJavaが便利になったかと言うと融通の利かない
不便な言語になってしまいおまけにJavaでも
実行時にはポインタのエラーがしっかり出ることもある。
やはりポインタの概念は開発言語にとっても
必要なのである。
CLPもRPGの初めはポインタは使えなかったのだが
今ではポインタを使うことができる。
ポインタはやはり必要なのである。

■ポインタとは変数の開始位置

開発言語で変数を定義するということがどういうことかというと
プログラムが使うメモリの

 

・変数の開始位置

・開始位置からの長さ(バイト数)

  ------------------------
   |   変数の占有域       |
   ------------------------
   ↑
 ここがポインタ

を確保することである。メモリのどのあたりに変数バッファーを確保するかと
いうことはコンパイラにお任せであるのだが
とにかくメモリにどこかにある開始位置からXXバイトと長さの分だけ変数を書く位置と
長さを確保することはなる。
この特に変数確保の開始位置のことを「ポインタ」と呼んでいる。

よくポインタのことを「番地」と表現している書物などが多いが
番地というと住所を想像していまうので聞き手は余計にわからなくなってしまう。
番地という表現は不適切であり「変数の開始位置」と言ったほうが
わかりやすくなる。

■具体化とは

変数はポインタと変数が占有する長さによって定義されることを
上で説明したが逆にポインタが先に定義されていてそのポインタに対して
占有する長さを割り振れば変数を定義することができる。
このようにポインタから変数やオブジェクトを定義することを
具体化と呼ぶ。
この「具体化」という言葉もあまり適切ではない。
英語のMaterializeを直訳したのが具体化であるが
「具体的に」という言葉を連想してしまうように具体化というよりは
実体を表す、つまり「実体化」と言ったほうが適切である。
以降は具体化という用語が定義されているので使用することもあるが
実体を表す実体化というように解釈してもらったほうが
事実に近いイメージとなるはずである。

ボインタから変数を定義することを具体化と呼ぶ

■CLPの変数はポインタ表現

 CLPでの変数は

  DCL VAR(&TYPE) TYPE(*CHAR) LEN(1)

 のように文字「&」を先頭につけて「&TYPE」のようにして表示するのは
IBM iの開発者の知るところである。
 この文字「&」を先頭につけるというのは C言語では変数のポインタを
 意味する。
例えば変数 TYPE のポインタは &TYPE と表記する。
 これは偶然だろうか?
CLPの変数はポインタではないがポインタを示唆しているようにも
見える。

■プログラムへのパラメータもポインタ渡し

 CLPの中でプログラムを呼び出す場合はCALLコマンドを使って

  CALL PGM(S36ENV/CHKS36STK) PARM(&PGM ‘*LIBL ‘ +
&RTNCOD &JOBINFO)

 のように記述するがこのプログラムが内部処理でこれらのパラメータの値
&PGM, &RTNCOD, &JOBINFO などの値を変更した場合、
 CALL で呼び出しが終了して制御がこのCLPに戻ってきた場合に
 パラメータとして使われていたそれらの変数 &PGM, &RTNCOD, &JOBINFO
の値も変わることは読者もご存知であろう。
 
 実は一般の開発言語ではこのようなことはあり得ない
 パラメータ値が変更されることはないのだ。
 バラメータ値が変更されるというのはパラメータとしてポインタが
 渡されたときの場合だけである。
 変数が渡されたというのは値を渡したでけであって
変数そのものを渡しているわけではない。
 このことは別の機会でもくわしく説明する。
 
 ここではパラメータ値が変化するというのはポインタ渡しであるからである。
 つまりIBM iにおけるパラメータ渡しは実はポインタ渡しなのである。
 それがわかると &….型式の変数は余計にポインタではないかと
 思えてしまう。

 IBM iユーザーには意識されなくてもIBMは実はポインタをたくみに
 パラメータとして組み込んでいたのである。
 パラメータ値が変化するほうが実用面で柔軟であると最初の開発者は
考えたのだろう。
 そう思うと実は身近なところにポインタがあったのだと
 思えるようにはならないだろうか?
私たちは無意識のうちにポインタを使っていたのである。

次回は実際のCLPソースの中でポインタを解説する。
そしてなぜポインタが重要であるのかについても
 除々に説明していこう。