tinycobol/cobrun
Nilo Roberto C Paim 945dd1a809 version 0.73.0 2023-07-14 12:15:30 -03:00
..
test.code version 0.73.0 2023-07-14 12:15:30 -03:00
Makefile version 0.73.0 2023-07-14 12:15:30 -03:00
Makefile.in version 0.73.0 2023-07-14 12:15:30 -03:00
Makefile.mingw version 0.73.0 2023-07-14 12:15:30 -03:00
Makefile.mingw.in version 0.73.0 2023-07-14 12:15:30 -03:00
Readme.txt version 0.73.0 2023-07-14 12:15:30 -03:00
htcobrun version 0.73.0 2023-07-14 12:15:30 -03:00
htcobrun.c version 0.73.0 2023-07-14 12:15:30 -03:00
htcobrun.exe version 0.73.0 2023-07-14 12:15:30 -03:00
htcobrun.o version 0.73.0 2023-07-14 12:15:30 -03:00
htcobrun.sh version 0.73.0 2023-07-14 12:15:30 -03:00
tcrunhelp.h version 0.73.0 2023-07-14 12:15:30 -03:00
tcrunversion.h.in version 0.73.0 2023-07-14 12:15:30 -03:00
tcrunversion.txt version 0.73.0 2023-07-14 12:15:30 -03:00

Readme.txt

Abstract:

Program (htcobrun) to enable TC COBOL (sub)programs, or modules, 
compiled with TC as shared libraries (DLL's), to be dynamically loaded 
and run.

The shared library files, which can contain one or more modules, are generally
stored in a directory.

The TC run-time will use the 'TCOB_LD_LIBRARY_PATH' and 'LD_LIBRARY_PATH' 
environment variables, to locate the requested (sub)program or module name.

Note that the (sub)programs, or module name, is the 'PROGRAM-ID' name, not 
the actual shared library file name.
The actual file (shared library) may contain one or more modules.


Why use 'htcobrun':

The 'htcobrun' program can be compiled to fully include the full run-time 
(static) library (Not available on MinGW version). 
This approach yields substantial runtime performance improvements. 

The COBOL (sub)programs can be built as shared libraries, which may contain 
one or more modules, and are loaded and run dynamically. 

Problems in using this approach:
Currently, there is no support for passing 'LINKAGE SECTION' parameters to
sub-programs. 

>---------------------------------------------------------------------------<

How to build the program:
make 
Modify the 'htcobrun.sh' as required.
make install (su required)

>---------------------------------------------------------------------------<

How to run an application:

You can use the 'htcobrun' program directly or use the sample
shell script 'htcobrun.sh' provided.

To use the 'htcobrun' program directly, first set the modules location(s).

Example:
$LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
$TCOB_LD_LIBRARY_PATH=.
$export TCOB_LD_LIBRARY_PATH LD_LIBRARY_PATH
$htcobrun dyntest

To use the sample shell script 'htcobrun.sh', edit the script and set
the modules location(s).

Example:
$edit tcobrun.sh
...
LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
TCOB_LD_LIBRARY_PATH=.
export TCOB_LD_LIBRARY_PATH LD_LIBRARY_PATH
...
$htcobrun.sh dyntest

>---------------------------------------------------------------------------<

Notes:

The current version of TC will substitute a 'main' entry point, for the 
name of the COBOL program, if it does not detect a 'USING' clause in 
the 'PROCEDURE DIVISION'.

Also the 'ACCEPT identifier FROM COMMAND-LINE' statement, will not work when 
when COBOL programs are compiled as modules.

These problems will be corrected in the future

The MinGW version can only be compiled and run using the TC run-time as a 
DLL (not static).

>---------------------------------------------------------------------------<

Original OpenCOBOL mailing-list posting:

Subject: [open-cobol-list] Open Cobol Optimization
Date: Sun, 16 Nov 2003 17:16:22 +0100

Keisuke asked me to post this info - so here it is.
Note - Applies to Linux

In an effort to get the same performance as MF, I noticed
that we are heavily bouncing in and out of the shared libs.
So I came up with this. "cobcrun" is a driver prog used to
call the Cobol prog. 
(This is equivalent to MF's "cobrun" and ACU's "runcbl"). 
It pulls in the complete static versions of libcob and libgmp. 

The difference in runtime performance is astounding !

This also has a useful side effect in that all Cobol progs 
can be compiled as modules. 
(And therefore we do not need to work out which are main progs
 and which are sub-progs for the compile)
(Note in cobcrun, that I move out argv0, otherwise we would
 have to do some fancy checking for the command line accept)
(Note this is a quick and dirty, must do more checking)

In addition, with GCC > 3, you can tweak a bit more by passing
CFLAGS="-march=pentium3 -minline-all-stringops" (for P3 - arch=pentium4 for P4)
into the Open Cobol configure and also into the program compiles.

Here's cobcrun.c :
#include        <stdio.h>
extern void *cob_resolve (const char *name);
extern void cob_call_error (void);
int
main (int argc, char **argv)
{
         int ret;
         int (*func)();
         char    *argn[64];

         if ( argc <= 1 ) {
                 fprintf(stderr, "No parameters specified\n");
                 return 1;
         }
         for ( ret = 1; ret < argc; ret++ ) {
                 argn[ret - 1] = argv[ret];
         }
         cob_init (argc - 1, argn);
         func = cob_resolve (argn[0]);
         if (func == NULL) {
                 cob_call_error ();
         } else {
                 ret = func ();
         }
         return ret;
}

And here's the compile/link for it :
gcc -rdynamic -Wl,-export-dynamic -O2 -o cobcrun \
cobcrun.c -Wl,-whole-archive /usr/local/lib/libcob.a \
/usr/lib/libgmp.a -Wl,-no-whole-archive -lltdl -ldb -lncurses -lm

Keisuke has indicated that something like this will be included in the next 
release.

Comments welcome.

Regards

Roger While