乐趣区

ABAP-Netweaver体内的那些寄生式编程语言

今天这篇文章的主题是:寄生。

Jerry 最近看到朋友圈里一位朋友分享的一张寄居蟹的照片,对于 Jerry 这种在内地长大的又很宅的人来说,没有机会看到寄居蟹,所以觉得很新鲜:

寄居蟹主要以螺壳为寄体,寄居的最大螺体直径可达 15 厘米以上。其外形介于虾和蟹之间,多数寄居于螺壳内。

另一种比较出名的寄生生物,就是 Jerry 小时候在电视上看到的《异形》,这种生物通过卵生的方式降生,成为下图这种俗名叫抱脸虫的二阶形态后,通过口器管将异形幼虫注入宿主体内,这样抱脸虫就完成了自己的使命,不多时便会死去。


异形幼虫在宿主体内发育约一天后,会从宿主体内破腔而出,经历如蚕宝宝的几次蜕皮后,成长为完全体。

Jerry 距离寄生式生物最近的一次,就是前年全家去西岭雪山泡温泉,当时看到有一个室外游泳池,马上跳下去游起来。

正游得高兴,透过泳镜一看,一只像头发丝一样,长约十余厘米的生物在 Jerry 斜前方的水里蠕动,其运动轨迹明显是一种生物,而不是普通的头发丝。

见多识广的 Jerry 一下子就辨认出,这是寄生在螳螂体内的铁线虫。小学时 Jerry 和小伙伴们曾经捕捉过螳螂来玩,把螳螂踩死后,曾亲眼目睹体内的铁线虫钻出来。

这种生物的防御力和它的名称一样,当时我们用砖头砸都砸不烂。

眼看 Jerry 马上就要和它亲密接触了,吓的 Jerry 马上起水,再也不游了。

铁线虫寄生在螳螂等节肢动物体内,到了产卵季节,就会控制着螳螂去一些靠近水源的地方,等宿主淹死之后,铁线虫从宿主体内钻出来,在水里产卵。这些卵或者孵出的幼虫被其他节肢动物吞食后,就开始下一个寄生的循环。

至于铁线虫为什么可以控制宿主的行动,至今科学家们也没研究个所以然出来。Jerry 在这里给广大游泳爱好者提个醒,到室外露天游泳池游泳时,如果附近树木茂盛,最好还是提高警惕,可以环顾游泳池四周有无节肢动物的尸体,当然不下水最安全。

铁线虫的图片 Jerry 就不贴了,非常恶心,好奇的朋友可以看看韩国电影《铁线虫入侵》,一部幻想的灾难片。

平时大家提起 SAP 的 Netweaver,总是习惯称之为“SAP ABAP Netweaver”,然而 Netweaver 内部也存在一些寄生式的编程语言——绝大多数 ABAP 编程人员可能从未意识到它们的存在。原因在于,尽管大多数的这些寄生式编程语言的名称早已为大众所熟知,但它们实际上仅仅是 ABAP Netweaver 内核里用 C /C++ 实现的精简版的语言编译和运行环境,并未直接开发给 ABAP 开发人员使用,或者已经被标注为 obsolete.

下面就跟着 Jerry 来逐一了解一下吧。

JavaScript

在 Netweaver 里隐藏了这样一个包:SJAVASCRIPT,光看名字就知道它要干啥了。

Netweaver 的 C /C++ 内核实现了一个微型的 JavaScript 引擎,其接口通过 ABAP 类 CL_JAVA_SCRIPT 暴露,可以让 ABAP 开发人员在 Netweaver 里编写和执行 JavaScript 语言。

这个类于 2000 年 2 月创建,这个时间点 Jerry 还在读高中,囧。

如果您想使用 Netweaver 里这个 JavaScript 引擎操练操练 ECMAScript 6.0 规范里定义的那些新特性,比如 Class 关键字,异步操作和 Async 函数等,那 Jerry 觉得您应该是想多了,因为这个类已经明确标注为 obsolete,因此 SAP 不建议使用在生产代码里,风险自担。

