ILE 环境下的各种语言(C/C++, CL, RPG, COBOL)的混合编程实例及

2024-03-27 10:40

本文主要是介绍ILE 环境下的各种语言(C/C++, CL, RPG, COBOL)的混合编程实例及,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

引用:http://www.ibm.com/developerworks/cn/aix/library/au-crosslanguage/index.html

ILE 环境下的各种语言(C/C++, CL, RPG, COBOL)的混合编程实例及原理简介

在 IBM System i 平台上 ILE 环境下,如何实现 C/C++, CL, RPG, COBOL 的混合编程

级别: 中级

饶 有清, IBM 软件工程师, IBM 中国软件开发中心
王 虎, IBM 软件工程师, IBM 中国软件开发中心

2007 年 9 月 13 日

本文简要介绍了 IBM System i 平台上 ILE 编程原理,以及如何在 ILE 环境下实现 C/C++、COBOL、RPG 和 CL 的混合编程,在文章的结束部分给出了一个简单的 Demo。

ILE(Integrated Language Environment)

ILE 是 Integrated Language Environment 的缩写,意思为集成语言环境。ILE 是被设计用来提升 IBM System i 上程序开发的一系列工具和相关的系统支持。在 System i 平台 ILE 环境下,C/C++、CL、RPG、COBOL 语言编写的程序可以编译成 Module Object。Module Object 可以直接链接成可执行的 Program Object,也可以链接成不能直接执行的 Service Program Object,这些 Service Program Object 可以和其他的 Program Object 链接后即变成可直接执行的 Object。Object 的编译链接过程如下图所示:


图.1
ILE 示意图 
 

通常情况下,程序只能调用用本语言编写的 Procedure,而不调用其他语言编写的 Procedure。本文将要讲述的混合编程打破了这一常规,在 ILE 环境下,通过各种语言编写的模块之间互相调用彼此的 Procedure 来实现各种语言的混合编程。例如 CL(Control Language) 编写的模块中可以调用 C/C++、RPG、COBOL 编写的 Procedure,C 语言程序中也可以调用 CL、RPG、COBOL 编写的 Procedure。

 

ILE 中的几个重要概念

在讲述混合编程之前,首先简单介绍 ILE 中的几个重要概念。

Procedure:

一段高级语言编写的 source,它可以详细地完成某项任务,然后返回给调用者。对 C 语言而言,Procedure 就是一个函数;对CL而言,Procedure 其实就是一个 CL 程序的 source。

Module:

Module 是由 ILE 编译器编译出来的,不可以执行的 Object。Module 包含有一个或多个 Procedure 和一些数据信息,以及在这个 Module 中一些 Procedure 和数据导出导入信息。当然,有些 Module 还包含调试信息,这取决于你如何编译程序。Module 的结构如下图所示:


图.2
Module 结构图 
 

在 Module Object M1 中,导出了两个 Procedure(Draw_Line 和 Draw_Arc)和一个数据项(rtn_code);同时,M1 也导入一个 Procedure(Draw_Plot)。这个 Module Object 包含有一个 PEP (程序入口函数,在C中是 main 函数)和一个 UEP(Procedure Draw_Arc)。另外,Module Object M1 还包含一些调试信息。

Service Program:

Service Program 是 ILE 链接器把一个或多个 Module 链接在一起而生成的 Object。Service Program 不可以直接在 System i 上执行。从某种角度来看,System i 平台上的 Service Program 类似 Windows 平台上的 DLL(Dynamic Link Library)。Service Program 中导出的 Procedure 和数据可以被 Program 或者其他的 Service Program 调用。Service Program 的 public interface中 定义了其他 ILE Object 可以访问的 Procedure 和数据信息,我们可以通过 binder language 来定义 Service Program 的 public interface。

Service Program 一般包含有 Module 相关的数据信息,Procedure 和数据导出导入信息和调试信息。Service Program 至少有一个 UEP,没有 PEP。Service Program 的结构如下图所示:


