返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >怎么理解C语言和ABAP
  • 746
分享到

怎么理解C语言和ABAP

2023-06-04 09:06:52 746人浏览 薄情痞子
摘要

本篇内容介绍了“怎么理解C语言和ABAP”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!比如像下图这种用kernel module修饰的sc_

本篇内容介绍了“怎么理解C语言和ABAP”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

比如像下图这种用kernel module修饰的sc_km_check_feature_2, 以及每一个ABAP关键字,其C语言的实现代码在SAP内部的Netweaver系统可以查看到,但是在客户系统上,则是以二进制目标文件的形式存储,无法查看源代码。

怎么理解C语言和ABAP

本文的目的是希望通过C语言和ABAP编译过程的一些介绍,加深ABAP顾问们对这门语言的理解。

用C语言写个Hello World程序,另存为study.c:

怎么理解C语言和ABAP

用命令行GCc ./study.c --verbose进行编译,参数verbose可供我们查看编译明细。上述命令行在我的ubuntu系统上产生一串长长的输出:

怎么理解C语言和ABAP

怎么理解C语言和ABAP

我们可以一步步分析。首先用参数 -E查看预处理生成的目标文件study.i:

gcc -E study.c -o study.i

可以看到源代码文件只有78字节,编译预处理后生成的输出文件有17116字节。

怎么理解C语言和ABAP

为什么膨胀了这么多?原因是因为我源代码文件的第一行,#include<stdio.h>被预处理器替换成了stdio.h的实际内容,而stdio.h里如果又存在#include其他文件的声明,这个替换过程会递归执行。因此直到study.i的末尾部分,我们才能看到在study.c里书写的源代码部分。

怎么理解C语言和ABAP

源代码文件study.c里的第一行语句 #include<stdio.h>, 请大家记住,后面讲ABAP还会提到。

用命令行gcc -S可以查看study.c编译后生成的汇编代码:

怎么理解C语言和ABAP

看到这些pushq, popq, %rbp,Jerry不由得想起本科汇编程序设计专业课上,我和寝室其他兄弟坐在教室最后一排看体坛周报的时光。

工作十多年后,Jerry不得不承认,当时本科开设的计算机专业课,像数据结构操作系统,计算机组成原理,编译原理,汇编程序设计,计算机图形学这些都是有用的,工作后,公司不可能再给你时间去学习这些基础理论知识了。

虽然汇编程序设计这门课Jerry当初没有好好学,但至少教材我是妥善保存了的,以防哪天公司的工作安排需要让我把十多年前在学校学的东西重新又捡起来。

怎么理解C语言和ABAP

下面我们来聊聊ABAP。

怎么理解C语言和ABAP

SAP note 1230076 ”Generation of ABAP loads: Tips for the analysis” 介绍了一个工具程序:RSDEPEND。这个note提到,一个即便看起来最简单的ABAP Hello World报表,其实也依赖于许多标准的Repository对象,这些依赖我们假定称其为A,B,C。假设A,B,C其中有任何一个有改动产生,比如A是一个include程序,里面使用到了一个DDIC结构,在某个时刻,系统导入了一个传输请求(Transport Request), 里面包含了针对这个DDIC结构的更改,那么此时这个最简单的Hello World报表的load就成为了obsolete状态。在重新执行该报表之前,ABAP Runtime(中文译成ABAP运行时)会自动做一个load invalidation操作,生成一个最新版本的load。

什么是ABAP load?看ABAP help里的官方定义:

“In the ABAP environment, a load describes a binary representation of a repository object which is optimized for fast access, in the memory or on the database.”

翻译成中文:ABAP load是Repository对象的二进制表现形式,针对ABAP环境的快速访问而做过特别优化,可以存储在数据库表中或者加载于内存里。

我们用一个实际的例子来理解ABAP报表激活和运行时发生的事情。

创建一张非常简单的透明表ZLOADTEST:

怎么理解C语言和ABAP

写一个简单的报表,命名为ZTESTLOAD。报表的源代码以压缩的格式存储在表REPOSRC的DATA字段里。

怎么理解C语言和ABAP

测试报表的源代码很简单,把表里的数据全部读取出来:

怎么理解C语言和ABAP

