導入
メインフレーム開発において、メモリ使用量の削減は今も昔も重要なテーマです。特に膨大な件数のフラグ管理が必要な場合、安易にCHAR(1)を多用するとメモリを浪費してしまいます。そこで役立つのがPL/IのBIT属性です。これを適切に使うことで、メモリを節約しつつ、ビット演算による高速な状態管理が可能になります。
基礎知識
PL/IのBIT属性は、その名の通り「0」または「1」を保持するデータ型です。
UNALIGNED属性を併用することで、メモリ上にビット単位で隙間なくデータを詰め込むことができます。例えば、8個のフラグを管理するのに、通常なら8バイト必要なところを、わずか1バイトで表現できるのです。これはJavaのBitSetのような役割を、より低レイヤーで実現していると理解してください。
実装/解決策
BIT属性を扱う際のポイントは、SUBSTR関数による切り出しと、ビット列同士の連結です。PL/Iではビット列を単なる数値ではなく「文字列」のように扱えるため、特定のビットだけを反転させたり、一括で比較したりすることが容易です。
サンプルプログラム
以下のコードは、8個のフラグ(ビット)を1バイトの変数で管理し、特定のビットを操作する例です。
/ 8ビットのフラグを定義(UNALIGNEDでメモリを節約) /
DCL FLAGS BIT(8) UNALIGNED INIT(‘00000000’B);
/ 3ビット目(左から数えて3番目)を立てる /
FLAGS = ‘00100000’B | FLAGS;
/ 5ビット目が立っているか確認 /
IF SUBSTR(FLAGS, 5, 1) = ‘1’B THEN
PUT SKIP LIST(‘5ビット目はONです’);
/ ビットを反転させる(NOT演算) /
FLAGS = ^FLAGS;
/ 結果を表示(ビット列として出力可能) /
PUT SKIP LIST(‘現在のフラグ状態: ‘ || FLAGS);
応用・注意点
現場で注意すべき点は、ALIGNED属性との混同です。デフォルトやALIGNED指定時は、各ビット列がバイト境界で整列されるため、メモリ節約の効果が得られません。必ずUNALIGNEDを明記してください。
また、他のプログラミング言語から移行した際、ビット列を論理値としてのみ使いがちですが、PL/Iの真骨頂は「文字列として結合できること」です。複雑なフラグパターンの解析や、ビット単位でのデータ転送を行う際には、ぜひこの柔軟性を活かしてください。

コメント