图.3
Service Program结构图 
 

在 SPGMEXAMP Service Program中,包含有4个 Module(M1、M2、M3和M4)。SPGMEXAMP 的 public interface 有 Procedure P3、P4 和数据项 D。P3 是在 Module M3 中定义的,P4 是在Module M4 中定义的。另外S PGMEXAMP 调用了其他 ILE Object 提供的 print Procedure。

Program:

Program 是 ILE 链接器把一个或者多个 Module Object 绑定链接而成的可以执行的 Object。Program 是由一个或多个 Module 链接而成,有时还需要链接 Service Program。Program 有且只有一个程序入口 PEP,但可以有多个 UEP。PEP 是在程序链接 CRTPGM 时,由参数 ENTMOD 来指定哪个 Module 的 PEP 为程序的 PEP。Program 的结构如下图所示:


图.4
Program 结构图 


ILE 下混合编程示例

首先分别用 CL, C/C++, RPG, COBOL 五种语言各编写一个 Module。Module 提供一个 Procedure,实现简单的打印功能,打印出 hello world! 信息。所有模块的 source 存在 /qsys.lib/ile_test.lib/mod_source.file 中,可以在后面例子中找到源代码。

1。CL(Control Language)程序

CL 编写的 Procedure 是程序把 Hello World! 消息发送到用户 RAOYQ,所以事先需要创建用户 RAOYQ。CL 程序源码如下:


图.5
CL程序源码 
 

使用编译命令 “CRTCLMOD MODULE(ILE_TEST/CLMODULE) SRCFILE(ILE_TEST/MOD_SOURCE) SRCMBR(CL_MODULE)“ ,在 ILE_TEST 库中生成 CLMODULE Object。使用“DSPMOD MODULE(ILE_TEST/CLMODULE) DETAIL(*PROCLIST)”命令可以查看到 Module 导出的 Procedure 情况,CL Procedure 导出的 Procedure 名称就是 Module 的名称。注意:其它 ILE object调 用这个P rocedure, 必须使用 CLMODULE 这个名称。CLMODULE 的结构如下图所示:


图.6
CLMODULE 结构图 
 

Module Object CLMODULE 中只导出一个 Procedure(CLMODULE);同时,Module 导入一系列系统提供的 Procedure(CEEGOTO Qcl_CHKBI、Qcl_LkLDA等)。这 个Module Object 包含有一个 PEP 和一个 UEP(CLMODULE)。

2。C程序

C 语言编写的 Procedure 是一个 C 函数,打印"Hello World! Print by C module/n"信息到控制台。程序的源码如下所示:


图.7
程序源码 
 

通过 CRTCMOD MODULE(ILE_TEST/CMODULE) SRCFILE(ILE_TEST/MOD_SOURCE) SRCMBR(C_MODULE)可以把源码编译成 Module Object。 C Procedure 导出的 Procedure 名称就是函数的名称,其它 ILE Object 调用这个 Procedure,调用函数名就可以了。如果 C Procedure 会被其他语言的 ILE Object 调用,如 CL、COBOL、RGP,Procedure 的名称必须大写,这些语言不能识别小写 Procedure 名。

3。C++ 程序

C++ 语言编写的是一个 HelloOperation 类,类中定义有一个 Procedure PrintHello。在这个 Procedure 中,"Hello World! Print by C++ module/n"被输出到 Console。HelloOperation 类定义在 /QSYS.LIB/ILE_TEST.LIB/HPP.FILE/CPP_HEADER.MBR 中,HelloOperation 实现在 /QSYS.LIB/ILE_TEST.LIB/MOD_SOURCE.FILE/CPP_MODULE.MBR 中,source 如下所示:


图.8
cpp 头文件 

图.9
cpp 源码 
 