激活这个简单的报表(是的,在ABAP世界里,我们习惯说激活,而不是编译)。激活后生成的ABAP load存储在表REPOLOAD的字段LDATA和QDATA里。

怎么理解C语言和ABAP

这两个字段存储的内容就是前面ABAP help提到的ABAP load在数据库表中的存储形式。

菜单Goto->Navigate to->Switch to Classic Debugger:

怎么理解C语言和ABAP

Goto->System Areas->Internal InfORMation:

怎么理解C语言和ABAP

在System Area区域输入CONT,就能在下图的NAME列看到ABAP load里包含的指令。当然同开源JVM不同,JVM字节码指令集在网上能够查到,而这些ABAP load的指令是SAP internal的,因此不能在这里做解释。

怎么理解C语言和ABAP

然后执行前面提到的工具报表RSDEPEND, 输入参数program name = ZTESTLOAD, 得到结果,其中测试报表的ABAP Load时间戳为07:21:02, 这个报表依赖的标准Include有:

  • <REPINI>

  • <SYSINI>

  • <SYSSEL>

  • DB__SSEL

怎么理解C语言和ABAP

怎么理解C语言和ABAP

由此看出,每一个标准的ABAP报表都自动包含了这些include。如果开发人员显式地再包含其中任意一个,会遇到语法错误: Module %_PF_STATUS is already defined as a OUTPUT module.

怎么理解C语言和ABAP

怎么理解C语言和ABAP

大家觉得这个<REPINI>是不是很像前文C语言部分提到的#include<stdio.h>?

下面我们再做几轮测试。

测试1

修改透明表的描述信息,然后重新激活透明表。

执行RSDEPEND, 可以看到只有透明表的Last Changed字段发生了变化,ABAP Time Stamp和Screen Time Stamp都不变,这是我们期望的结果,因为我们只是修改了透明表的描述信息,并未修改结构。

怎么理解C语言和ABAP

再次执行测试报表ZTESTLOAD, 用RSDEPEND检测,发现测试报表的ABAP Load时间戳没有发生变化,这说明:即使依赖的透明表的描述信息发生变化,使用了该透明表的ABAP报表不需要重新编译,因为透明表描述信息不需要在报表执行期使用。

测试2

给透明表增加新的一列,再次激活。

怎么理解C语言和ABAP

此时通过RSDEPEND发现,透明表的三个时间戳全部发生了变化,如下图蓝色矩形框所示。然而测试报表ABAP Load本身的时间戳仍然未变,这也是合理的,因为我们给透明表里增加了新的列后,还未执行测试报表。

怎么理解C语言和ABAP

再次执行ZTESTLOAD后,这次发现它的ABAP Load已经被自动invalidate了,时间戳从07:21:02变成了07:36:02。

怎么理解C语言和ABAP

这也解释了一个现象:有的朋友们观察到,当系统刚升完级后,或者有一批新的传输请求导入到系统后,第一次使用SAP应用时,系统响应速度很慢。原因其实通过前文的两个测试已经说明了:系统在花费时间去做相关ABAP Load invalidation。在应用依赖的这些Load invalidation没有结束之前,系统无法响应用户请求。

为了避免用户在第一次使用应用时长时间等待,可以使用事务码SGEN预先进行Load invalidation。

“怎么理解C语言和ABAP”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: 怎么理解C语言和ABAP

