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

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

ABAP Netweaver体内的那些寄生式编程语言的更多相关文章

  1. 从ABAP Netweaver的SICF到SAP Kyma的Lambda Function

    ABAP Netweaver里的事务码SICF是Jerry做原型开发时非常喜欢使用的一个工具:但凡遇到需要把ABAP系统里的资源以服务的方式暴露出来的场景,Jerry都喜欢在SICF里创建一个服务节点 ...

  2. js继承精益求精之寄生式组合继承

    一.混合/组合继承的不足 上一篇JS继承终于混合继承,认真思考一下,发现其还是有不足之处的: 空间上的冗余:在使用原型链的方法继承父类的原型属性(Animal.prototype)的同时,也在子类的原 ...

  3. JavaScript ----------------- 寄生式继承

    寄生式继承 寄生式继承是于原型式继承紧密相关的一种思路.寄生式基础的思路与寄生构造函数和工厂模式类似,既创建一个仅用于封装继承过程的函数,该函数内部以某种方式来增强对象,最后再像真地是它做了所有工作一 ...

  4. JavaScript继承基础讲解,原型链、借用构造函数、混合模式、原型式继承、寄生式继承、寄生组合式继承

    说好的讲解JavaScript继承,可是迟迟到现在讲解.废话不多说,直接进入正题. 既然你想了解继承,证明你对JavaScript面向对象已经有一定的了解,如还有什么不理解的可以参考<面向对象J ...

  5. JS学习笔记——JavaScript继承的6种方法(原型链、借用构造函数、组合、原型式、寄生式、寄生组合式)

    JavaScript继承的6种方法 1,原型链继承 2,借用构造函数继承 3,组合继承(原型+借用构造) 4,原型式继承 5,寄生式继承 6,寄生组合式继承 1.原型链继承. <script t ...

  6. [js高手之路]原型式继承与寄生式继承

    一.原型式继承本质其实就是个浅拷贝,以一个对象为模板复制出新的对象 function object( o ){ var G = function(){}; G.prototype = o; retur ...

  7. Javascript继承5:如虎添翼----寄生式继承

    /* * 寄生式继承 * 其实就是对原型继承的第二次封装,在封装过程中对继承的对象进行了扩展. * 也存在原型继承的缺点!! * 这种思想的作用也是为了寄生组合式继承模式的实现. */ //声明基对象 ...

  8. ABAP Netweaver和Hybris里获得内存使用统计数据

    ABAP Netweaver 事物码ST06 Hybris 每隔5秒钟,Hybris Administration console会发起一个到Java后台的AJAX查询请求: 这个5秒的时间间隔定义在 ...

  9. ABAP Netweaver和Hybris Enterprise Commerce Platform的登录认证

    ABAP Netweaver 在我的博客Learn more detail about Standard logon procedure里有详细介绍. Hybris ECP Hybris Admini ...

随机推荐

  1. IDEA使用tomcat插件

    在实际项目开发中,特别是分布式项目,往往有N多个子项目需要同时启动测试. 这一切靠本地安装的tomcat是远远不够的,而且繁琐. 这里就需要用到tomca插件. 在pom.xml中引入: <bu ...

  2. STL补充--set集合相等判断

    一:问题引出 #include <iostream> #include <map> #include <set> using namespace std; map& ...

  3. 使用origin画SCI论文图

    使用origin画SCI论文图 觉得有用的话,欢迎一起讨论相互学习~Follow Me start 使用的是OriginPro这款软件,这款软件的特点是 一个字 好 . 新建工作簿并导入数据 可以使用 ...

  4. Python - Django - session 的基本使用

    urls.py: from django.conf.urls import url from app02 import views urlpatterns = [ # app02 url(r'^app ...

  5. FileZilla下载文件失败

    之前一直可以下载文件,突然某天下载报错, 方法一:修改本地站点

  6. Navicat Premium教程

    介绍 Navicat premium是一款数据库管理工具,是一个可多重连线资料库的管理工具,它可以让你以单一程式同时连线到 MySQL.SQLite.Oracle 及 PostgreSQL 资料库,让 ...

  7. Qt563x86vs2015.编译错误(TypeError: Property 'asciify' of object Core::Internal::UtilsJsExtension(0x????????) is not a function)

    1.在 编译或打开 pro时 有时会有这个错误 1.1.参考网址:Qt 编译错误 提示TypeError_ Property 'asciify' of object Core__Internal__U ...

  8. SpringBoot项目集成PageHelper使用

    SpringBoot项目集成PageHelper使用 一.开始 ​ 地址:https://github.com/pagehelper/Mybatis-PageHelper ​ 在spring boot ...

  9. Android中使用LitePal操控SQLite数据库

    <第一行代码>读书手札 (一)什么是LitePal数据库 LitePal数据库是安卓的一个开源库,我们在以后的开发中,将会遇到许许多多的开源库,感谢开源社 区:因为开源社区的存在,一些我们 ...

  10. luoguP1823 [COI2007] Patrik 音乐会的等待

    题目描述 N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人.队列中任意两个人A和B,如果他们是相邻或他们之间没有人比A或B高,那么他们是可以互相看得见的. ...