gnucobol-users
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [open-cobol-list] Calling C++ from GNU COBOL


From: Simon Sobisch
Subject: Re: [open-cobol-list] Calling C++ from GNU COBOL
Date: Fri, 14 Nov 2014 14:06:22 +0100
User-agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:24.0) Gecko/20100101 Thunderbird/24.6.0

Hi Scott,

Sergey Kashrin suggested to simply compile the current cobcrun with a
C++ compiler (maybe rename it to cobcrun.cpp) and start the COBOL
modules via the resulting executable (one c++ main for all COBOL modules
- identical to what I suggested but less to code).

Did you tested this?

How does this entail a sizeable disruption to your existing code base
and development practices?

Simon
> Date: Tue, 11 Nov 2014 08:09:31 -0800
> From: Scott McKellar <address@hidden>
> Subject: Re: [open-cobol-list] Calling C++ from GNU COBOL
> To: "address@hidden"
>       <address@hidden>
> Message-ID:
>       <address@hidden>
> Content-Type: text/plain; charset=us-ascii
>
> Responding to my own post...
>
> Simon Sobisch and Patrick both suggested that I write a small wrapper in C++ 
> that would call the real program in COBOL and not do much else.  I had 
> considered that briefly, but I had hoped to avoid that approach.  It would 
> entail a sizable disruption to our existing code base and development 
> practices.
>
> Also, Brian mused about possibly adding explicit support in GNU COBOL for 
> calling C++ routines.
>
> Finally I got around to what I should have done in the first place, namely 
> some experimentation.
>
> I got my Hello World program (in COBOL) to link to a little C++ routine that 
> wrote a message to standard output using std::cout (I had to add the -lstdc++ 
> option to the compile line).  Rather to my surprise, it worked.
>
> Thinking there might be something special going on with std::cout, I 
> concocted a little class whose constructor stores a time stamp for the 
> current date and time.  Then I declared a static instance of that class and 
> referenced it from my little C++ routine.  That worked too.  The static 
> instance got initialized somehow, even though the top-level program was in 
> COBOL.
>
> I also tried calling the same routine from C, with GNU COBOL taken out of the 
> picture.  It still worked.
>
> Conclusion: at least in my environment (gcc and g++ on RedHat Linux), C knows 
> how to initialize static objects defined in C++.
>
> For my purposes, I think that's good enough, provided that I'm willing to 
> sacrifice some portability.
>
> However I wouldn't generalize this finding to other environments.  I have 
> read warnings about calling C++ from other languages, but the danger is 
> highly system-specific.
>
> ----------
>
> In the more general case, one might find oneself on a system where the C 
> compiler isn't smart enough to initialize C++ standard objects.  In that 
> case, maybe the following approach would work:
>
> If GNU COBOL is compiling a module that includes a main(), it could contrive 
> to compile it as C++, instead of C, provided that a C++ compiler were 
> available.  Then the top-level module would be in C++ and it would know how 
> to initialize static objects.
>
> This approach assumes that the C code generated by GNU COBOL is compilable as 
> C++, or could be made compatible with a minimum of fuss.  The main issue 
> would be to make sure that suitable function prototypes were in scope.  I 
> don't know how much of a big deal that would be.
>
>
>
>
> ----------
>
> Thanks to all who responded.
>
> Scott McKellar
>
> ________________________________
>
>> > Is it possible to call C++ routines (declared of course as extern "C") 
>> > from GNU COBOL?  Do we need to use the version that emits C++, or can we > 
>> > use the version that emits C?
>> >
>> > Context: I'm trying to evaluate a possible migration to GNU COBOL from 
>> > an expensive proprietary COBOL compiler (currently running Linux, RedHat > 
>> > 4.1.2).  Many of our existing COBOL programs rely on C++ routines for 
>> > various things, especially for parsing XML.  I really don't want to have > 
>> > to rewrite all that stuff in some other language.
>> >
>> > What concerns me most is the initialization of static objects.  For 
>> > example, std::cout is a statically allocated instance of an ostream.  It > 
>> > needs to be initialized before use (to connect it to standard output).
>> >
>> > If the main program is in C++, the C++ compiler can give it special 
>> > treatment to ensure that static objects are initialized before control 
>> > enters main().  If the main program is in some other language, we still > 
>> > need the same kind of magic, or else static objects won't get 
>> > initialized.
>> >
>> > Our current compiler provides this magic if you feed it the right 
>> > compile option.  I don't see a similar option for GNU COBOL.
>> >
>> > So far I've been playing with GNU COBOL 1.1, compiled from source.  I 
>> > tried a Hello World program that called a little C++ program, but it 
>> > didn't get past the link because it couldn't find the library for 
>> > std::cout.  I can probably find a way to make the link work, but if I 
>> > do, I suspect that std::cout won't work.
>> >
>> > I understand that there is a GNU COBOL CPP from Sergey that emits C++ 
>> > instead of C.  In that case we could presumably call C++ routines as we > 
>> > do today and any static objects would be healthy.
>> >
>> > However I get the impression that the CPP version is a recent 
>> > development and may still be bleeding-edge.  Ours is a big corporate 
>> > shop; bleeding edges make people nervous.
>> >
>> >
>> >    * Is there a way to call C++ safely from GNU COBOL 1.1, or do we have > 
>> > to use the CPP version?
>> >
>> >    * Is the CPP version considered production-ready?  Is anyone using it > 
>> > successfully in a large-scale production environment?
>> >
>> > Scott McKellar




reply via email to

[Prev in Thread] Current Thread [Next in Thread]