GNU COBOL
Powiedzieli, że nie da się tego zrobić. Właściwie to ja powiedziałem, że nie da się tego zrobić. Teraz zostało to zrobione, a przestarzała funkcja języka została ponownie zaimplementowana przy użyciu zastosowanej metody.
Pytanie brzmi:
Jeśli do kodu źródłowego zostaną dodane dodatkowe białe znaki lub instrukcje (które nie zakłócają przepływu kodu), należy je odzwierciedlić w czasie wykonywania (po kompilacji, jeśli dotyczy).
Każda ilość materiału może być wprowadzony przed trzech DISPLAY
sekund, które powodują rozpoczęcie produkcji, w zasadzie poDISPLAY
s będzie „przerwania przepływu kodu”, a więc to jest OK.
COBOL miał TRACE
czasownik (instrukcję), który po prostu wyświetlał źródłowe numery wierszy podczas ich wykonywania (brak dostępu do numeru wiersza w programie). Mimo ograniczonego użycia zamieściłem implementację TRACE.
ID Division.
Program-ID. HIWHERE.
ENVIRONMENT DIVISION.
configuration section.
source-computer. TinkerToy with debugging mode.
Procedure Division.
Declaratives.
Debug-Declaratives Section.
Use For Debugging on a b
.
Debug-Declaratives-Paragraph.
Display Debug-Line "!"
.
End Declaratives
.
Main-Program Section.
DISPLAY "Perform"
Display "Hello World, from line " no advancing Perform b
display "GO TO"
Display "Hello World, from line " no advancing GO TO a
.
a.
dISPLay "Fall through"
Display "Hello World, from line " no advancing. b.
The-Last-bit-OF-the-PROGRAM.
GOBACK
.
Dane wyjściowe to
Perform
Hello World, from line 18!
GO TO
Hello World, from line 20!
Fall through
Hello World, from line 23!
Jako przykład potęgi i elastyczności pisania języka, w tym przykładzie zastosowano jednocześnie małe i wielkie litery oraz całkowicie wielkie litery. Nie ma znaczenia, ponieważ podczas przetwarzania wszystko jest „składane” do WIELKIEGO LITERY.
Jedynym standardowym sposobem COBOL-a na uzyskanie źródłowego numeru wiersza w uruchomionym programie z uruchomionego programu jest użycie znaku DEBUGGING
DECLARATIVE
. Masz dostęp do rejestru specjalnego w obrębie SECTION
, ściśle w obrębie jednego akapitu SECTION
, oświadczenia takiego DEBUG-LINE
. Zawiera on źródłowy numer wiersza czasownika (instrukcji), który spowodował przekazanie kontroli do określonej nazwy procedury (akapit lub SECTION
).
Tak więc z PERFORM
, lub GO TO
, lub „przewiń” akapit w deklaratywnych deklaracjach SECTION
jest wykonywany.
OK, ale DISPLAY
nie powoduje przeniesienia kontroli.
Nie ma problemu. Połóż to na tej samej linii co przeniesienie kontroli.
Problem, ponieważ jeśli do kodu źródłowego zostanie dodana „dowolna biała spacja lub instrukcje (które nie zakłócają przepływu kodu), należy to odzwierciedlić w czasie wykonywania (po skompilowaniu, jeśli dotyczy)”.
Tak więc, umieść go w tym samym wierszu, ale przed przekazaniem kontroli podziel zawartość DISPLAY
na dwie części (pamiętaj: „W tym kontekście chcemy, aby numer pierwszego wiersza instrukcji, który wyświetla łańcuch” ) i wyprowadzają pierwszą część przed przekazaniem kontroli, a drugą część - od DEBUG-LINE
razu po zakończeniu procedury debugowania.
Ostatni trudny bit dotyczy „upadku” („procedury” mogą być PERFORM
edytowane, mogą być celem GO TO
lub mogą być wprowadzane po prostu jako następny wiersz). W tym przypadku wstaw DISPLAY
linię, która definiuje procedurę, ale przed definicją .
Nazwy „procedur” ( a
i b
) zostały znacznie skrócone, aby umożliwić ich dopasowanie do tej samej linii źródłowej co DISPLAY
. Ściśle nazwa procedury w języku COBOL powinna zaczynać się gdzieś od kolumny ósmej do kolumny 11. Jednak składnia jest obecnie znacznie bardziej swobodna. Do tego stopnia, że mogę zdefiniować nazwę procedury w tym samym wierszu, co jakiś kod. Nawet osadzony w kodzie. Wymagana jest ostrożność i okazjonalne kropki.
W PROCEDURE DIVISION
każdym pokazanym kropce jest wymagany i nie jest już więcej.
Kompilować:
cobc -x -g hiwhere.cbl
Aby wykonać (linux):
COB_SET_DEBUG=Y ./hiwhere
Wreszcie zwrot TRACE (bez READY / RESET).
ID Division.
Program-ID. tRacE.
ENVIRONMENT DIVISION.
configuration section.
source-computer. TinkerToy with debugging mode.
Procedure Division.
Declaratives.
Debug-Declaratives Section.
Use For Debugging on a
.
Debug-Declaratives-Paragraph.
Display Debug-Line
.
End Declaratives
.
Main-Program Section.
* Just append "perform a" to a single-line statement.
DISPLAY "1" . perform a
Display "2" . perform a
display "3" . perform a
* Or prepend "perform a." for a multi-line statement, or a
* statement which won't "come back".
perform a. GOBACK
.
a.
CONTINUE
.
Dane wyjściowe to:
1
17
2
18
3
19
20
Gdzie 1, 2 i 3 są wyprowadzane z trzech instrukcji DISPLAY, a 17, 18, 19 i 20 są numerami linii „wykonywalnych” (nie debugujących) linii.