COBOL (IBM Mainframe)
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
.
Jeśli uruchomisz powyższy program (dowolny COBOL IBM Mainframe od COBOL II (pierwszy kompilator IBM do standardu 1985, prawdopodobnie również inne COBOL IBM), wynikiem będzie:
02/22/14 13.11.02 CZEŚĆ ŚWIATA!
Jeśli jednak usuniesz potrójnie bezużyteczną linię „PRZENIEŚ MIEJSCE NA W-KIEDY”. (pole ma początkową wartość spacji i ma inną treść umieszczoną w nim w następnej instrukcji, i tak i tak jest rozgałęzione) program nie generuje danych wyjściowych i faktycznie przerywa (U4038) (co oznacza, że się zawiesza) z następującym komunikatem :
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.
(kod i tekst wiadomości różnią się w zależności od kompilatora, przesunięcia zależą od faktycznego użytego kompilatora i opcji kompilacji, adres zależy od tego, gdzie program jest ładowany po wykonaniu EXECuted).
Powodem jest NEXT SENTENCE
. Jest to Secret GO TO
. Kompilator wyszukuje następny kropkę / kropkę w źródle i generuje gałąź do następującej instrukcji. Od COBOL II korzystanie z kropek / kropek zostało złagodzone. Program musi kończyć się kropką / kropką. W takim przypadku gałąź nie działa na końcu programu.
Oba programy kompilują się w 100% czysto (brak komunikatów diagnostycznych, kod powrotu zero).
To zachowanie jest głupim „rozszerzeniem IBM” do języka COBOL. Standard z 1985 r. Nie zezwala na NEXT SENTENCE
wewnątrz IF
/ END-IF
( CONTINUE
zamiast tego stosuje się, co nie jest możliwe). IBM na to pozwolił - od czasu do czasu powodując okropne Gotchas.