大家都知道ABAP是第四代高级语言。但我们有多少人能确定ABAP 报表是如何执行的?它有编译器还是解释器,还是两者兼有?
其实答案是:在某种程度上,它两者都有
。
详细说明一下:在ABAP程序执行之前,ABAP编译器必须将其翻译成一种中间语言。这种形式的程序,即以这种中间形式的程序被称为ABAP负载。然后ABAP虚拟机出现了。ABAP虚拟机是ABAP负载的解释器,也就是说,它可以执行ABAP负载。我们可以将整个场景与Java编译-解释过程相互关联。
在继续之前,我们需要了解什么是处理块。大家应该知道ABAP程序具有模块化结构。这些模块称为处理块。这只是重新组织技巧。
从逻辑上讲,如果我们看任何ABAP程序,它包含两部分:
- 第一部分包含全局声明。
- 第二部分包含处理块。
有几种类型的处理块,包括对话模块和子程序。更准确地说,有以下类型的处理块:
- 对话模块
- 事件块
- 子程序(子例程、功能模块和方法)。
对话模块是从屏幕流程逻辑中调用的。子程序是使用ABAP语句调用的,这些语句本身是其他处理块的一部分,而事件块是从ABAP程序外部调用的。
ABAP负载与ABAP程序的处理块一一对应,即对于ABAP程序中的每个处理块,在相应的ABAP负载中都有一个处理块。在执行任何处理块之前,首先要确定相应的ABAP程序是否已经编译过。如果已经编译过,则ABAP虚拟机可以立即开始执行处理块;否则,ABAP编译器必须先将ABAP程序翻译成ABAP负载,然后再执行它。
这是对ABAP程序编译过程的一个概述。
我已经在自己的公众号这篇文章详细介绍过ABAP负载的结构和编译过程:
顺便说一句,如果大家可以访问数据库,那么能够在D010S表中查看ABAP报告,而在D010L表中查看ABAP负载。