当然,执行包里的报表 SJSEU,把一些教科书上的 JavaScript 代码粘贴进去玩玩,是没有任何问题的。比如下面这段用 JavaScript 递归实现的整数阶乘代码,

可以正常运行在 ABAP Netweaver 里:

在 Jerry 看来,不存在必须在 ABAP Netweaver 里执行 JavaScript 的场景。如果大家有基于 JavaScript 的应用需要和 Netweaver 里的 ABAP 应用集成,SAP 推荐的做法是把这些 JavaScript 应用部署在 SAP Cloud Platform 上。

Ruby

Jerry 最开始使用 Ruby,是 2000 年的《暗黑破坏神 2》里。

把品质各异的红宝石镶嵌到头盔,铠甲,武器和盾牌上,能获得下表里定义的各种属性加成。

SAP Cloud for Customer 的开发人员,想必在 UI designer 里都编写过 Ruby 代码:

Jerry 第一次接触 C4C UI designer 里的 Ruby 代码时,觉得很新鲜:这些代码在运行时怎么能够被浏览器处理呢?

带着这个好奇心,我打开包含了这段 Ruby 代码的 UI 视图,发现在编写完毕 Ruby 代码后,保存激活时,Netweaver 后台会自动把这些 Ruby 代码转换成对应的 JavaScript 代码,最后浏览器执行的当然就是后者,即转换后的 JavaScript 代码。

也就是说,SAP Cloud for Customer 的 Netweaver 系统里,存在一个微型的 Ruby 解析器。Jerry 把这些观察和研究写到了 SAP 社区的这篇博客里:

Ruby Script in C4C Oberon View
https://blogs.sap.com/2017/07…

因为 C4C 后台没有对客户和 Partners 开发,因此我无法像 CL_JAVA_SCRIPT 那样,贴出这个 Ruby 解析器的 ABAP 实现类的名称和代码,不过其原理和 CL_JAVA_SCRIPT 一样,都是使用 ABAP 的关键字 SYSTEM-CALL,调用 ABAP 内核的 Ruby 接口。

ABSL – ABAP Script Language

Netweaver 里的 ABSL 和前面介绍的两种精简版语言引擎 JavaScript 和 Ruby 有所区别——ABSL 是一门 DSL-Domain Specific Language(领域特定语言).

Wikipedia 对领域特定语言的定义是“为了解决某一类任务而专门设计的计算机语言”,Martin Fowler 则认为,
“DSL 通过在表达能力上做的妥协换取在某一领域内的高效”。

而 ABSL,则是 SAP 为了确保 C4C partners 能够高效安全地在多租户云上开发自定义逻辑而设计出的一门寄生于 ABAP Netweaver 的领域特定语言。

我们在 Cloud Application Studio 里编写完 ABSL,保存激活后,ABAP Netweaver 后台就会自动生成对应的 ABAP 代码。同之前介绍的 JavaScript 和 Ruby 一样,在 C4C 的 ABAP Netweaver 后台,存在一个针对 ABSL 的语言解析器和编译器来完成 ABS 对应的 ABAP 代码的生成。

C4C 的运行时,执行的就是转换后生成的 ABAP 代码。

Jerry 2011 年还在 SAP BYD 部门工作时,也曾经参与过基于 ABSL 生成对应的 ABAP 代码的开发工作,当时我所在的团队负责的任务是把 Cloud Application Studio 里编写的 Application Exit ABSL 代码,转换成 ABAP Netweaver 里的 BAdI 模型和对应的 ABAP 代码。

最后再来说说 C /C++. 人类是异形的宿主,而 C /C++ 则是 ABAP 的宿主。这一点在 Jerry 之前的文章 聊聊 C 语言和 ABAP 里已经阐述清楚了。

我们可以在 F1 唤出的 ABAP 帮助文档里根据关键字“Kernel” 查找出 ABAP kernel 的相关信息:

在 SAP 内部的 Netweaver 服务器上,我们是能够查看这些 C /C++ 的源代码的,只是我不能将这些代码贴出来:

希望这篇文章能够给广大 ABAP 从业者一些开阔了眼界的感觉,感谢阅读。

要获取更多 Jerry 的原创文章,请关注公众号 ” 汪子熙 ”:

退出移动版