本文链接: https://lsjlt.com/news/237212.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎么理解C语言和ABAP
    本篇内容介绍了“怎么理解C语言和ABAP”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!比如像下图这种用kernel module修饰的sc_...
    99+
    2023-06-04
  • C语言常量该怎么理解
    C语言常量该怎么理解,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。什么是常量从字面上简单解释就是不变的量叫常量常量都有哪些字面常量const修饰的常变量#define定义的标识...
    99+
    2023-06-22
  • c语言中指针怎么理解
    指针是 c 语言中的一种变量,存储指向其他变量或内存位置的内存地址。指针的用途包括高效的数组遍历、动态内存分配、函数参数传递和实现数据结构。需要注意的是,指针必须指向有效内存,使用正确的...
    99+
    2024-05-10
    c语言
  • c语言返回值怎么理解
    c语言中,函数通过return语句明确返回数据,类型由函数声明中指定。返回值包括基本类型、指针类型、结构/联合体类型和数组指针类型。函数的返回值可用于传递数据、检查执行状态、作为输入或处...
    99+
    2024-05-15
    c语言
  • c语言和c++怎么区别
    c++kquote>c语言和c++的主要区别在于:对象导向编程:c++支持,c不支持。数据类型:c++引入了bool、string、vector等新类型。指针:c使用直接指针,c+...
    99+
    2024-04-05
    c语言 c++
  • 怎么理c语言解递归算法
    这篇文章主要讲解了“怎么理c语言解递归算法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理c语言解递归算法”吧!算法思路大家都知道,一个方法自己调用自己...
    99+
    2024-04-02
  • 怎么理解C语言布尔类型
    本篇内容主要讲解“怎么理解C语言布尔类型”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么理解C语言布尔类型”吧!C 语言标准(C89) 没有定义布尔类型,如果你使用 true 和 false,...
    99+
    2023-06-03
  • 深入理解C语言的new[]和delete[]
    目录1、重载操作符2、new和delete的原理3、new[]和delete[]的原理总结c++的动态内存管理方式和c语言不一样,在c++中使用new和delete来替换c语言中的m...
    99+
    2024-04-02
  • 怎么理解C语言do{}while(0)结构
    这篇文章主要介绍“怎么理解C语言do{}while(0)结构”,在日常操作中,相信很多人在怎么理解C语言do{}while(0)结构问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么理解C语言do{}whil...
    99+
    2023-06-16
  • 怎么理解C语言的函数栈帧
    本篇内容介绍了“怎么理解C语言的函数栈帧”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、函数栈帧的创建1.寄存器一般来说,计算机中的寄存器...
    99+
    2023-06-25
  • C语言的数据结构怎么理解
    这篇文章主要介绍了C语言的数据结构怎么理解的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言的数据结构怎么理解文章都会有所收获,下面我们一起来看看吧。1 猜数字游戏-问题描述这个游戏一点都不陌生,猜价格是一度...
    99+
    2023-06-30
  • 怎么理解C语言中的time函数
    本篇内容介绍了“怎么理解C语言中的time函数”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!编程中经常用到时间表达及转换的函数,它们都定义在...
    99+
    2023-06-03
  • 怎么理解Java和SAP ABAP的静态代理和动态代理
    本篇内容介绍了“怎么理解Java和SAP ABAP的静态代理和动态代理”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!下图是某应用里方法的常规...
    99+
    2023-06-02
  • go语言和c语言是什么
    这篇文章主要介绍了go语言和c语言是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇go语言和c语言是什么文章都会有所收获,下面我们一起来看看吧。Go(又称Golang)是Google开发的一种静态强类型、编...
    99+
    2023-07-04
  • C语言ultiByteToWideChar和WideCharToMultiByte怎么用
    C语言中的MultiByteToWideChar和WideCharToMultiByte函数是用来在宽字符和多字节字符之间进行转换的...
    99+
    2023-10-24
    C语言
  • C语言预处理详解
    目录一,预定义符号二,#define1,#define 定义标识符2,#define 定义宏3,#define 替换规则三,##的作用1,概念2,带副作用的宏参数3,宏和函数对比四,...
    99+
    2024-04-02
  • c语言undeclared identifier怎么解决
    在C语言中,"undeclared identifier"意味着你使用了一个未声明的标识符(变量、函数、类型等)。要解决这个问题,你...
    99+
    2023-08-28
    c语言
  • C语言getchar和scanf怎么使用
    getchar函数用于从标准输入流中读取一个字符,其函数原型为:```int getchar(void);```使用方法如...
    99+
    2023-06-12
    getchar和scanf getchar scanf
  • C语言的isalnum()和iscntrl()怎么用
    这篇文章主要介绍了C语言的isalnum()和iscntrl()怎么用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言的isalnum()和iscntrl()怎么用文章都会有所收获,下面我们一起来看看吧。i...
    99+
    2023-06-29
  • C语言的ctime()和gmtime()怎么用
    本篇内容介绍了“C语言的ctime()和gmtime()怎么用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!函数原型如下: __C...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作