1. 導入:なぜSYMBOLIC CHARACTERS句が重要なのか?
COBOLプログラムを開発していると、ヌル文字やタブ文字、改行コードといった特殊な制御文字を扱う場面に遭遇します。これらの特殊文字は、そのままコードに記述すると読みにくくなったり、環境依存の問題を引き起こしたりする可能性があります。SYMBOLIC CHARACTERS句(別名:特殊名句)は、これらの特殊文字に分かりやすい名前(ニーモニック)を付けて、プログラム内で文字リテラルのように扱えるようにする機能です。これにより、コードの可読性が向上し、特殊文字の扱いに起因する潜在的なバグを回避することができます。特に、外部ファイルとのデータ連携や、特定のフォーマットで出力を行う際に、その威力を発揮します。
2. 基礎知識:SYMBOLIC CHARACTERS句とは?
SYMBOLIC CHARACTERS句は、COBOLプログラムの`SPECIAL-NAMES`段落内で定義されます。この句を使うことで、特定の文字コード(通常は10進数または16進数)に、人間が理解しやすい名前を割り当てることができます。例えば、ASCIIコードの0番はヌル文字(NUL)ですが、これを「NULL-CHAR」といった名前で定義しておけば、プログラム内で「`MOVE NULL-CHAR TO WS-FIELD.`」のように記述できるようになります。これにより、コードを見ただけでその特殊文字が何を表しているのかが明確になります。
主な用途としては、以下のようなものが挙げられます。
- 制御文字の定義: ヌル文字、タブ文字、改行コード、キャリッジリターンなどを定義し、プログラム内で容易に参照できるようにします。
- 特殊な記号の定義: 特定のシステムやデータベースで使われる特殊な記号を定義し、コードの移植性を高めます。
- コードの可読性向上: 「`MOVE 32 TO WS-FIELD.`」と記述するよりも、「`MOVE SPACE TO WS-FIELD.`」のように定義した名前を使う方が、意図が明確になります。
3. 実装:SYMBOLIC CHARACTERS句の使い方
SYMBOLIC CHARACTERS句は、`IDENTIFICATION`段落と`ENVIRONMENT`段落の間に位置する`SPECIAL-NAMES`段落で定義します。構文は以下の通りです。
SPECIAL-NAMES.
SYMBOLIC CHARACTERS mnemonic-name IS literal-value [, mnemonic-name IS literal-value] …
- `mnemonic-name`: 定義したい特殊文字に付ける名前です。通常、英数字とハイフンで構成され、先頭は英字である必要があります。
- `literal-value`: 定義する特殊文字の文字コードを、10進数または16進数で指定します。10進数の場合は数値リテラル、16進数の場合は`X’HH’`の形式で記述します。
例えば、ASCIIコードのヌル文字(10進数で0)とタブ文字(10進数で9)を定義するには、以下のように記述します。
SPECIAL-NAMES.
SYMBOLIC CHARACTERS
NULL-CHAR IS 0
TAB-CHAR IS 9.
定義した`mnemonic-name`は、`PROCEDURE DIVISION`内で文字リテラルのように使用できます。
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-STRING PIC X(50).
01 WS-FILLER PIC X.
PROCEDURE DIVISION.
MOVE “Hello” TO WS-STRING.
STRING WS-STRING DELIMITED BY SIZE
NULL-CHAR
“World”
INTO WS-STRING.
DISPLAY WS-STRING.
MOVE TAB-CHAR TO WS-FILLER.
DISPLAY “Tab character inserted: ” WS-FILLER.
この例では、`NULL-CHAR`を`WS-STRING`に挿入し、`TAB-CHAR`を`WS-FILLER`に設定して表示しています。
4. サンプルプログラム
ここでは、よく使われる特殊文字を定義し、それらを使った簡単な文字列操作を行うサンプルプログラムを示します。
- サンプルプログラム:SYMBOLIC CHARACTERS句の活用例
IDENTIFICATION DIVISION.
PROGRAM-ID. SYMBOLIC-EXAMPLE.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES.
- ————————————————————–
- 特殊文字にニーモニック名を割り当てる定義
- ————————————————————–
- ヌル文字 (ASCII 0)
SYMBOLIC CHARACTERS NULL-CHAR IS 0.
- タブ文字 (ASCII 9)
SYMBOLIC CHARACTERS TAB-CHAR IS 9.
- 改行コード (ASCII 10) – 環境によってCR+LFの場合もあります
SYMBOLIC CHARACTERS LF-CHAR IS 10.
- スペース文字 (ASCII 32) – COBOLではSPACEも予約語として使えますが、
- 例として定義してみます。
SYMBOLIC CHARACTERS MY-SPACE IS 32.
- 16進数での定義例 (例: ASCII の 0x0D = CR)
SYMBOLIC CHARACTERS CR-CHAR IS X’0D’.
DATA DIVISION.
WORKING-STORAGE SECTION.
- ————————————————————–
- 文字列を格納する変数
- ————————————————————–
01 WS-OUTPUT-LINE PIC X(80).
01 WS-TEMP-FIELD PIC X.
PROCEDURE DIVISION.
- ————————————————————–
- メイン処理
- ————————————————————–
- 1. ヌル文字を含む文字列の作成と表示
MOVE “FirstPart” TO WS-OUTPUT-LINE.
STRING WS-OUTPUT-LINE DELIMITED BY SIZE
NULL-CHAR
“SecondPart”
DELIMITED BY SIZE
INTO WS-OUTPUT-LINE.
DISPLAY “1. Null character example: ” WS-OUTPUT-LINE.
- 2. タブ文字を使った表示
MOVE “Column1” TO WS-TEMP-FIELD.
DISPLAY “2. Tab character example: ” WS-TEMP-FIELD TAB-CHAR “Column2”.
- 3. 改行コードを使った表示 (環境によっては効果が異なります)
MOVE “Line1” TO WS-OUTPUT-LINE.
STRING WS-OUTPUT-LINE DELIMITED BY SIZE
LF-CHAR
“Line2”
DELIMITED BY SIZE
INTO WS-OUTPUT-LINE.
DISPLAY “3. LF character example: ” WS-OUTPUT-LINE.
- 4. 定義したスペース文字の使用例
MOVE “Leading” TO WS-OUTPUT-LINE.
STRING WS-OUTPUT-LINE DELIMITED BY SIZE
MY-SPACE
“Trailing”
DELIMITED BY SIZE
INTO WS-OUTPUT-LINE.
DISPLAY “4. Defined space example: ” WS-OUTPUT-LINE.
- 5. 16進数で定義したCR文字の使用例
- (通常、CRの後にLFが続くことが多いので、改行と併用されることも)
MOVE “CarriageReturn” TO WS-OUTPUT-LINE.
STRING WS-OUTPUT-LINE DELIMITED BY SIZE
CR-CHAR
“Next Line”
DELIMITED BY SIZE
INTO WS-OUTPUT-LINE.
DISPLAY “5. CR character example: ” WS-OUTPUT-LINE.
- ————————————————————–
- プログラム終了
- ————————————————————–
GOBACK.
このサンプルプログラムは、`SPECIAL-NAMES`段落でいくつかの特殊文字を定義し、`PROCEDURE DIVISION`でそれらを実際に使用して文字列の構築や表示を行っています。コメントで各処理の内容を詳細に説明していますので、動作確認の際の参考にしてください。
5. 応用・注意点
- 環境依存性: 特殊文字のコードや、それらがどのように解釈されるかは、実行環境(OS、COBOLコンパイラ、端末エミュレータなど)によって異なる場合があります。特に改行コード(LF、CR、CRLF)などは注意が必要です。定義する際に、対象の環境の仕様を確認するようにしましょう。
- 可読性 vs. 冗長性: `SYMBOLIC CHARACTERS`句はコードの可読性を高めますが、定義する特殊文字がごく少数で、かつその意味が自明な場合は、必ずしも定義する必要はありません。例えば、COBOLの予約語である`SPACE`や`QUOTE`は、そのまま使用する方が簡潔な場合もあります。
- 16進数表記の活用: 10進数で指定しにくいコード(例: ASCIIの制御文字の一部)は、16進数表記(`X’HH’`)で定義すると便利です。
- 代替手段: COBOL 2002以降では、`NATIONAL- OF`句や`HEX-OF`句など、Unicodeや16進数リテラルを直接扱う機能も強化されています。これらの新しい機能と組み合わせて使用することも検討すると良いでしょう。
- デバッグ時の注意: `DISPLAY`文などで特殊文字を表示しようとした場合、意図した通りに表示されなかったり、画面が乱れたりすることがあります。デバッグ時には、これらの特殊文字が正しく挿入されているか、文字列の長さを確認するなど、慎重に調査する必要があります。
SYMBOLIC CHARACTERS句を適切に活用することで、COBOLプログラムにおける特殊文字の扱いの堅牢性と保守性を高めることができます。ぜひ、日々の開発業務で活用してみてください。

コメント