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

电脑杂谈  发布时间:2019-07-13 16:08:35  来源:网络整理

pdflib c++_c语言和c 和c#区别_pdflib c++

本文转载:

在IBM System i平台上,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的编译链接过程如下图所示:

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:

若您确实需要修改同步账号,可使用【工具】—【导出账簿数据】功能将该账簿所有数据导出,然后新建个账簿,在新账簿中使用【工具】—【导如账簿数据】功能导入,(注:导出导入账簿数据可能会造成部分数据混乱,导入后请先核对和调整账簿数据)再在【工具】—【同步数据】功能中使用新的同步账号同步即可。有关导入和导出 iis 配置的信息,请搜索 iis 6.0 帮助中的“配置导入/导出”。4)编译完成后将如图19所示,此时注意编译窗口中的信息,如果有编译错误,将要对源程序进行修改,然后再重新编译,直到没有错误为止。

Module结构 (来自ILE Concepts)

在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。

pdflib c++_pdflib c++_c语言和c 和c#区别

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

Service Program 结构 (来自ILE Concepts)

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

Program :

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

Program 结构 (来自ILE Concepts)

ILE下混合编程示例

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

1。CL(Control Language)程序

做好上述配置之后,就要编写java ee的程序来进行测试了,笔者代码里面用到了java ee7的特性,所以在项目的classpath下要导入javaee7的jar包,如果读者想单独测试下mq的连通性,笔者附件项目里面也有单独测试mq 消息发送和接收的se程序,如下是利用jms1.x消息传递的两个java类和一个测试的servlet:。nrf905ffhghn.rar - 含有nrf905发送,接收程序的全部源码含有nrf905发送,接收程序的全部源码,2015-09-23,下载1次。使用这两个发送消息函数的最重要的是要看你的程序是否要对消息的滞后性关注否,被设置钩子的程序进入了停止的状态,而sendmessage则不会pdflib c++,经常需要等待直到某个功能结束,把钩子消息设置成postmessage的发送消息形式后,postmessage只是把消息放入队列,才能继续运行:打开一个窗口-->,必须要等sendmessage发送出的消息完成后。

使用编译命令 “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调用这个Procedure, 必须使用CLMODULE这个名称。CLMODULE的结构如下图所示:

CLMODULE Module结构

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

2。C程序

pdflib c++_pdflib c++_c语言和c 和c#区别

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

通过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调用pdflib c++,如CL、COBOL、RGP,Procedure的名称必须大写,这些语言不能识别小写Procedure名。

3。C++程序

“两块石头磨成一把石刀,石刀可以砍树,砍成木材,木材做成椅子”,“球从一根绳子的一段移动到了另一端”,编写road类中模拟汽车上路的代码、定义器与road类中模拟汽车穿过路口、编写表示交通灯的lamp类的代码、编写交通灯控制器的类和总成测试:road类的编写每个road对象都有一个name成员变量来代表方向,有一个vehicles成员变量来代表方向上的车辆集合。answer:泛泛地说接口的好处就是很灵活,那么具体怎么说呢,按照我的说法就是你看啊,接口的内部只定义了方法的名称,某实现类通过继承该方法,但是又没有明确指出要用什么方式实现,就可以先用自己喜欢的方式来编写实现方法的功能,但如果突然有一天,被强制要求用别的方式实现,那简单啊,直接在实现类中改写实现功能,到时候在main中一句话新建一下就可以,免去了将全部代码改写的麻烦。(2)根据万年历以上特点进行编写 1)首先对万年历年、月、日进行编写,编写程序先定义每月的天数为28天,如月份为1、3、5、7、8、10、12就定义天数为31天反之如果月份为4、6、9、11就输出天数为30天,由上可见2月份为28天但是如果为闰年就有29天就要定义一个数组存放天数,用while循环控制。

用 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如下所示:

用 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。

5。COBOL程序

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

当你将内部类定义为static时,你就调用不了外部类的实例方法了,因为这时候静态内部类是不持有外部类的引用的。因为 android 的view层完全是基于 java 写的,要想用 go 来写 ui 不可避免要调用 java 代码,而这方面 go 还没有简便的方式,目前 go 调用外部代码只能使用 cgo,通过 cgo 再调用 jni,这需要写很多中间代码,所以目前 go 1.4 采用的是类似 rpc 通讯的方式来做,从它源码中例子可以看出这种方式有多麻烦,性能肯定有不小的损失。实例主程序中,定义相关变量,随后调用获取文件类型属性方法接口,根据传入的文件全名外部进行判断处理,将调用该方法结果与相应的标识进行&运算,如果结果成真则表示为对应文件类型以及是否为只读权限。


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-112688-1.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...