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

i042416發表於2019-08-24

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

Jerry最近看到朋友圈裡一位朋友分享的一張寄居蟹的照片,對於Jerry這種在內地長大的又很宅的人來說,沒有機會看到寄居蟹,所以覺得很新鮮:

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

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

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

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


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

異形幼蟲在宿主體內發育約一天後,會從宿主體內破腔而出,經歷如蠶寶寶的幾次蛻皮後,成長為完全體。

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

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

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

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

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

這種生物的防禦力和它的名稱一樣,當時我們用磚頭砸都砸不爛。

眼看Jerry馬上就要和它親密接觸了,嚇的Jerry馬上起水,再也不遊了。

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

鐵線蟲寄生在螳螂等節肢動物體內,到了產卵季節,就會控制著螳螂去一些靠近水源的地方,等宿主淹死之後,鐵線蟲從宿主體內鑽出來,在水裡產卵。這些卵或者孵出的幼蟲被其他節肢動物吞食後,就開始下一個寄生的迴圈。

至於鐵線蟲為什麼可以控制宿主的行動,至今科學家們也沒研究個所以然出來。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語言。

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

這個類於2000年2月建立,這個時間點Jerry還在讀高中,囧。

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

如果您想使用Netweaver裡這個JavaScript引擎操練操練ECMAScript 6.0規範裡定義的那些新特性,比如Class關鍵字,非同步操作和Async函式等,那Jerry覺得您應該是想多了,因為這個類已經明確標註為obsolete,因此SAP不建議使用在生產程式碼裡,風險自擔。

當然,執行包裡的報表SJSEU,把一些教科書上的JavaScript程式碼貼上進去玩玩,是沒有任何問題的。比如下面這段用JavaScript遞迴實現的整數階乘程式碼,

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

可以正常執行在ABAP Netweaver裡:

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

在Jerry看來,不存在必須在ABAP Netweaver裡執行JavaScript的場景。如果大家有基於JavaScript的應用需要和Netweaver裡的ABAP應用整合,SAP推薦的做法是把這些JavaScript應用部署在SAP Cloud Platform上。

Ruby

Jerry最開始使用Ruby,是2000年的《暗黑破壞神2》裡。

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

把品質各異的紅寶石鑲嵌到頭盔,鎧甲,武器和盾牌上,能獲得下表裡定義的各種屬性加成。

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

SAP Cloud for Customer的開發人員,想必在UI designer裡都編寫過Ruby程式碼:

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

Jerry第一次接觸C4C UI designer裡的Ruby程式碼時,覺得很新鮮:這些程式碼在執行時怎麼能夠被瀏覽器處理呢?

帶著這個好奇心,我開啟包含了這段Ruby程式碼的UI檢視,發現在編寫完畢Ruby程式碼後,儲存啟用時,Netweaver後臺會自動把這些Ruby程式碼轉換成對應的JavaScript程式碼,最後瀏覽器執行的當然就是後者,即轉換後的JavaScript程式碼。

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

也就是說,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(領域特定語言).

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

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程式碼的生成。

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

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的相關資訊:

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

在SAP內部的Netweaver伺服器上,我們是能夠檢視這些C/C++的原始碼的,只是我不能將這些程式碼貼出來:

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

希望這篇文章能夠給廣大ABAP從業者一些開闊了眼界的感覺,感謝閱讀。

要獲取更多Jerry的原創文章,請關注公眾號"汪子熙":


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


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24475491/viewspace-2654811/,如需轉載,請註明出處,否則將追究法律責任。

相關文章