Back in the days of mainframes and minicomputers, COBOL licenses were very expensive (eg. starting at tens of thousands of dollars per machine).
The neat thing about Linux and open source software is that a fairly good COBOL compiler could be downloaded then installed for zero dollars.
The following instructions describe nothing new and are only meant to pique your curiosity
caveat: yum is the package manager on CentOS-7 and RHEL-7. Starting with version 8, yum commands are translated into dnf commands
command | notes |
---|---|
yum list \*-release\* | display all available distros |
yum install epel-release |
install yum support for the epel distro (required for gnucobol) |
yum list \*cobol\* |
display all available packages containing the string "cobol" |
yum install gnucobol |
install gnucobol |
which cobc | where was the binary stored |
online help: https://gnucobol.sourceforge.io/doc/gnucobol.html
Remember that COBOL remarks begin in column-7 while code begins in column-8
This rule comes from the age of punched cards
12345678901234567890123456789012345678901234567890123456789012345678901234
*> file : hello.cob *> notes : Sample COBOL program (old school) *> history: *> 2023-02-13 NSR original effort *> edit : Neil Rieck *> build : cobc -x hello.cob *> execute: ./hello IDENTIFICATION DIVISION. PROGRAM-ID. hello. PROCEDURE DIVISION. DISPLAY "Hello World!". STOP RUN.
$ cobc -x hello.cob
$ ./hello
Hello World!
$ cobc -help
[[[ help text is displayed ]]]
*> file : hellonew.cob *> notes : Sample GnuCOBOL program *> edit : Neil Rieck (2023-02-13) *> build : cobc -x -free hellonew.cob *> execute: ./hellonew IDENTIFICATION DIVISION. PROGRAM-ID. hellonew. PROCEDURE DIVISION. DISPLAY "Hello World!" END-DISPLAY. GOBACK.
Notes:
*> ========================================================== *> title: demo-isam-001.cob *> date : 2023-02-14 *> edit : Neil Rieck *> build: cobc -Wall -free -x demo-isam-001.cob *> run : ./demo-isam-001 *> ========================================================== IDENTIFICATION DIVISION. PROGRAM-ID. TEST-PROGRAM. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT OPTIONAL D-FILE ASSIGN TO "TESTDB.ISQ" ORGANIZATION IS INDEXED ACCESS MODE IS DYNAMIC RECORD KEY IS D-ID. DATA DIVISION. FILE SECTION. FD D-FILE. 01 D-RECORD. 03 D-ID PIC X(8). 03 D-IV PIC 9(8) COMP. 03 D-XV COMP-2. 03 D-SLEN PIC 9(4) COMP. 03 D-SV PIC X(50). WORKING-STORAGE SECTION. 01 NREC PIC 9(4) COMP VALUE 1000. 01 BLANK-VAL PIC X(8) VALUE " ". 01 EOF-FLAG PIC X. 01 DONE-FLAG PIC X. 01 WID PIC 9(4) DISPLAY. 01 IV PIC 9(4) DISPLAY. 01 XV PIC 9(4)V9(2) DISPLAY. 01 SLEN PIC 9(2) DISPLAY. 01 SV PIC X(50). 01 I PIC 9(4) DISPLAY. 01 N PIC 9(4) DISPLAY. 01 N2 PIC 9(4) DISPLAY. 01 STOP-ID PIC X(8). PROCEDURE DIVISION. MAIN-PARAGRAPH. OPEN I-O D-FILE MOVE BLANK-VAL TO D-ID START D-FILE KEY GREATER THAN D-ID INVALID KEY DISPLAY "Empty file" END-START PERFORM VARYING I FROM 1 BY 1 UNTIL I > NREC COMPUTE WID = 1000 + I STRING "Key#" DELIMITED BY SIZE WID DELIMITED BY SIZE INTO D-ID COMPUTE D-IV = I COMPUTE D-XV = I COMPUTE D-SLEN = 18 STRING "This is value " DELIMITED BY SIZE I DELIMITED BY SIZE INTO D-SV WRITE D-RECORD INVALID KEY DISPLAY "Error writing" NOT INVALID KEY CONTINUE END-WRITE END-PERFORM COMPUTE WID = 1077 STRING "Key#" DELIMITED BY SIZE WID DELIMITED BY SIZE INTO D-ID PERFORM DUMP-PARAGRAPH DELETE D-FILE INVALID KEY DISPLAY "Error deleting" NOT INVALID KEY CONTINUE END-DELETE PERFORM DUMP-PARAGRAPH COMPUTE WID = 1088 STRING "Key#" DELIMITED BY SIZE WID DELIMITED BY SIZE INTO D-ID PERFORM DUMP-PARAGRAPH READ D-FILE INVALID KEY DISPLAY "Error reading" NOT INVALID KEY CONTINUE END-READ COMPUTE D-IV = D-IV + 1 COMPUTE D-XV = D-XV + 0.1 MOVE D-SLEN TO SLEN MOVE D-SV TO SV STRING SV(1:SLEN) DELIMITED BY SIZE " updated" DELIMITED BY SIZE INTO D-SV COMPUTE D-SLEN = D-SLEN + 8 REWRITE D-RECORD INVALID KEY DISPLAY "Error updating" NOT INVALID KEY CONTINUE END-REWRITE PERFORM DUMP-PARAGRAPH MOVE BLANK-VAL TO D-ID START D-FILE KEY IS GREATER THAN D-ID INVALID KEY DISPLAY "Error rewinding" NOT INVALID KEY CONTINUE END-START MOVE 'N' TO EOF-FLAG MOVE 0 TO N PERFORM UNTIL EOF-FLAG = 'Y' READ D-FILE NEXT AT END MOVE 'Y' TO EOF-FLAG NOT AT END PERFORM CHECK-AND-COUNT-PARAGRAPH END-READ END-PERFORM DISPLAY N COMPUTE WID = 1075 STRING "Key#" DELIMITED BY SIZE WID DELIMITED BY SIZE INTO D-ID START D-FILE KEY IS GREATER THAN OR EQUAL TO D-ID INVALID KEY DISPLAY "Error searching" NOT INVALID KEY CONTINUE END-START COMPUTE WID = 1085 STRING "Key#" DELIMITED BY SIZE WID DELIMITED BY SIZE INTO STOP-ID MOVE 'N' TO EOF-FLAG MOVE 'N' TO DONE-FLAG MOVE 0 TO N2 PERFORM UNTIL EOF-FLAG = 'Y' OR DONE-FLAG = 'Y' READ D-FILE NEXT AT END MOVE 'Y' TO EOF-FLAG NOT AT END PERFORM COUNT-PARAGRAPH END-READ END-PERFORM DISPLAY N2 CLOSE D-FILE STOP RUN. DUMP-PARAGRAPH. DISPLAY "Key=" D-ID READ D-FILE INVALID KEY DISPLAY "Not found" NOT INVALID KEY PERFORM DUMP-DATA-PARAGRAPH END-READ. DUMP-DATA-PARAGRAPH. MOVE D-IV TO IV MOVE D-XV TO XV MOVE D-SLEN TO SLEN MOVE D-SV TO SV DISPLAY "(" IV "," XV "," SV(1:SLEN) ")". CHECK-AND-COUNT-PARAGRAPH. MOVE D-IV TO IV MOVE D-XV TO XV MOVE D-SLEN TO SLEN MOVE D-SV TO SV IF IV < 1 OR NREC < IV THEN DISPLAY "Unexpected value: (" IV "," XV "," SV(1:SLEN) ")" END-IF COMPUTE N = N + 1. COUNT-PARAGRAPH. IF D-ID GREATER THAN OR EQUAL TO STOP-ID THEN MOVE 'Y' TO DONE-FLAG ELSE COMPUTE N2 = N2 + 1 END-IF.