GNU COBOL
Chà, họ nói không thể làm được. Thật ra, chính tôi đã nói rằng nó không thể được thực hiện. Bây giờ đã xong và một tính năng ngôn ngữ lỗi thời được triển khai lại bằng phương pháp được áp dụng.
Câu hỏi nêu:
Nếu bất kỳ khoảng trắng hoặc câu lệnh bổ sung nào (không làm gián đoạn dòng mã) được thêm vào mã nguồn, thì nó sẽ được phản ánh tại thời điểm chạy (sau khi biên dịch nếu có).
Bất kỳ số lượng các công cụ có thể được chèn trước ba DISPLAY
s gây sự bắt đầu của đầu ra, và bất cứ điều gì sau khi các DISPLAY
s sẽ "ngắt dòng mã", do đó của OK.
COBOL đã từng có một TRACE
động từ (câu lệnh) chỉ liệt kê các số dòng nguồn khi chúng được thực thi (không có quyền truy cập vào số dòng trong chương trình). Mặc dù hạn chế sử dụng, tôi đã bao gồm triển khai 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
.
Đầu ra là
Perform
Hello World, from line 18!
GO TO
Hello World, from line 20!
Fall through
Hello World, from line 23!
Là một triển lãm về sức mạnh và tính linh hoạt của việc viết ngôn ngữ, ví dụ này sử dụng chữ thường, chữ thường và chữ hoa hoàn toàn cùng một lúc. Không thành vấn đề, vì khi được xử lý, mọi thứ đều được "gấp lại" thành UPPERCASE.
Cách COBOL tiêu chuẩn duy nhất để có được số dòng nguồn trong chương trình đang chạy, từ chương trình đang chạy, là với a DEBUGGING
DECLARATIVE
. Trong một SECTION
, hoàn toàn trong một đoạn trong một SECTION
, của một tuyên bố như vậy bạn có quyền truy cập vào đăng ký đặc biệt DEBUG-LINE
. Điều này chứa số dòng nguồn của động từ (câu lệnh) đã gây ra sự chuyển quyền kiểm soát sang một tên thủ tục cụ thể (đoạn hoặc SECTION
).
Vì vậy, với PERFORM
, hoặc GO TO
, hoặc "rơi qua" đoạn trong khai báo gỡ lỗi SECTION
được thực thi.
OK, nhưng DISPLAY
không gây ra sự chuyển giao quyền kiểm soát.
Không vấn đề gì. Đặt nó trên cùng một dòng với sự chuyển giao quyền kiểm soát.
Vấn đề, vì nếu "bất kỳ khoảng trắng hoặc câu lệnh bổ sung nào (không làm gián đoạn dòng mã) được thêm vào mã nguồn, thì nó sẽ được phản ánh vào thời gian chạy (sau khi biên dịch nếu có)".
Vì vậy, hãy đặt nó trên cùng một dòng nhưng trước khi chuyển quyền kiểm soát, hãy chia nội dung của DISPLAY
hai phần (hãy nhớ, "Trong ngữ cảnh này, chúng tôi muốn số dòng đầu tiên của câu lệnh xuất ra chuỗi được hiển thị" ) và xuất phần đầu tiên trước khi chuyển quyền kiểm soát và phần thứ hai, từ DEBUG-LINE
, một lần trong quy trình gỡ lỗi.
Bit khó khăn cuối cùng là cho "rơi qua" ("thủ tục" có thể được chỉnh sửa PERFORM
, có thể là mục tiêu của a GO TO
hoặc có thể được nhập đơn giản bằng cách là dòng tiếp theo cùng). Trong trường hợp này, đặt dòng DISPLAY
trên định nghĩa thủ tục, nhưng trước định nghĩa .
Tên của "thủ tục" ( a
và b
) đã được rút ngắn đáng kể để cho phép chúng khớp với cùng một dòng nguồn như DISPLAY
. Nghiêm túc một tên thủ tục COBOL nên bắt đầu từ đâu đó từ cột tám đến cột 11. Tuy nhiên, cú pháp ngày nay, thoải mái hơn nhiều về điều đó. Trong phạm vi mà tôi có thể định nghĩa một tên thủ tục trên cùng một dòng với một số mã. Thậm chí nhúng trong mã. Chăm sóc, và thỉnh thoảng dừng lại, là bắt buộc.
Trong PROCEDURE DIVISION
mỗi điểm dừng hoàn toàn được hiển thị là bắt buộc và không còn nữa.
Để biên dịch:
cobc -x -g hiwhere.cbl
Để thực thi (linux):
COB_SET_DEBUG=Y ./hiwhere
Cuối cùng, sự trở lại của TRACE (không có 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
.
Đầu ra là:
1
17
2
18
3
19
20
Trong đó 1, 2 và 3 là đầu ra từ ba câu lệnh HIỂN THỊ và 17, 18, 19 và 20 là số dòng của dòng "thực thi" (không gỡ lỗi).