COBOL的调用能够是静态调用(Static Call),这时,被调用的子程序必须与调用程序一块儿连接(link-edited)起来造成一个完整的装载模块(Load module),但子程序依然能够单独编译。这种方法会生成一个大的模块,同时也使得多个主程序调用同一个子程序时共享程序拷贝的愿望落空。 另一种COBOL调用方法是动态调用(Dynamic CALL),这时,被调用的子程序必须编译和连接成一个独立的装载模块(Load module)。它能够与主程序一块儿放到同一个装载模块库中。当有多个主程序调用同一个子程序时,你们能够共享它的程序拷贝。 在CICS中咱们使用LINK或XCTL命令调用CICS子程序,是否咱们可使用COBOL的(静态的(Static)或动态的(Dynamic)CALL语句呢?COBOL的CALL语句在CICS中到底会有什么样的效果呢?若是能够,那么COBOL CALL与CICS的LINK或XCTL有什么区别呢?哪一种方法效率更高? 许多程序员甚至工做过不少年的大机CICS程序开发人员都有相似的疑问,很难清晰地回答上面的问题,如今,借此机会,咱们一块儿来回答它。 COBOL静态调用是用CALL LITERAL(文字常数),程序是用COBOL的编译选项NODYNAM编译的。被调用程序必须由调用者进行链接编译,并与调用程序一块儿生成一个装载模块。 COBOL动态调用使用CALL VARIABLE(变量),无论COBOL编译是用DYNAM或NODYNAM选项,都是动态调用。动态调用的程序会生成独立的装载模块,所以能够被多个调用者共享。 COBOL的CALL语句能够说相似于LINK语句,由于它们都会转移到下一逻辑层运行,但XCTL则在同一逻辑层运行。此外,CALL语句象LINK同样在执行完后必定要将控制权转移回调用程序而XCTL则不用。在CICS中,程序之间是经过DFHCOMMAREA来传递信息的。XCTL命令相对于LINK命令来讲,开销要小些,所以性能要优越些。此外,调用程序不会期望被XCTL的程序将控制权转移回调用程序。 在CICS中咱们可使用CALL语句动态调用子程序,但这时,子程序必须定义在CICS的程序处理表(PPT)表中,而在CICS中使用CALL语句调用子程序也只能在VS COBOL II中 才能够,换句话说,COBOL 74不支持这种方法。 毫无疑问,咱们可使用COBOL CALL语句代替CICS LINK命令,可是,它代替不了XCTL命令。有许多理由支持使用动态调用(Dynamic CALL)比静态调用(STATIC CALL)更好。假定咱们使用动态调用,它与CICS LINK语句的区别是: COBOL CALL比LINK有更好的性能,由于CALL与主程序处在同一个运行单元(Run unit)中,而LINK与调用程序处于不一样的运行单元中。 COBOL CALL能够用来在主程序和子程序之间传递最多32K的通信区。 COBOL CALL能够传递多个数据项而LINK只能传递一个数据项即DFHCOMMAREA。 COBOL CALL只能使用在单个CICS区域(Region)中而LINK能够在不一样的CICS区域中转移控制,LINK是为了支持相似于VS COBOL中的CALL语句而建立的。 事实上,咱们可使用三种方法调用子程序: 使用COBOL CALL语句 使用CICS LINK命令 使用CICS XCTL命令 若是你使用静态CALL语句,则每次编译时你必须链接到被调用程序而每一个调用程序都会有一个被调用程序的拷贝。好比,程序ProgA、程序ProgB和程序ProgC都静态调用程序ProgD,这时,在内存中就会有ProgD的三个拷贝,分别供ProgA、ProgB和ProgC使用。 另外一方面,若是你使用LINK或XCTL语句,则在CICS区域中只有ProgD的一个拷贝被调用程序ProgA、ProgB和ProgC共享,由于在CICS中,程序是可重入(re-enterrant)的,这样,每一个调用程序会有本身的区域但被调用程序会在全部调用程序之间共享。 因此,从CICS资源的角度来看,它们是有区别的。毫无疑问,使用COBOL静态CALL时因为每一个调用程序有单独的被调用程序区域,运行效率固然要高些,但对CICS的资源来讲,则是很大的负担。因此,除非被调用程序使用得很是频繁,使用LINK和XCTL更好一些。 除此以外,还有一些因素也是咱们须要考虑的: 当心使用CALL语句,由于你所调用的子程序使用的内存空间会累积起来,从而大量增长你的交易使用的内存空间。它会使你的内存使用量迅速提升。使用LINK命令时,属于被调用程序的工做区(Working storage)会在程序返回调用程序时会释放出来,因此,使用LINK命令会下降你的内存的消耗,它会本身打扫战场。而COBOL CALL从内存使用的角度来看是笨蛋。被调用程序的工做区只有在运行单位结束时才会释放。这种状况典型地出如今从CALL语句返回时,而从LINK语句返回时则不会发生。 若是你喜欢CICS调试工具CEDF,你就会知道它不会显示CALL语句的活动但却会显示LINK命令的活动。这也是本人喜欢LINK比CALL多一点的缘由之一。一样你在阅读系统跟踪(Trace)报告时,也会发现它只报告CALL语句的只言片语,但对于LINK命令则有详细的报告,这是本人喜欢LINK多过CALL的另一个小缘由。 静态调用(STATIC CALL)管理起来更困难于是不值得考虑它所产生的一点点额外的效能。静态调用的另一个问题是,当你修改子程序时,你必须修改全部调用它的主程序,这是使人讨厌也是容易出错的。个人建议是,老是使用动态调用除非你有使人信服的理由要使用静态调用。 若是在你的程序中混合使用LINK和CALLs则你的交易确实要消耗大量的内存空间。例如,假定咱们有三个程序分别是A、B和C。考虑下面的情节: A CALL C, C 返回 A A LINK B B CALL C 这时,系统须要分配4个而不是3个工做区(working storage)。程序A和B各有一个工做区,而程序C则要二个工做区。C须要分配二个工做区是由于它须要在二个不一样的运行单元中运行。在上面的例子中,若是只使用CALL则只须要分配3个工做区。 再补充说一下XCTL命令。咱们只在从一个画面(MAP)跳到下一个画面时才使用XCTL命令。换句话说,只是在画面层而不是在业务处理层使用XCTL命令。