如何查看 SAP ABAP Kernel Module 的源代码

文摘   2024-11-12 12:19   北京  

StackOverflow 上有个网友提问,想查看 ABAP 系统生成 UUID 方法,在 Kernel Module pf_create_uuid16c32 里实现的源代码:

https://stackoverflow.com/questions/42110195/how-to-open-kernel-module-in-abap

笔者之前的文章提到,类似上图高亮这种 ABAP Kernel Module,通过 C 语言开发并编译,普通的 ABAP 开发人员,无法查看其源代码。

这个帖子下有人回答:

去 SAP 应聘一个 Developer 的职位,入职后就可以查看源码了。因为这些 Kernel Module 是闭源的,没有对客户和合作伙伴开放。

提问的网友又追问了一句:如何才能成功被录用

另一个热心的网友补充了一句:我可以给你提供一些信息,我之前的同事,在 Walldorf 的 NWDS 团队工作。

提问的网友马上打退堂鼓:你的好意我心领了。我还是先温习一下我的德语吧。

作为 ABAP 开发人员,虽然无法查看 Kernel Module 源代码,但至少要了解,为什么某些 ABAP 方法,SAP 会选择把它们的实现,放到 Kernel 中采取 C 语言来编写

一言以蔽之,出于性能优化、效率提升及对底层系统能力的充分利用等方面的考虑。

性能优化

ABAP 内核模块使用 C 语言编写,其执行速度明显优于等效的 ABAP 代码。这对于需要高密度计算或大数据量快速处理的场景尤为关键。

比如 ABAP 计算 MD5 HASH 值的 Function Module CALCULATE_HASH_FOR_CHAR,内部通过 C 语言实现的 System Call 来高效完成计算。

底层系统资源的访问

C 语言提供了与底层操作系统及硬件直接交互的能力。这对于涉及底层操作(如内存管理或硬件直接交互)的任务至关重要,而这些功能通过 ABAP 来实现往往不可行或效率较低。通过 C 语言,内核模块能够更直接地操作硬件资源,实现更精细的控制。

比如笔者在文章 SAP ABAP 和 Java 里的弱引用(WeakReference)和软引用(SoftReference) 里提到的 ABAP 一个内存管理的工具类:CL_ABAP_MEMORY_UTILITIES

其手动触发内存垃圾回收的方法:DO_GARBAGE_COLLECTION,就是调用 SYSTEM-CALL 来完成。

C 语言允许直接操控内存和系统资源,从而显著降低执行时间,提升整体系统的响应性和效率。例如 C 语言可以通过系统调用,直接操作 TCP 套接字。因此 CL_HTTP_CLIENT 和 CL_HTTP_SERVER 这些通过 ABAP 实现 HTTP 交互场景的工具类,其数据收发等实现,也通过 Kernel 的 C 代码完成。

增强的功能实现

某些功能,例如复杂的数学计算或特定的算法(如加密算法),更加适合通过 C 来实现。C 语言提供了丰富的库以及优异的性能,使 ABAP 应用能够无缝地利用这些高级功能,而不必在性能上做出妥协。这种方法确保了复杂逻辑的实现既高效又可靠。

比如通过 CL_ABAP_GZIP 提供的 ZIP 压缩和解压操作:

再比如 CRC 即循环冗余校验码的计算,有很多成熟的 C 语言库可供使用。因此在 ABAP 里把它放到 Kernel 里实现也是一件顺理成章的事情。

安全性与稳定性

内核方法和普通的 ABAP 方法一样,经过了相同的安全性检查,确保其在 ABAP 环境中的安全使用。此外,通过使用 C 语言实现关键功能,SAP 能够保证这些功能的优化和稳定性,从而在高负载环境中降低性能瓶颈的风险,确保系统的整体稳定性。

总之,在 ABAP 中通过 C 语言将某些方法实现为内核模块,主要是为了最大限度地优化系统性能,直接访问底层资源,增强功能实现的能力,同时保障安全性和可维护性。

这些考虑使得 SAP 应用程序能够在高要求的企业环境中保持高效、稳定的运行,为复杂业务需求提供强有力的技术支撑。

汪子熙
企业管理软件领域开发专家
 最新文章