20th March 2022
In an article An open-source COBOL contender emerges a "real" compiler for COBOL was announced. This newly announced compiler is a frontend to gcc. This contrasts with GnuCOBOL, which translates COBOL to C and then calls gcc. As the performance of GnuCOBOL is a little bit disappointing, see Comparing GnuCOBOL to IBM COBOL, I was interested whether this new compiler provides some relief at the performance front.
The announcement is here: James K. Lowden, Announcement: gcobol.
The source code is here: gcc-cobol.
I followed the steps in
README.md. Cloning the repository takes around 5 minutes. It has to download almost 1 GB of data.
git clone https://git.symas.net/cobolworx/gcc-cobol.git Cloning into 'gcc-cobol'... remote: Enumerating objects: 2364034, done. remote: Counting objects: 100% (407/407), done. remote: Compressing objects: 100% (168/168), done. remote: Total 2364034 (delta 287), reused 343 (delta 234), pack-reused 2363627 Receiving objects: 100% (2364034/2364034), 805.41 MiB | 18.46 MiB/s, done. Resolving deltas: 100% (1947302/1947302), done. Updating files: 100% (101783/101783), done.
Downloading the auxiliary libs is fast:
cd gcc-cobol wget https://gcc.gnu.org/pub/gcc/infrastructure/gmp-6.1.0.tar.bz2 wget https://gcc.gnu.org/pub/gcc/infrastructure/isl-0.18.tar.bz2 wget https://gcc.gnu.org/pub/gcc/infrastructure/mpc-1.0.3.tar.gz wget https://gcc.gnu.org/pub/gcc/infrastructure/mpfr-3.1.4.tar.bz2
Then create build directory:
mkdir build && cd build
CFLAGS="-g3 -O0" CXXFLAGS="-g3 -O0" ../configure --prefix=/usr/local/gcobol --with-pkgversion='gcc with COBOL front end' --disable-bootstrap --enable-checking --enable-languages=c,c++,cobol
time make -j4
It took roughly 30 minutes on my NUC, i5-4250U CPU, max. 2.6 GHz, 8 GB RAM. I had to restart the whole compilation once, as some spurious error occured. Just restarting solved the issue.
As I did not want it to interfere with my "real" gcc, I created the
/usr/local/gcobol directory beforehand and
chown myuser:myuser /usr/local/gcobol.
After configuring and making, run
It will install in
2. Compiling COBOL programs. I used the hello-word program
IDENTIFICATION DIVISION. PROGRAM-ID. hello. PROCEDURE DIVISION. DISPLAY "Hello, world".
For compiling this COBOL program I first tried
/usr/local/gcobol/bin/gcobol hello2.cbl -o hello2
This gives error message
/bin/ld: /lib/../lib64/crt1.o: in function `_start': (.text+0x1b): undefined reference to `main' /bin/ld: /tmp/cc5ZAQDK.o: in function `hello': hello2.cbl:(.text+0x5e): undefined reference to `__gg__initialize_variable' /bin/ld: hello2.cbl:(.text+0x72): undefined reference to `__gg__initialize_variable' /bin/ld: hello2.cbl:(.text+0x86): undefined reference to `__gg__initialize_variable' /bin/ld: hello2.cbl:(.text+0x9a): undefined reference to `__gg__initialize_variable' /bin/ld: hello2.cbl:(.text+0xae): undefined reference to `__gg__initialize_variable' /bin/ld: /tmp/cc5ZAQDK.o:hello2.cbl:(.text+0xc2): more undefined references to `__gg__initialize_variable' follow /bin/ld: /tmp/cc5ZAQDK.o: in function `hello': hello2.cbl:(.text+0x52f): undefined reference to `__gg__refer_resolve_minimal' /bin/ld: hello2.cbl:(.text+0x54d): undefined reference to `__gg__display_resolved' collect2: error: ld returned 1 exit status
Next I tried
/usr/local/gcobol/bin/gcobol hello2.cbl -o hello2 -lgcobol -lm -nostartfiles
In crt1.o: In function
_start': - undefined reference to main' in Linux I found the link flag
-nostartfiles. Above command gives:
/bin/ld: warning: cannot find entry symbol _start; defaulting to 00000000004023a0
Running the resulting program
Hello, world zsh: segmentation fault (core dumped) ./hello2
Clearly this COBOL compiler is still in its infancy.
Next I tried
000010 IDENTIFICATION DIVISION. 000020 PROGRAM-ID. hello. 000030 AUTHOR. Elmar Klausmeier. 000040 DATE-WRITTEN. 01-Jul-2004. 000050 000060 DATA DIVISION. 000070 WORKING-STORAGE SECTION. 000080 01 I PIC 9(5). 000090 000100 PROCEDURE DIVISION. 000110 DISPLAY "Hello World!". PERFORM VARYING I FROM 1 BY 1 UNTIL I > 10 DISPLAY I END-PERFORM. 000140 STOP RUN. 000150
cobol1: syntax error, line 1 at '000010' cobol1: error: failed compiling hello.cbl
This compiler does not like line numbering. Just for the records, line numbering in columns 1-6 is absolute valid COBOL.
I then tried the n-queens problem, see Comparing GnuCOBOL to IBM COBOL. Compiling gives:
cobol1: syntax error, line 40 at 'PROCEDURE DIVISION' cobol1: error: failed compiling xdamcnt.cbl
So I had to remove the
LINKAGE SECTION. Then I got
cobol1: parser_goto:6111: function not implemented cobol1: parser_goto:6111: function not implemented cobol1: syntax error, line 122 at 'end-if' cobol1: error: failed compiling xdamcnt2.cbl
So this COBOL compiler does not understand
exit section. I changed all these statements to appropriate
go to's to the end of the section. I compiled
/usr/local/gcobol/bin/gcobol xdamcnt2.cbl -o xdamcnt2 -lgcobol -lm -nostartfiles
Running the resulting programs gives entirely wrong results. I double checked that the exact same program compiled with GnuCOBOL gives correct results.
3. Summary. This COBOL compiler is still way pre-alpha. It cannot be used for any real COBOL programs.
MOVEstatements result in function calls, similar to GnuCOBOL. But this indicates that probably no performance gain can be expected against GnuCOBOL.
To put above harsh comments into perspective: The developers never claimed that their compiler is production ready. From the announcement:
We are working on compiling the NIST COBOL test suite, which we expect will take a few months to complete. (...) Today, we want to make the project known to those in the technical community who might most want to know what we're up to, and explain why we'll be asking the questions we're asking.
Added 20-Mar-2022: Heise.de in Frischzellenkur für die Programmiersprache COBOL: Neuer FOSS-Compiler gcobol also mentions the announcement.