用 CRTCPPMOD MODULE(ILE_TEST/CPPMODULE) SRCFILE(ILE_TEST/MOD_SOURCE) SRCMBR(CPP_MODULE)命令可以把上面的 C++ Procedure 编译成 Module。由于 C++ 语言是面向对象的语言,不同于 C、CL 等面向过程的语言,所以调用 C++ 编写的 Procedure 不能直接调用 HelloOperation 类的函数成员 PrintHello,需要先创建一个对象,故在其他语言(C除外)中调用 C++写的比较困难。如果必须使用,可以用 extern “C" 来声明类 Procedure 名以避免 C++ 中的命名 mangle 问题。

4。RPG 程序

RPG 程序编写的例子是把“Hello World!”和“PRINT BY RPG”消息打印出来。程序的 source 如下所示:


图.9
RPG 程序 
 

用 CRTRPGMOD MODULE(ILE_TEST/RPGMODULE) SRCFILE(ILE_TEST/MOD_SOURCE) SRCMBR(RPG_MODULE) 命令可以把上面的 RPG source 编译成 Module,执行 DSPMOD MODULE(ILE_TEST/RPGMODULE) DETAIL(*PROCLIST) 命令可以查看到 Module 导出的 Procedure 情况。RPG Module 导出的 Procedure 名称如下图所示。RPG Procedure 导出的 Procedure 名称一般就是 Module 的名称,其它 ILE Object 可以直接调用这个 Procedure。


图.10
Procedure名称 
 

 

5。COBOL 程序

COBOL 程序编写的例子是把“Hello World! print by cobol!“ 消息打印出来。程序的 source 如下所示:


图.11
COBOL程序 
 

用 CRTCBLMOD MODULE(ILE_TEST/CBLMODULE) SRCFILE(ILE_TEST/MOD_SOURCE) SRCMBR(CBL_MODULE) 命令可以把上面的 COBOL source 编译成 Module,可以用 DSPMOD MODULE(ILE_TEST/CBL_MODULE) DETAIL(*PROCLIST) 查看到 Module 导出的 Procedure 情况,CBL Procedure 导出的 Procedure 名称是在 COBOL 程序中定义的名称,其它I LE Object 调用这个 Procedure,可以通过调用该函数名来实现。注意:如果你在 COBOL Module 中试用 STOP RUN。将导致 COBOL MODULE 停止运行,也会使外部的调用者停止运行。本文的实例就出现这个问题,可以删除该行,调用后面例子中的 make 文件 SAMPLE_MK 重新编译。

 

 

ILE 环境下,实现各种语言的混合编程的基础是:不管使用的编程语言是那一种,编译出来的 Module 都是一致的。对于 System i 系统而言,CLMODULE、CMODULE、CPPMODULE、RPGMODULE和CBLMODULE 具有 Module Object 相同的各种属性,不同的地方只有 Module 导出的函数和数据不一样。可以通过 DSPMOD 命令可以查看这些 Module 相同的和不同的各种属性。

上面由不同语言编写 Procedure 的 Module 可以通过 CRTSRVPGM 链接成 Service Program Object。链接器把这些 Module Object 的数据和 Procedure 信息都考入 Service Program Object中,数据和 Procedure 导出由 binder language 来定义。默认情况下 Service Program Object 会导出各个 Module 所导出的所有数据和 Procedure。binder language 语言的格式如下:


图.12
binder language语言格式 
 

调用者可以直接调用 Module Object 中提供的数据和 Procedure,也可以调用 Service Program 导出的数据和 Procedure。如果外部调用者调用 Service Program 导出的数据和 Procedure 时,调用者运行时才调用导出的数据和 Procedure,既在调用者运行时才链接上 Service Program。如果外部调用者调用 Module Object 提供的数据和 Procedure,在调用者编译成 Program 时,就必须把提供数据和 Procedure 包含进调用者的 Program Object。另外,Service Program Object 可以由 binder language 来定义到处接口,而 Module Object导出则不能定义。本文使用的示例是调用 Service Program Object 提供的数据和 Procedure。


图.13
示例 
 

