GNU COBOL
Well, they said it couldn't be done. Actually, it was I who said it couldn't be done. Now it's done, and an obsolete language feature re-implemented using the method applied.
The question states:
Якщо будь-які додаткові пробіли або заяви (які не переривають потік коду) додані до вихідного коду, вони повинні бути відображені під час виконання (після компіляції, якщо це застосовується).
Будь-яка кількість матеріалу може бути вставлено до трьох 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 отримати номер вихідного рядка в запущеній програмі з запущеної програми - це a 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 - номери рядків "виконуваних" (не налагоджуваних) рядків.