今天這篇文章的主題是:寄生。
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從業者一些開闊了眼界的感覺,感謝閱讀。