正是由于各种语言编写的 Module 的一致性,所以调用者调用其他语言编写 Module 提供的数据和 Procedure 时,就象调用本语言编写 Module 提供的数据和 Procedure 一样。C 语言中调用 CL 提供的 Procedure,直接调用 Module 或者 Service Program 提供的 Procedure,就如同调用其他 C 函数一样,编译链接时,把这个提供 Procedure 的 Object 加上就可以

下面是一个 C 调用者的程序源码,存放在 /qsys.lib/ile_test.lib/caller.file/c.mbr 中。


图.14
C调用者源码 
 

 

在例子中,我们分别用五种语言编写了提供一个 Procedure 服务的 Module。C 语言编写 Module 是 CMODULE,提供的 Procedure 是 CPRINTHELLO。C++ 语言编写 Module是 CPPMODULE,提供的是一个 HelloOperation 类。CL 语言编写 Module 是 CLMODULE,提供的 Procedure 是 CLMODULE 。RPG 语言编写 Module 是 RPGMODULE,提供的 Procedure 是 RPGMODULE 。COBOL 语言编写 Module 是 CBLMODULE,提供的 Procedure 是 CBLPRINTHELLO。下表横向项就列出了五种语言编写 MODULE 所提供的 Procedure。由于其他语言调用 C++ 编写的 Procedure 比较麻烦,我没有在表中列出具体的实现,所以用灰色表示这一列。

表竖项列出了五种语言编写的调用者。C 调用者调用 CL 提供的 CLMODULE Procedure,可以直接调用 CLMODULE( );调用 COBOL 提供的 CBLMODULE Procedure,可以直接调用 CBLMODULE( );调用 RPG 提供的 RPGMODULE Procedure,可以直接调用 RPGMODULE( )。其他语言的调用,与 C 一样,如下表所示:


调用各种语言编写的 Procedure 列表

C C++ CL COBOL RPG
Caller
CPRINTHELLO ProcedurePrintHello__14HelloOperationFv ProcedureCLMODULE ProcedureCBLPRINTHELLO ProcedureRPGMODULE Procedure
C
CPRINTHELLO( ) CLMODULE( )CBLPRINTHELLO( )RPGMODULE( )
C++
CPRINTHELLO( ) CLMODULE( )CBLPRINTHELLO( )RPGMODULE( )
CL
CALLPRC PRC(PRINTHELLO) CALLPRC PRC(CLMODULE )CALLPRC PRC(CBLPRINTHELLO)CALLPRC PRC(RPGMODULE)
COBOL
CALL LINKAGE TYPE IS PROCEDURE 'CPRINTHELLO' CALL LINKAGE TYPE IS PROCEDURE 'CLMODULE'CALL LINKAGE TYPE IS PROCEDURE 'CBLPRINTHELLO'CALL LINKAGE TYPE IS PROCEDURE 'RPGMODULE'
RPG
CALLB(D)'CPRINTHELLO' CALLB(D) 'CLMODULE 'CALLB(D) 'CBLPRINTHELLO'CALLB(D) 'RPGMODULE'

 



混合编程 Demo 使用

把 ile_sample.savf 文件通过 FTP 传送到系统上,restore 这个文件。sample 中有一个 make 文件 SAMPLE_MK,使用 CRTBNDCL PGM(ILE_TEST/SAMPLE_MK) SRCFILE(ILE_TEST/SAMPLE_MK) SRCMBR(MK) 命令编译这个 make 文件,然后调用这个 make 文件就可以编译所有的 sample 例子了。C_CALLER.PGM 就是上面的例子,里面还有 CL_CALLER.PGM,CBL_CALLER.PGM和RPG_CALLER.PGM。


下载

描述 名字 大小 下载方法
本文用到示例的 source
ile_sample.savf11KBHTTP
关于下载方法的信息


 

参考资料

  • ILE Concept

这篇关于ILE 环境下的各种语言(C/C++, CL, RPG, COBOL)的混合编程实例及的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/851834

相关文章

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss