You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在COBOL中创建带*NOMAIN与可导出过程的*MODULE?

COBOL(IBM i 环境)创建 *SRVPGM 对应 RPGLE 流程的实现

在IBM i的COBOL环境中,实现类似RPGLE创建服务程序(*SRVPGM)的流程,同样对应三个核心环节,以下是具体实现方式:

1. 编写无主程序的COBOL模块源(对应RPGLE的Module Source)

RPGLE中用*NOMAIN标记模块无主程序,COBOL通过不定义主程序入口+ENTRY语句声明可导出过程来实现。这类模块编译后生成*MODULE对象,作为服务程序的组成部分。

示例模块源(成员名:COBMOD01,存于QCBLSRC):

IDENTIFICATION DIVISION.
PROGRAM-ID. COBMOD01 NOT INHERITING FROM PROGRAM.
* 声明不继承默认主程序属性,避免自动生成主入口
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-RESULT PIC 9(5).

PROCEDURE DIVISION.
* 定义第一个可导出过程,符号名为CALC_ADD
EXPORTED-ADD.
    ENTRY "CALC_ADD" USING BY VALUE A B PIC 9(5)
                      RETURNING WS-RESULT.
    COMPUTE WS-RESULT = A + B.
    GOBACK.

* 定义第二个可导出过程,符号名为CALC_MUL
EXPORTED-MUL.
    ENTRY "CALC_MUL" USING BY VALUE A B PIC 9(5)
                      RETURNING WS-RESULT.
    COMPUTE WS-RESULT = A * B.
    GOBACK.

编译命令生成*MODULE:

CRTCOBMOD MODULE(MYLIB/COBMOD01) SRCFILE(MYLIB/QCBLSRC) OPTION(*SHOWINC *SHOWSRCP)

2. 编写绑定源(对应RPGLE的Binder Source)

绑定源用于精确指定服务程序要导出的过程符号,格式与RPGLE的绑定源完全一致(属于IBM i系统级定义,与语言无关)。

示例绑定源(成员名:COBBIND,存于QSRVSRC):

STRPGMEXP PGMLVL(*CURRENT)
  EXPORT SYMBOL(CALC_ADD)
  EXPORT SYMBOL(CALC_MUL)
ENDPGMEXP

执行命令创建*SRVPGM:

CRTSRVPGM SRVPGM(MYLIB/COBSRV01) MODULE(MYLIB/COBMOD01) BNDSRC(MYLIB/QSRVSRC) TEXT('COBOL 算术运算服务程序')

注:也可通过CRTSRVPGM的EXPORT(*ALL)参数直接导出模块中所有ENTRY声明的过程,但最佳实践是用绑定源精准控制导出范围,避免暴露内部逻辑。

3. 编写调用程序的原型定义(对应RPGLE的Prototype Source)

在COBOL调用程序中,需通过INTERFACE语句定义服务程序过程的调用接口,确保参数传递和返回值匹配,对应RPGLE的原型定义。

示例调用程序(成员名:COBCALLER,存于QCBLSRC):

IDENTIFICATION DIVISION.
PROGRAM-ID. COBCALLER.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-A PIC 9(5) VALUE 10.
01 WS-B PIC 9(5) VALUE 20.
01 WS-RESULT PIC 9(5).

* 定义CALC_ADD的调用接口
INTERFACE.
    IDENTIFICATION DIVISION.
    PROGRAM-ID. CALC_ADD.
    DATA DIVISION.
    LINKAGE SECTION.
    01 LK-A PIC 9(5).
    01 LK-B PIC 9(5).
    01 LK-RESULT PIC 9(5).
    PROCEDURE DIVISION USING BY VALUE LK-A LK-B
                      RETURNING LK-RESULT.
END-INTERFACE.

* 定义CALC_MUL的调用接口
INTERFACE.
    IDENTIFICATION DIVISION.
    PROGRAM-ID. CALC_MUL.
    DATA DIVISION.
    LINKAGE SECTION.
    01 LK-A PIC 9(5).
    01 LK-B PIC 9(5).
    01 LK-RESULT PIC 9(5).
    PROCEDURE DIVISION USING BY VALUE LK-A LK-B
                      RETURNING LK-RESULT.
END-INTERFACE.

PROCEDURE DIVISION MAIN.
    * 调用服务程序的CALC_ADD过程
    INVOKE CALC_ADD USING WS-A WS-B RETURNING WS-RESULT.
    DISPLAY "10 + 20 = " WS-RESULT.

    * 调用服务程序的CALC_MUL过程
    INVOKE CALC_MUL USING WS-A WS-B RETURNING WS-RESULT.
    DISPLAY "10 * 20 = " WS-RESULT.

    STOP RUN.

编译调用程序并绑定服务程序:

CRTCOBPGM PGM(MYLIB/COBCALLER) SRCFILE(MYLIB/QCBLSRC) BNDSRVPGM(MYLIB/COBSRV01)

内容的提问来源于stack exchange,提问作者corei

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 18:32:25