2015-07-29 19 views
14

Có thể thực thi mã COBOL mà không cung cấp tệp đầu vào không? Tôi đang sử dụng cobc.Làm thế nào để chạy cobc mà không có tệp nguồn đầu vào, nhưng thông qua một đường ống?

Tôi cố gắng để ống mã để quá trình cobc:

$ cat my-input.cbl | cobc 
cobc: No input files 

Để biên dịch một tập tin và chạy nó, tôi làm:

cobc -x di.cbl -o a && ./a 

Giả sử tôi không có một tập tin, tôi chỉ có mã ở đâu đó (có thể trong một biến, như chuỗi), tôi có thể chuyển nó đến cobc không? Nó sẽ tốt hơn là tạo tệp và sau đó biên dịch nó và chạy nó.

Trong trường hợp của tôi, người dùng nhập mã nguồn của chương trình COBOL và đó là biến chuỗi. Hiện tại, tôi lưu mã trong một tệp, tôi biên dịch nó và sau đó tôi thực thi nó. Sẽ tốt hơn nếu cobc hỗ trợ piping đoạn mã trong stdin hoặc thậm chí là tùy chọn cli và tạo tệp nhị phân hoặc thậm chí hiển thị kết quả trực tiếp (không chắc đó là ý tưởng tốt hay xấu). nút, ví dụ, có tùy chọn -p: node -p 'console.log (1)' - điều này sẽ xuất ra 1 \ nundefined. g ++ có tính năng này -

+0

Bạn sẽ phải đặt tính năng này làm yêu cầu tính năng cho dự án GnuCOBOL. Hiện tại SourceForge, có thể sẽ sớm được chuyển sang. –

+0

@BillWoodger Có thể bạn có thể làm điều đó và đăng câu trả lời? :) Tôi không thực sự quen thuộc với cách SourceForge hoạt động ... –

+0

Để không có mã nguồn trong một tập tin mang một ý nghĩa lớn của "mã được tạo ra". Đó có phải là loại điều bạn đang nghĩ đến không? Bạn đã có một vài ví dụ mà nó sẽ có lợi cho đường ống thay vì sử dụng một tập tin? Nếu bạn có thể làm điều đó, tôi có thể gửi yêu cầu thực tế. –

Trả lời

6

Không thể hôm qua, nhưng hôm nay là ngày hôm nay và tôi sẽ nhận được các thay đổi vào cây nguồn ngay sau khi khách hàng tiềm năng phê duyệt thay đổi.

Hai thay đổi nhỏ đối với nguồn trình biên dịch và - có thể được sử dụng để chỉ ra stdin.

prompt$ echo 'program-id. test. display "hello".' | cobc -free -frelax -x -o thing - 
-: 1: Warning: PROCEDURE DIVISION header missing - assumed 
prompt$ ls -l 
-rwxrwxr-x. 1 btiffin btiffin 13192 Jul 31 17:27 thing 
prompt$ ./thing 
hello 

này sau đó sẽ làm việc cho bất kỳ hệ điều hành, và không chỉ những người có/dev/hỗ trợ stdin (trong đó, cho bây giờ, khi paxdiablo viết, là một lựa chọn rất hợp lệ với GNU/Linux và các loại tương tự).

Và như một sang một bên; cobc có thể đã được sử dụng như một thông dịch viên POSIX.

#!/usr/local/bin/cobc -xvg 
     identification division. 
     program-id. SAMPLE. 

     procedure division. 
     display "scripted" end-display 
     goback. 

     end program SAMPLE. 

với

prompt$ chmod +x interp.cob 
prompt$ ./interp.cob 

cho

Command line: /usr/local/bin/cobc -xvg ./interp.cob 
Preprocessing: ./interp.cob -> interp.i 
Return status: 0 
Parsing:  interp.i (./interp.cob) 
Return status: 0 
Translating: interp.i -> interp.c (./interp.cob) 
Executing:  gcc -std=gnu99 -c -I/usr/local/include -pipe -Wno-unused 
       -fsigned-char -Wno-pointer-sign -g -o "/tmp/cob25113_0.o" 
       "interp.c" 
