Adminstrator
新人上路
新人上路
  • 发帖数1
  • QQ123456
  • 金币23两
  • 威望18点
  • 钻石0枚
  • 注册日期2016-12-01
  • 最后登录2017-06-07
阅读:9202回复:1

[资源分享]关于4GL编译链接浅谈

楼主#
更多 发布于:2017-05-22 22:44
    作为TIPTOP的开发和维护人员,必须知道TOP GP系统的开发方式,编译和链接两条作为程序运行的前提,在每次新开发程序或更新程序后,必须要执行的动作,今天对这两个动作做一些抛砖引玉的简单理解,还望大神们多发表意见。
    4GL是一种面向过程的语言,众所周知,面向过程的语言与面向对象的语言一个明显的区别就是没办法继承。
    举个栗子来说,面向对象的语言,如果你在A程序文件中,需要调用B程序文件的X个函数,必须在A文件首先引用B程序文件,接着使用B.X()的方式进行函数调用;再简单一点的说,面向对象的调用就是在A文件中,继承了B文件的X函数。But,在4GL中,我们只要使用在A程序文件中使用CALL X()就可以了;那4GL中的CALL X()是如何运行的?以TOP GP为例子,整个TOP GP的程序文件几百页,FUNCTION X的函数肯定不止一个,那为什么A文件能够准确的引入的是B文件中的X函数,而不是C文件中的X函数?
    这就是编译与连接起到的作用;作为面向过程的语言,我们没有继承和引用的概念,但是我们有程序池的概念。什么叫程序池?就是运行一支作业必须的程序文件集合,就叫程序池。
   首先,我们讲一下编译,其实编译很简单,字面理解一下就可以,就是将写好的4GL语言转换成能够被程序池认识的文件形式。
   接下来,讲一下链接;所谓链接,简单的就是组合程序池。那当你执行链接(r.l2)的时候,TOP GP是如何知道你要将哪些文件组合成一个程序池呢?这个靠的就是我们的p_link这支作业;这就是为什么只要是新建程序文件的,都必须维护好p_link才可以做接下来的编译动作。p_link维护完成之后,执行编译的动作,系统会将p_link中维护好的作业生成一个应用程序池。我们每次启动程序,并非启动4GL文件,而是启动整个应用程序池;在这个应用程序池中,所有的函数你可以互相的调用,这就能解释第二段为什么在4GL中CALL X()永远不会CALL错。因为在程序池里,压根就没有C文件的存在。这支作业在运行的过程中,只会在自己的应用程序池中寻找函数过来CALL。
   那我们再以TOP GP举个栗子,简单讲一下。本文栗子管够,不够的出门左转,有卖的,自己再买点。
   apmt540采购单作业,在p_link中有apmt540;sapmt540;sapmt540_sub;等等4GL程序文件;也就是说,当我们在执行r.l2 apmt540时,系统将apmt540.42m、sapmt540.42m、sapmt540_sub.42m 等编译好的文件,组合在一个叫apmt540的应用程序池里;那系统为什么知道这个应用程序池叫apmt540呢?因为你自己维护的p_zz里这个作业就叫apmt540!!!!当我们每次启用apmt540这只作业的时候,其实启用的是这个叫apmt540的程序池。再往下延伸一下,apmt590和apmt540其实是共用程序,当我们修改了sapmt540这只作业,对apmt540进行了重新编译连接,但是忘了对apmt590重新连接,这个时候你就能感觉的出来应用程序池之间的差异,apmt540这只程序池经过更新以后,运行的是我们要求的结果,但是590这支程序池并没有重新连接,也就是说在apmt590这个池子里的程序还是老的文件,所以,apmt590运行的结果还是老样子!
    絮絮叨叨这么多,其实就两点:
      1.   r.c2编译是为了让系统能识别我们编写的程序;
      2.   r.l2链接是为了让写好的程序组合在一起满足我们的需求;
    欢迎有问题回帖讨论咨询。 也可以进群481859105讨论。
喜欢0 评分0
joechencc
钻石会员
钻石会员
  • 发帖数122
  • QQ1991586089
  • 金币842两
  • 威望1091点
  • 钻石0枚
  • 注册日期2017-04-03
  • 最后登录2020-11-25
  • 社区居民
  • 忠实会员
沙发#
发布于:2017-05-30 07:52
但想請教一下,若是我修改了一個程序,它被許多的作業程式叫用,那是否意指我只需編譯一次這個程序,但我得重新連結所有可能用到這個程序的作業程式呢?如果答案是yes,那萬一有的連結沒有重新連結到,出現的結果不是我修改後的結果,那又該如何 debug呢?(這兩者之間可能會有時間差,我怎麼可能記得所有有用到這個程序的所有作業呢,更何況呼叫的也可能是其它人寫的)
回复(0) 喜欢(0)     评分
游客

返回顶部