プログラミング

PerlとC言語の連携

PerlからC言語のライブラリを呼び出すのは少々厄介でした。h2xsというツールを使ってテンプレートを生成した上で作成されたMakefileを使ってビルドするという手順になります。他の記事に倣ってシェル1本で書いたので,苦しい対処ですが,sedコマンドとcatコマンドでで生成されたテンプレートを編集しています。

#!/bin/bash

rm -rf Perl2C

h2xs -A -n Perl2C
source=Perl2C/Perl2C.xs

sed -i -e 's/^MODULE.*$/int add(int,int);\n\nMODULE = Perl2C    PACKAGE = Perl2C/g' $source 

cat << EOS >> $source
int
add(x, y) 
    int x
    int y
  CODE:
    RETVAL = x + y;
  OUTPUT:
    RETVAL
EOS

echo "========================================"
cat $source
echo "========================================"
cd Perl2C
perl Makefile.PL
make

cat << EOF > run.pl
use ExtUtils::testlib;
use Perl2C;
\$x = 1000;
\$y = 2000;
\$result = Perl2C::add(\$x, \$y);
print(\$x . " + "  . \$y . " = " . \$result . "\n\n");
EOF

perl run.pl
cd ..

プログラミング

Gnu COBOLとC言語との連携

Gnu COBOLとC言語との連携は比較的容易に実現できます。Gnu COBOL自体がCOBOLのソースコードをC言語に変換してからCコンパイラでコンパイルするというアーキテクチャで実現されていることも理由と思われます。

Cプログラムは普通にライブラリを作成する要領で作成できます。COBOLからはCALL文でサブルーチンを呼ぶのと同じです。文字列の扱いはCOBOL文字列をそのままCライブラリに渡しても処理ができないため,末尾に’\0’を付加して渡す必要があります。

#!/bin/bash
gcc -fPIC --shared -o add.so -xc - << EOF
int add(int x, int y) 
{ 
    return x + y; 
}
EOF

cat << EOS > cob01.cob
000100**************************************************************************
000200 IDENTIFICATION        DIVISION.
000300 PROGRAM-ID.           PROGRAM01.
000400 AUTHOR.               KUBO, Y.
000500**************************************************************************
000600 ENVIRONMENT           DIVISION.
000700**************************************************************************
000800 DATA                  DIVISION.
000900*-------------------------------------------------------------------------
001000 WORKING-STORAGE       SECTION.
001100*-------------------------------------------------------------------------
001200 01 WORK.
001300         03 WORK-ARG1             PIC 9(06)  VALUE  ZERO.
001400         03 WORK-ARG2             PIC 9(06)  VALUE  ZERO.
001500 01 RET                           PIC 9(04)  COMP-X.
001600**************************************************************************
001700 PROCEDURE             DIVISION.
001800**************************************************************************
001900 MAIN-RTN.
002000       DISPLAY   'START'.
002100       MOVE         100          TO       WORK-ARG1.
002220       MOVE         200          TO       WORK-ARG2.
002300       CALL 'add'   USING        BY VALUE   WORK-ARG1
002400                                 BY VALUE   WORK-ARG2
002500                    RETURNING    RET.
002600       DISPLAY    RET.
002700       DISPLAY   'END'.
002800       STOP       RUN.
002900**************************************************************************
EOS

cobc -x -o cob01 cob01.cob

./cob01