全部博文(287)
分类: 其他UNIX
2013-02-14 09:45:52
问题:
入门中,在模块化里面写模块的时候D规范用到的PI与PR有什么区别,一直混弄不明白……请不要跟我说 一个指接口一个指过程*%%……&**
答:
PI是Procedure Interface;PR是Procedure Reference。 两者是配对使用。PI只能有一个(如果一个PI在一个项目中出现多个,概念已经错误或混乱了。);PR可以有多个,即至少有一个外部的PR要配对内部的、只有一个的PI。
注意:在PI的原型(prototype)第一次编译时,最好把配对的PR定义的原型放在procedure一起进行编译,而不要通过copybook放在一起。因为,PR第一次配对PI进行编译时,如果PR有extproc键字,或者EXPGM键字,会造成第一次配对编译时,OS搜索bnddir或libl,会报外部定义的PR不存在MSG,编译通不过。copybook通常只存放大量含义extpgm或extproc键字的PR。
顺便说一下:在module项目中copybook至少有两个。一个只存放400系统与外界交互的接口程序中extpgm的pr;另一个在module项目中copybook中只存放extproc的pr。没有专门用于pi的copybook,因为pi只有一个,并且定义在procedure中,并且有一个没有ext键字的pr。比较好的做法,用一个专门copybook只管理pi的prototypes,因为copybook可用于编译导向的400宏,可以添加和过滤重复定义。这个copybook只用于pgm,或procedure的原型代码定义。其它copybook中的所有pr都是ext的。
问:
这句话是说,一个procedure的PI是固定的意思吗?
答:
对,一个procedure的处理过程,只能通过Pi 接口与procedure外部Pr的参照(Reference)接口对接。想想就可以知道,如果一个项目中同名的Pi有多个,如果同名的Pi处理过程不一致的时候,或代码重复,即使prototype原型都是一样的,OS系统要用哪一个Pi下的处理过程呢?
顺便说一下,目前实施的中信银行核心改造项目早期就出现这样的概念混乱的情况。
如果Pr定义extproc,通过bnddir,采用静态对接一个Pi的Interface地址指针(Pointer),OS允许Pi之外有多个Pr地址指针进行静态对接。OS从Pr发起处理起点通过地址指针对接Pi地址指针,再引用Pi下的处理代码进行过程处理;再原路返回处理结果。