1. 導入:なぜデータ属性の整合性が重要なのか
メインフレームで長年使われてきたPL/Iは、非常に柔軟な言語ですが、その分「データ属性」の定義には厳格なルールが存在します。なぜこれが重要かというと、プログラムがメモリ上のデータを「どう解釈するか」をコンパイラに正しく伝えるためです。属性が矛盾していると、意図しない計算結果や、最悪の場合はシステム異常(ABEND)を招きます。本稿では、初心者の方が最初に躓きやすい「属性の排他性」について解説します。
2. 基礎知識:データ属性とは何か
PL/Iにおける属性とは、変数に対して「これは数値(BINARY/DECIMAL)ですよ」「これは文字(CHARACTER)ですよ」と教えるラベルのようなものです。
例えば、FIXED BINARYはコンピュータが得意とする2進数での固定小数点数、CHARACTERは文字データを意味します。これらはメモリ内での格納形式(ビットパターン)が根本的に異なるため、一つの変数に両方を割り当てることはできません。これを「属性の排他性」と呼びます。
3. 実装と解決策:属性の競合を防ぐ
属性の競合を防ぐための基本は、変数の役割を明確にすることです。
もし「数値計算も行いたいし、印字のために文字としても扱いたい」というケースがある場合は、属性を混ぜるのではなく、REDEFINES句を使用するか、あるいは計算結果を編集(EDIT)して文字変数に転送する手法をとるのが定石です。現代的な言語への移行を考える際も、まずは「一つの変数には一つの役割」という原則を守ることで、バグの少ないコードになります。
4. サンプルプログラム:正しい宣言と避けるべき宣言
以下は、PL/Iでよくあるデータ宣言の例です。コピーしてコンパイルの挙動を確認してみてください。
/ サンプルプログラム:データ属性の定義 /
TEST_PROG: PROC OPTIONS(MAIN);
/ 良い例:目的ごとに変数を分ける /
DCL COUNT_NUM FIXED BIN(15); / 数値計算用 /
DCL COUNT_STR CHAR(5); / 文字列格納用 /
/ 処理ロジック /
COUNT_NUM = 123;
/ 数値を文字に変換して格納(PUT EDITを使用) /
PUT STRING(COUNT_STR) EDIT(COUNT_NUM)(F(5));
/
注意:以下のように書くとコンパイルエラーや予期せぬ挙動になります
DCL ERROR_VAR FIXED BIN CHAR(5);
これは「数値」と「文字」の属性が矛盾しているため禁止です
/
END TEST_PROG;
5. 応用・注意点:移行時の落とし穴
PL/I特有の強力な機能であるPICTURE属性(例:PIC ‘9999’)は、数値としても文字としても振る舞える非常に便利な機能です。しかし、他の言語へ移行する際は、これが「数値なのか」「文字列なのか」を明確に分離する必要があります。
現場でのトラブルを避けるコツとして、変数の命名規則に属性を含める(例:数値ならnum_~、文字ならstr_~と接頭辞をつける)ことで、視覚的に属性の矛盾をチェックしやすくなります。まずは「自分が定義したデータがメモリ上でどう並んでいるか」を意識することから始めてみてください。

コメント