ABAP Netweaver體內的那些寄生式編程語言

今天這篇文章的主題是:寄生。編程

Jerry最近看到朋友圈裏一位朋友分享的一張寄居蟹的照片,對於Jerry這種在內地長大的又很宅的人來講,沒有機會看到寄居蟹,因此以爲很新鮮:瀏覽器

寄居蟹主要以螺殼爲寄體,寄居的最大螺體直徑可達15釐米以上。其外形介於蝦和蟹之間,多數寄居於螺殼內。安全

另外一種比較出名的寄生生物,就是Jerry小時候在電視上看到的《異形》,這種生物經過卵生的方式降生,成爲下圖這種俗名叫抱臉蟲的二階形態後,經過口器管將異形幼蟲注入宿主體內,這樣抱臉蟲就完成了本身的使命,很少時便會死去。ruby


異形幼蟲在宿主體內發育約一天後,會從宿主體內破腔而出,經歷如蠶寶寶的幾回蛻皮後,成長爲徹底體。服務器

Jerry距離寄生式生物最近的一次,就是前年全家去西嶺雪山泡溫泉,當時看到有一個室外游泳池,立刻跳下去遊起來。異步

正遊得高興,透過泳鏡一看,一隻像頭髮絲同樣,長約十餘釐米的生物在Jerry斜前方的水裏蠕動,其運動軌跡明顯是一種生物,而不是普通的頭髮絲。編程語言

見多識廣的Jerry一會兒就辨認出,這是寄生在螳螂體內的鐵線蟲。小學時Jerry和小夥伴們曾經捕捉過螳螂來玩,把螳螂踩死後,曾親眼目擊體內的鐵線蟲鑽出來。函數

這種生物的防護力和它的名稱同樣,當時咱們用磚頭砸都砸不爛。spa

眼看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的原創文章,請關注公衆號"汪子熙":

相關文章
相關標籤/搜索