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/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從業者一些開闊了眼界的感覺,感謝閱讀。
ABAP
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。