Return status: 0 
Executing:  gcc -std=gnu99 -Wl,--export-dynamic -o "interp" 
       "/tmp/cob25113_0.o" -L/usr/local/lib -lcob -lm -lgmp 
       -lncursesw -ldb -ldl 
Return status: 0 

Đáng buồn thay, đó là chỉ dành riêng cho việc xây dựng. Thực hiện đòi hỏi một bước bổ sung.

prompt$ ./interp 
scripted 

Không có tùy chọn trình biên dịch để "chạy mã ngay bây giờ", vì vậy tùy chọn -J (biểu mẫu cố định) và -j (biểu mẫu tự do) sẽ được thêm vào. Chạy công việc, trở thành một dạng mới của -x (tạo tệp thực thi) nhưng cũng sẽ thực thi nhị phân ở cuối quá trình xử lý. Sau đó, chúng ta sẽ có quyền truy cập vào các tập lệnh "lõi" trong POSIX. Hiện tại tất cả những gì được cho phép là xây dựng và chạy phải là một lệnh riêng biệt.

Và giới hạn cố hữu mà các dòng HashIX được giới hạn trong một đối số duy nhất, vì vậy -j -free sẽ không hoạt động, cũng như sẽ không -j-Xref, nhưng trong giới hạn, nó sẽ cho phép các tập lệnh cobc.

Đó là một thay đổi một dòng khác đối với trình biên dịch, và 400 dòng phân tích cú pháp tùy chọn và tài liệu. ;-)

Nên sẵn sàng để thử nghiệm sau vài giờ. Một lần nữa, những thay đổi này sẽ yêu cầu sự chấp thuận từ tất cả các trình bảo trì trình biên dịch khác, nhưng tôi không thấy bất kỳ lý do gì để không cho phép cải tiến. Hai cam kết, một cho - như stdin, và -J -j cho công việc chạy ở cuối biên dịch.

+0

Đã kiểm tra ok. cobc bây giờ hỗ trợ -j, biên dịch, liên kết và đi. Vì vậy, kịch bản shell cobc sẽ có trong bản 2.0 trước khi phát hành, cũng như có thể, tốt, biên dịch, liên kết và đi, từ một dòng lệnh cobc. –

+0

Cảm ơn! :) Bạn có thể vui lòng cung cấp một số liên kết đến mã nguồn nơi mã này đã được giới thiệu (ví dụ: các liên kết cam kết hay không)? Đây là một tin tức tuyệt vời! –

+0

@ IonicăBizău, cobc từ stdin, đi vào với Rev 630. http://sourceforge.net/p/open-cobol/code/HEAD/tree/ Chúc mừng. –

3

Với một chút lén lút, điều này có thể được thực hiện. Đầu tiên tạo một file chúng ta có thể sử dụng để thử nghiệm:

000100 * HELLO.COB OpenCOBOL FAQ example 
000200 IDENTIFICATION DIVISION. 
000300 PROGRAM-ID. Hello. 
000400 PROCEDURE DIVISION. 
000500 DISPLAY "Hello world!". 
000600 STOP RUN. 

Bây giờ bạn đã biết chúng ta có thể biên dịch và chạy này:

pax> cobc -x hello.cob ; hello 
Hello world! 

Nhưng, nếu bạn không muốn nó trong một tập tin, bạn chỉ có thể sử dụng /dev/stdin "tập tin" để có được những thông tin trong, điều chỉnh các tập tin đầu ra như vậy nó mang lại cho bạn những gì bạn muốn:

pax> cat hello.cob | cobc -x /dev/stdin -o hello2 ; hello2 
Hello world! 

đó là đến từ một fi nhưng nó không phải là cobc mở tệp để biên dịch nó, vì vậy bạn có thể thay thế cat hello.cob bằng bất kỳ lệnh nào đã tạo tệp nguồn COBOL cho đầu ra tiêu chuẩn của nó.

Tất cả những gì bạn cần làm trong chương trình là mở một quy trình chạy cobc với tệp /dev/stdin làm đầu vào và tệp đầu ra phù hợp, sau đó đưa chương trình COBOL của bạn vào đó.

Các vấn đề liên quan