文档章节

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

JerryWang_SAP
 JerryWang_SAP
发布于 08/24 15:53
字数 2100
阅读 2
收藏 0

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

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/29/ruby-script-in-c4c-oberon-view/

因为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的原创文章,请关注公众号"汪子熙":

© 著作权归作者所有

JerryWang_SAP
粉丝 24
博文 688
码字总数 559157
作品 0
深圳
程序员
私信 提问
在SAP云平台ABAP编程环境上编写第一段ABAP程序

距2017年秋季的SAP TechEd大会上一位大佬Björn Goerke,SAP’s Chief Technology Officer宣布了SAP Cloud Platform即将支持ABAP至今,已经过去了两年的时间。 目前国内的技术媒体平台上,已...

JerryWang_SAP
07/03
10
0
Salesforce和SAP Netweaver里数据库表的元数据设计

从Salesforce官网可以了解到Salesforce的force.com平台里数据库表的设计:https://developer.salesforce.com/page/MultiTenantArchitecture Every logical database object that Force.com ......

JerryWang_SAP
02/15
8
0
你的ABAP程序给佛祖开过光么?来试试Jerry这个小技巧

最近Jerry在忙一个项目,技术栈换成了nodejs平台,语言换成了JavaScript,因为赶项目进度,一直没时间更新公众号。感谢大家的支持,关注人数还是慢慢地增长到了3000。 今天我们来聊聊一个比较...

JerryWang_SAP
03/10
32
1
使用Visual Studio Code编写和激活ABAP代码 (上)

猪年春节后的第一篇,Jerry祝各位猪年大吉! 2019年的六分之一马上就快过完了,不知道大家在新的一年是否给自己定了新的小目标呢?这里Jerry先预祝大家到2019年年底的时候,在年初制定的小目标...

JerryWang_SAP
02/24
15
0
SAP R/3系统的R和3分别代表什么含义,负载均衡的实现原理

1972年,SAP诞生,推出了RF系统(实时财务会计系统), 后来命名为R1。 R指Real time。3既指第三代系统,又代表3层架构。 三层架构分别为下图的Presentation server Layer,Application server ...

JerryWang_SAP
02/15
1
0

没有更多内容

加载失败,请刷新页面

加载更多

shangcheng-my

1.数据库主键、外键类型为bigint,那么在后台应该用什么类型的变量定义? 后台用string接收,因为前段传过来的一般都是json字符串,后台直接接收,mysql是可以吧数字类型的字符串转换为对应的...

榴莲黑芝麻糊
昨天
4
0
微服务架构依赖图

基于spring-cloud-alibaba + dubbo

龙影
昨天
5
0
Centos7 安装zabbix-agent

rpm -i https://repo.zabbix.com/zabbix/4.2/rhel/6/x86_64/zabbix-release-4.2-2.el6.noarch.rpm 可以到https://repo.zabbix.com/zabbix找到对应的版本 yum install zabbix-agent -y 出现E......

abowu
昨天
8
0
文本编辑器GNU nano 4.4 发布

GNU nano 4.4 "Hagelslag" 更新日志: 启动时,光标可以放在第一个或最后一个出现位置 字符串前面带有+/string 或 +?string的字符串。 发生自动硬包装时((--breaklonglines),任何前导引号...

linuxCool
昨天
7
0
你知道字节序吗

字节序 最近在调一个自定义报文的接口时,本来以为挺简单的,发现踩了好几个坑,其中一个比较“刻骨铭心”的问题就是数据的字节序问题。 背景 自定义报文,调用接口,服务端报文解析失败 iO...

杭城小刘
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部