RPG

230. RPGプログラマーのためのポインター講座 (1)

ILE-RPG の開発を行っていると、「ポインター」という言葉を耳にするようになる。
C言語の開発者でもないのにポインターを扱う必要もないのではないかと思われるが
API のパラメータでポインター値をパラメータにしているものも少なくない。
ある人は「Java とは C言語からポインターの概念をはずしたもの」と聞いたことがあるかも知れない。
つまり C言語の開発者にとってポインターという厄介な概念のためにポインターに悩まされることが多かった。
しかし RPG を実行していても最近ではポインター・エラーが発生することが珍しくはない。
一体、この皆の嫌われ者のように扱われているポインターとは一体何者だろうか ?

今までポインターの概念をやさしく解説した文書はあまりなかった。
特に IBM System i の世界ではポインターは苦手意識で避けて通ることが多かった。
しかし最近では CLP であってもポインターを扱うことが出てきている。
やはりポインターを避けて通ることはできないのだ。

そこでこのシリーズでは RPGプログラマーに容易に理解できるポインターの概念を解説して行きたいと思う。
ポインターを正しく理解できればメモリや大量データの扱いも怖いものではなくなるはずである。
最後には「Javaはポインターなくして不便ではないのだろうか ?!」と豪語できるようになってもらえるはずだ。
あるいは諸兄が RPG で開発し始めた、その日から実はポインターを無意識に毎日
使用していたことが理解できるはずである。

それではすべての IBM ユーザー、RPG プログラマーの皆さんにポインターを紹介しよう !!

ポインターとは何か ?

RPG や CLP で変数を扱うときには、変数(= RPG でいうところのフィールド) とは
実行時のメモリ空間のどこかの位置から指定された長さの分だけの変数用のエリアが確保されて
使用されていることはなんとなくご存じであろう。
例えば、ある得意先コード : TKCODE という名前の 4桁のフィールドは

ポインター解説図

のように、メモリ空間のどこかの位置から 4バイト分だけ開始したエリアが確保されている。
この開始位置のことをポインターと呼んでいる。

広義の意味では開始位置に限定されなくてよい。メモリ上の位置をポインターと呼ぶのである。
フィールドを例にとるとフィールドとはフィールドが確保される位置(ポインター) と
確保される長さでフィールドが一意的に決まると考えてよい。
つまり、フィールドとは

フィールド = ポインター + メモリが確保される長さ

ということになる。
ポインター自身も実は 16バイトの長さで表現される実体があるので
ポインターもまた 16バイトの長さのフィールドである、と理解してもよい。

ところでポインターが 16バイトであるのならば ポインターは 16バイトで表示可能な大きな空間の
アドレスを表現できないのかというとそのとおりである。
過去に我々が良く知る郵便番号問題や電話番号でも局番が不足して拡張したのと同じように
ポインターもまた 16バイトでは足らなくなる可能性も秘めている。
IPアドレスもまた不足が騒がれたがまだ拡張はされていない。
あなたが引っ越しのときに捨てた冷蔵庫も立派に IPアドレスを持っていたはずなのだが
世界はまだ IPアドレスにも16バイトのポインターの不足にも直面していない。

ポインターとは、よく番地という表現がされるが番地と言われると、それでは何番地 ? と聞いてみたくなってしまう。
そこで番地という表現がまたポインターをわかりにくくしてしまっている。
ポインターとはメモリの開始位置と考えておけばよい。
そしてその開発位置は OS によって割り振られるのでユーザーが指定する必要はないし値も知る必要はない。
ただし値の取得の方法は知る必要はある。
ポインターとはフィールドのメモリの開始位置ということで理解しておけば十分である。

どうだろうか ?
あなたはわずか数分でポインターとは何か、はとにかく理解したはずだ。
次に実際に扱ってみて実体を操作してみればさらに具体的なイメージとしてつかめるはずだ。

それでは次の章に進んでみよう。