COBOLでアドレスを取り扱う
COBOL言語でのアドレスの取扱い
「COBOL address」というキーワードで何回も検索されていたので目にとまったものです。プログラム中で定義したデータエリアの場所、パラメーターで渡す値をメモリー上の格納エリアの場所で示したい、ということでしょうか。言い換えればCOBOLでポインターを扱うにはどうすればいいのか?ということになるのでしょうか。
マニュアルで見た限りでは、z/OSとMSPのCOBOL言語ではアドレスとかポインターの取扱いはできないようです。しかしVOS3のCOBOL85ではアドレス操作機能というのがあってアドレスの取扱いができるようになっていました。
と、当初は書いたのですがご指摘をいただき改めてマニュアル(IBMのEnterprise COBOL for z/OS)を見るとポインターの扱いについての解説はありました。いかに適当にマニュアルを読んでるかがばれますね。
VOS3のCOBOL85によるアドレス操作例
FD INFILE … 01 INRECORD. 02 DATA PIC X(80) : WORKING-STORAGE SECTION. 01 RECDATA1 ADDRESSED BY RECADDR1. 02 FIELD1 PIC X(10). 02 FIELD2 PIC X(20). : 77 TMPADDR1 USAGE IS ADDRESS. : PROCEDURE DIVISION. : COMPUTE RECADDR1 = FUNCTION ADDR(DATA). ① MOVE TMPADDR1 = RECADDR1. ② MOVE RECDATA1 TO xxxxxxxx ③ COMPUTE RECADDR1 = RECADDR1 + 40. ④ MOVE RECDATA1 TO yyyyyyyy ⑤ :
ただしこのアドレス操作機能を使うには、COBOL85コンパイラの組み込み時(導入時?)に追加のオプションが必要とのことで、一般的ではなく特に必要とするユーザーのみに有効とする機能のように見受けられます。
COBOLという言語を考えた時、そもそもアドレス(ポインター)を扱うこと自体が不自然に思えますが、アセンブラーに慣れた者にとっては逆にアドレスが扱えないことにもどかしさを覚えます。もっともそういう場合はアセンブラーなりCなりを使いなさいということでしょうか。アドレスとかポインターとかの概念がないから、COBOLのような言語ではプログラマーによる個人差が出にくい、ということを聞いたことがあります。それだけが理由でもないでしょうが、言語の仕様上似たようなコードになってしまう、ということかも知れません。
そうだとすれば、これは企業のシステム部門にとってはある意味よいことでもあります。メインフレームのように企業の基幹で使われるシステムでは、品質の良いプログラムが当然のように求められますが、品質とは必ずしもバグがない、ということだけではありません。むろん性能や使いやすさなども品質のうちでありますが、企業にとっては誰が書いても同水準の品質を保てるということも大切です。特に今日のように自社のソフトウェア要員を教育して訓練する、などということがめっきり減ってしまった状況では、1人のスーパースターが素晴らしいプログラムを書いても、その人がいなくなり、他に誰もそのプログラムの面倒が見られなければ、結局捨てざるをえません。今日のメインフレームにおけるアプリケーションで圧倒的なシェアでCOBOLが使われているのも、アプリとしては最もつぶしが効く言語となっているからでしょう。アドレスを扱うことはできない、という点で考えた時、それでもCOBOLがこれだけのシェアを持って使われているのは、アドレスの取扱いは必要ない、ということの表れとも言えます。
COBOL2002
COBOL2002という規格では、新たにポインター項目とアドレス付けの機能が追加されたようです。これによってCOBOLプログラムでもポインターを取り扱うことができるようになるようです。COBOLなのにCのようなパラメーターの受け渡しができるようになるみたいですが、目的はC言語プログラムなどとの連携を容易にするためでしょう。メインフレームでもIBMなどがいずれサポートする可能性はありそうです。
詳細は「COBOL Consortium」の「第4次COBOL規格 COBOL2002のご紹介:ポインタ項目とアドレス付け機能」を参照してみて下さい。
2 Responses to “COBOLでアドレスを取り扱う”
Comment from @otnx
Time 2010年11月8日 at 17:57
USAGE POINTER とか ADDRESS OF とか。
手元に実行環境がないので未テストですが、
WORKING-STORAGE SECTION.
01 P POINTER.
01 BASEDATA PIC X(10).
LINKAGE SECTION.
01 REFDATA PIC X(10).
PROCEDURE DIVISION.
MOVE ‘ABC’ TO BASEDATA.
SET P TO ADDRESS OF BASEDATA. ← Pにアドレス代入
SET ADDRESS OF REFDATA TO P. ← Pの指す型?を指定
DISPLAY REFDATA. ← ポインタを経由してのアクセス
Comment from nishida
Time 2010年10月20日 at 00:05
VOS3のようにオプションでなく、標準で使えます。
マニュアルはCOBOL85使用手引書でした。
はっきり覚えてはいませんが、「システムプログラマ向け・・・」といった章に書かれていたと思います。
(あまり普通のプログラマが見ないようなところに記載
されています)
データ領域は、BASED-STORAGE SECTIONに定義します。
アドレスのポインターはWORKING-STORAGE SECTIONに定義します。
以下のようにコーディングすることができます。
DATA DIVISION.
*
BASED-STORAGE SECTION.
01 B-DATA BASED ON WRK-ADR.
03 B-DATA1 PIC X(10).
*
WORKING-STORAGE SECTION.
01 WRK-ADR-G.
03 WRK-ADR USAGE IS POINTER.
*
PROCEDURE DIVISION.
MOVE アドレス領域 TO WRK-ADR
また、これとは別に、アドレスや項目長を転送するMOVE文が記述できます。
データ項目長の設定例
MOVE FUNCTION LENG (項目名) TO 項目長
アドレスの設定例
MOVE FUNCTION ADDR (項目名) TO アドレスポインタ
(はっきり覚えていません ADDR だったか、ADRだったような気がします ゴメンナサイ)