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 应用程序能够在高要求的企业环境中保持高效、稳定的运行,为复杂业务需求提供强有力的技术支撑。