本页的翻译:
MI (i5/OS Machine Interface)是i5/OS应用程序与Licensed Internal Code (LIC) 之间的逻辑接口层。MI存在2种变体: OMI (original MI) 和 NMI (new MI)。这里我们提到的MI指OMI。
EMI (Extended i5/OS Machine Interface Language) 是什么,不是什么
这里的内容
entry hello-main ext ; dcl sysptr pgm-world auto init("WORLD", type(pgm)) ; dcl dd msg char(32) auto ; dcl dd len bin(4) auto ; dcl spcptr msg-ptr auto init(msg) ; dcl ol argl-world(msg-ptr) arg ; brk 'INIT' ; cpyblap msg, 'Hello, ', ' ' ; addspp msg-ptr, msg-ptr, 7 ; callx pgm-world, argl-world, * ; brk 'SEND_MSG' ; triml len, msg, ' ' ; %sendmsg(msg, len) ; brk 'END' ; rtx * ; pend; /* eof - hello.mi */
dcl spcptr .world parm ; dcl ol pl-world(.world) parm ext ; entry * ext ; dcl dd world char(8) bas(.world) ; dcl dd words(0:3) char(8) init( *(0)'ILE RPG', 'COBOL', 'Java', 'MI' ) ; dcl dd buf char(8) auto ; dcl dd i bin(2) unsgnd def(buf) pos(7) ; matmdata buf, x'0000' ; div(s) i, 16384 ; cpyblap world, words(i), ' ' ; brk 'END' ; rtx * ; pend; /* eof - world.mi */
qsh > cd /home/ljl/tmp > mic -q*replace hello.emi mic: -- program HELLO is placed in library LSBIN
> MIC PGM(WORLD)
SRCPATH('/qsys.lib/srclib.lib/misrc.file/world.mbr')
OPTION(*REPLACE) /* 替换已存在同名程序对象 */
mic: -- program WORLD is placed in library LSBIN.
> CALL PGM(HELLO) Hello, COBOL > CALL PGM(HELLO) Hello, MI > CALL PGM(HELLO) Hello, ILE RPG > CALL PGM(HELLO) Hello, ILE RPG
参数名 | 含义 |
Program (PGM) | 编译产出的程序对象名及库名;库名默认为*CURLIB,当前库 |
Source path name (SRCPATH) | 源文件路径名,见注释1, 注释2 |
Text description (TEXT) | 程序的文字描述 |
Output printer file (OUTPUT) | 输出编译器列示信息时使用的打印文件(*PRTF);默认为*LIBL/QSYSPRT。见注释3 |
Public authority (AUT) | 公共权限;默认为*ALL |
Include directories (INCDIR) | 包含路径,最多15个;可以指定库文件系统,流文件系统的绝对路径或相对路径 |
Compiler options (OPTION) | 编译选项;参考IBM给出的i5/OS机器接口语言规格说明 Create Program (QPRCRTPG) API |
注释1. | MIC支持流文件系统源和数据库文件系统源。 对于流文件系统源,SRCPATH参数直接使用流文件(*STMF)的IFS路径名,如:/home/ljl/misrc/hello.emi; 当使用数据库文件系统存储源时,要使用源物理文件(source PF),指定路径时要使用 /qsys.lib 格式,如:/qsys.lib/srclib.lib/misrc.file/world.emi。 对源物理文件(source PF)使用CL命令DSPFD时,可以看到文件的File type (FILETYPE)为'*SRC'(而数据物理文件为'*DATA')。 |
注释2. | MIC在定位源文件时支持绝对路径和相对路径。结合使用当前路径和 源文件相对路径名可以带来许多方便。通过QShell使用MIC时,当前路径为当前工作路径; 通过CL命令使用MIC时,可以用CL命令CHDIR或CHGCURDIR修改当前路径,可以用CL命令 DSPCURDIR查看当前路径。 |
注释3. | 如果希望MIC输出编译列示信息需要指定*LIST选项。 编译列示信息输出为spooled file,spooled file名称为 OUTPUT参数指定的Printer File名称。 |
> mic -h Usage: mic [options] file Options: -v Verbose -V Show version information -h Show help information -o Name of created program object -t Text description -l Output printer file name -a Public authority -I Include path -q Compiler options -L Library name of created program object Report bugs to junleili-cn@users.sourceforge.net
QShell命令mic的选项及含义如下:
选项名 | 含义 |
-h | 显示帮助信息 |
-v | verbose, 当指定了-q*list 显示编译列示信息 |
-V | 显示版本信息 |
-o program-name | 指定程序对象名;如不指定则使用输入文件名作为程序对象名 |
-t text | 指定程序文字描述 |
-l printer-file | 指定输出编译器列示信息时使用的打印文件(*PRTF);如不指定使用*LIBL/QSYSPRT。 |
-a public-authority | 公共权限;默认为*ALL |
-I include-path | 包含路径;可以指定最多15个 |
-q compiler-option | 编译选项;参考IBM给出的i5/OS机器接口语言规格说明 Create Program (QPRCRTPG) API |
-L library-name | 程序所在库名称。 如果环境变量OUTPUTDIR存在,使用OUTPUTDIR的值。 如果环境变量OUTPUTDIR不存在,使用作业当前库。 |
使用相对路径指定源文件和包含路径
假设库文件系统源文件为 SRCLIB/MISRC(HELLO), 被包含库文件系统源文件为 SRCLIB/MISRC(UTIL_INC),CL命令MIC参数可以按如下指定:
> CHGCURDIR DIR('/qsys.lib/srclib.lib/misrc.file') Current directory changed. > MIC PGM(HELLO) SRCPATH(hello.mbr) /* 相对路径名 */ TEXT('using relative path name') mic: -- program HELLO is placed in library *CURLIB.
混合使用库文件系统源文件和流文件系统源文件
假设目的源文件为库文件系统源文件为 SRCLIB/MISRC(HELLO), 被包含源文件分别在流文件系统目录 /home/ljl/mi-inc, /home/ljl/mi-inc/sub-dir 下,CL命令MIC参数可以按如下指定:
> CHDIR DIR('/home/ljl/mi-src')
Current directory changed.
> MIC PGM(HELLO)
SRCPATH('/qsys.lib/srclib.lib/misrc.file/hello.mbr')
INCDIR('sub-dir')
OPTION(*REPLACE)
mic: -- program HELLO is placed in library *CURLIB.
在QShell环境下输出编译列示信息
在QShell环境下输出编译列示信息,需要同时指定-v选项和-q*list选项,如
qsh > mic -v -q*replace -q*list hello.emi
在QShell环境通过标准输入录入源
在QShell环境下调用mic命令,如果不指定输入源文件,MIC由标准输入 读取源。如果未指定-o选项,MIC使用a.out作为输出程序名。
> mic << eof
>
> entry * ext;
>
> dcl dd msg char(32) auto init('happy birthday:)');
>
> dcl dd len bin(2) auto;
>
> triml len, msg, ' ';
>
> %sendmsg(msg, len);
>
> rtx *;
>
> pend;
>
> eof
mic: -- program A.OUT is placed in library LSBIN
$
> system "call a.out" # 执行程序A.OUT
:
happy birthday:)
$
/* single-line comment */ /* multi-line comment ... ... */