我的编程空间,编程开发者的网络收藏夹
学习永远不晚

怎么理解C语言和ABAP

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

怎么理解C语言和ABAP

本篇内容介绍了“怎么理解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。报表的源代码以压缩的格式存储在表REPOclass="lazy" data-src的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”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

怎么理解C语言和ABAP

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

怎么理解C语言和ABAP

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

c语言中指针怎么理解

指针是 c 语言中的一种变量,存储指向其他变量或内存位置的内存地址。指针的用途包括高效的数组遍历、动态内存分配、函数参数传递和实现数据结构。需要注意的是,指针必须指向有效内存,使用正确的类型转换,并仔细管理以避免内存问题。理解 C 语言中的
c语言中指针怎么理解
2024-05-10

c语言返回值怎么理解

c语言中,函数通过return语句明确返回数据,类型由函数声明中指定。返回值包括基本类型、指针类型、结构/联合体类型和数组指针类型。函数的返回值可用于传递数据、检查执行状态、作为输入或处理错误和特殊情况。特殊值可用于指示错误条件,也可使用v
c语言返回值怎么理解
2024-05-15

C语言常量该怎么理解

C语言常量该怎么理解,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。什么是常量从字面上简单解释就是不变的量叫常量常量都有哪些字面常量const修饰的常变量#define定义的标识
2023-06-22

c语言和c++怎么区别

c++kquote>c语言和c++的主要区别在于:对象导向编程:c++支持,c不支持。数据类型:c++引入了bool、string、vector等新类型。指针:c使用直接指针,c++使用引用。内存管理:c手动管理,c++自动管理。输入/输出
c语言和c++怎么区别
2024-04-05

怎么理解C语言布尔类型

本篇内容主要讲解“怎么理解C语言布尔类型”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么理解C语言布尔类型”吧!C 语言标准(C89) 没有定义布尔类型,如果你使用 true 和 false,
2023-06-03

怎么理解C语言do{}while(0)结构

这篇文章主要介绍“怎么理解C语言do{}while(0)结构”,在日常操作中,相信很多人在怎么理解C语言do{}while(0)结构问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么理解C语言do{}whil
2023-06-16

怎么理解Java和SAP ABAP的静态代理和动态代理

本篇内容介绍了“怎么理解Java和SAP ABAP的静态代理和动态代理”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!下图是某应用里方法的常规
2023-06-02

怎么理解C语言中的time函数

本篇内容介绍了“怎么理解C语言中的time函数”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!编程中经常用到时间表达及转换的函数,它们都定义在
2023-06-03

怎么理解C语言的函数栈帧

本篇内容介绍了“怎么理解C语言的函数栈帧”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、函数栈帧的创建1.寄存器一般来说,计算机中的寄存器
2023-06-25

C语言的数据结构怎么理解

这篇文章主要介绍了C语言的数据结构怎么理解的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言的数据结构怎么理解文章都会有所收获,下面我们一起来看看吧。1 猜数字游戏-问题描述这个游戏一点都不陌生,猜价格是一度
2023-06-30

go语言和c语言是什么

这篇文章主要介绍了go语言和c语言是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇go语言和c语言是什么文章都会有所收获,下面我们一起来看看吧。Go(又称Golang)是Google开发的一种静态强类型、编
2023-07-04

C语言ultiByteToWideChar和WideCharToMultiByte怎么用

C语言中的MultiByteToWideChar和WideCharToMultiByte函数是用来在宽字符和多字节字符之间进行转换的。下面是它们的用法:MultiByteToWideChar:int MultiByteToWideChar(
2023-10-24

ABAP和Go语言的初始化操作方法是什么

本篇内容主要讲解“ABAP和Go语言的初始化操作方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ABAP和Go语言的初始化操作方法是什么”吧!# ABAPGo作用同上:Kubernete
2023-06-03

C语言sockaddr和sockaddr_in怎么使用

在C语言中,`sockaddr`和`sockaddr_in`结构体用于表示套接字地址。`sockaddr`是一个通用的套接字地址结构体,而`sockaddr_in`是用于IPv4地址的套接字地址结构体。首先,我们需要包含头文件``来使用这两
2023-08-11

c语言阶乘求和怎么写

c 语言中计算阶乘和的方法如下:获取要计算阶乘和的数字 n。循环从 1 到 n,对于每个数字 i:计算其阶乘。将阶乘添加到总和中。输出计算出的阶乘和。C 语言求阶乘和求解方法在 C 语言中,求阶乘和的代码如下:#include
c语言阶乘求和怎么写
2024-05-21

C语言的isalnum()和iscntrl()怎么用

这篇文章主要介绍了C语言的isalnum()和iscntrl()怎么用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言的isalnum()和iscntrl()怎么用文章都会有所收获,下面我们一起来看看吧。i
2023-06-29

c语言怎么算商和余数

在 c 语言中:使用除法运算符 (/) 计算商。使用取模运算符 (%) 计算余数。如何在 C 语言中计算商和余数在 C 语言中,可以使用除法运算符(/)和取模运算符(%)来计算商和余数。计算商要计算两个整数 a 和 b 的商,可以使用
c语言怎么算商和余数
2024-05-14

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录