COBOL(IBMメインフレーム)
ID DIVISION.
PROGRAM-ID. USELESS.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 W-WHEN-COMPILED PIC X(8)BX(8) VALUE SPACE.
PROCEDURE DIVISION.
IF W-WHEN-COMPILED EQUAL TO SPACE
NEXT SENTENCE
END-IF
MOVE SPACE TO W-WHEN-COMPILED.
MOVE WHEN-COMPILED TO W-WHEN-COMPILED
DISPLAY W-WHEN-COMPILED " HELLO WORLD!"
GOBACK
.
上記のプログラム(COBOL II以降のIBMメインフレームCOBOL(1985年標準の最初のIBMコンパイラ、おそらく他のIBM COBOLも同様))を実行すると、出力は次のようになります。
02/22/14 13.11.02こんにちは世界!
ただし、3つの役に立たない行「スペースをW-WHEN-COMPILEDに移動」を削除すると、(フィールドはスペースの初期値を持ち、次の命令で他のコンテンツが配置され、とにかく分岐します)プログラムは出力を生成せず、実際には次のメッセージで異常終了(U4038)(クラッシュすることを意味します) :
IGZ0037S The flow of control in program USELESS proceeded beyond the
last line of the program. From compile unit USELESS at entry
point USELESS at compile unit offset +000003AC at entry offset
+000003AC at address 119003AC.
(メッセージのコードとテキストはコンパイラーによって異なり、オフセットは実際に使用されるコンパイラーとコンパイルオプションに依存し、アドレスは実行時にプログラムがロードされる場所に依存します)。
その理由はNEXT SENTENCE
。これはSecret GO TO
です。コンパイラは、ソース内の次のフルストップ/ピリオドを探し出し、次の命令への分岐を生成します。COBOL IIからは、フルストップ/ピリオドの使用が緩和されました。プログラムは、フルストップ/ピリオドで終了する必要があります。この場合、分岐はプログラムの最後から外れています。
両方のプログラムは、100%クリーン(診断メッセージなし、ゼロのリターンコード)でコンパイルします。
この動作は、COBOLへの愚かな「IBM拡張」です。1985規格では、/ NEXT SENTENCE
内は許可されていません(代わりに使用されますが、これはノーオペレーションです)。IBMはそれを許可しました-時々ひどいGotchaを引き起こしました。IF
END-IF
CONTINUE