GNU COBOL
Ну, они сказали, что это невозможно сделать. На самом деле, это я сказал, что это невозможно сделать. Теперь все готово, и устаревшая языковая функция повторно реализована с использованием примененного метода.
Вопрос гласит:
Если какие-либо дополнительные пробелы или операторы (которые не прерывают поток кода) добавляются в исходный код, это должно быть отражено во время выполнения (после компиляции, если применимо).
Любое количество материала может быть вставлено до трех DISPLAY
секунд , которые вызывают начало вывода, и все , что после того, какDISPLAY
с будет «прерывание потока кода», так что это нормально.
В языке COBOL был TRACE
глагол (оператор), который просто перечислял исходные номера строк по мере их выполнения (нет доступа к номеру строки в программе). Несмотря на ограниченное использование, я включил реализацию 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
.
Выход
Perform
Hello World, from line 18!
GO TO
Hello World, from line 20!
Fall through
Hello World, from line 23!
В качестве демонстрации силы и гибкости написания языка в этом примере используются смешанные, полностью строчные и полностью прописные буквы одновременно. Неважно, как при обработке все «складывается» в верхний регистр.
Единственный стандартный способ получения COBOL исходного номера строки в запущенной программе, из запущенной программы, - с помощью DEBUGGING
DECLARATIVE
. В пределах SECTION
, строго в пределах параграфа SECTION
, такого декларативного документа, у вас есть доступ к специальному реестру DEBUG-LINE
. Он содержит номер строки источника глагола (оператора), который вызвал передачу управления определенному имени процедуры (параграф или SECTION
).
Таким образом, с PERFORM
, или GO TO
, или «провалиться» параграф в декларациях отладкиSECTION
выполняется.
Да, но DISPLAY
не вызывает передачу контроля.
Нет проблем. Поместите это в ту же самую линию как передача контроля.
Проблема, поскольку, если «любые дополнительные пробелы или операторы (которые не прерывают поток кода) добавляются в исходный код, это должно быть отражено во время выполнения (после компиляции, если применимо)».
Итак, поместите его в ту же строку, но перед передачей управления, разделите содержимое элемента DISPLAY
на две части (помните: «В этом контексте мы хотим, чтобы номер первой строки оператора, который выводит строку, отображался») ) и вывести первую часть до передачи управления, а вторую часть изDEBUG-LINE
один раз внутри процедуры отладки.
Последний хитрый бит предназначен для «провала» («процедуры» могут быть PERFORM
отредактированы, могут быть целью GO TO
или могут быть введены просто следующей строкой). В этом случае поместите в DISPLAY
строку, которая определяет процедуру, но перед определением .
Имена «процедур» ( a
и b
) были значительно сокращены, чтобы позволить им поместиться в той же исходной строке, что и DISPLAY
. Строго говоря, имя процедуры на языке COBOL должно начинаться где-то с восьмого столбца до столбца 11. Однако синтаксис в наши дни гораздо более расслаблен. В той степени, в которой я могу определить имя процедуры в той же строке, что и некоторый код. Даже встроенный в код. Требуется осторожность, а иногда и полная остановка.
в PROCEDURE DIVISION
каждой показанной полной остановке требуется, и не более того.
Скомпилировать:
cobc -x -g hiwhere.cbl
Выполнить (Linux):
COB_SET_DEBUG=Y ./hiwhere
Наконец, возврат TRACE (без 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
.
Выход:
1
17
2
18
3
19
20
Где 1, 2 и 3 выводятся из трех операторов DISPLAY, а 17, 18, 19 и 20 - номера строк «исполняемых» (не отладочных) строк.