今天這篇文章的主題是:寄生,。 Jerry最近看到朋友圈里一位朋友分享的一張寄居蟹的照片,,對(duì)于Jerry這種在內(nèi)陸長(zhǎng)大的又很宅的人來(lái)說(shuō),沒(méi)有機(jī)會(huì)看到寄居蟹,,所以覺(jué)得很新鮮: 寄居蟹主要以螺殼為寄體,,寄居的最大螺體直徑可達(dá)15厘米以上。其外形介于蝦和蟹之間,,多數(shù)寄居于螺殼內(nèi),。 另一種比較出名的寄生生物,就是Jerry小時(shí)候在電視上看到的《異形》,,這種生物通過(guò)卵生的方式降生,,成為下圖這種俗名叫抱臉蟲(chóng)的二階形態(tài)后,通過(guò)口器管將異形幼蟲(chóng)注入宿主體內(nèi),,這樣抱臉蟲(chóng)就完成了自己的使命,,不多時(shí)便會(huì)死去。 異形幼蟲(chóng)在宿主體內(nèi)發(fā)育約一天后,,會(huì)從宿主體內(nèi)破腔而出,,經(jīng)歷如蠶寶寶的幾次蛻皮后,成長(zhǎng)為完全體,。 Jerry距離寄生式生物最近的一次,,就是前年全家去西嶺雪山泡溫泉,當(dāng)時(shí)看到有一個(gè)室外游泳池,,馬上跳下去游起來(lái),。 正游得高興,透過(guò)泳鏡一看,,一只像頭發(fā)絲一樣,長(zhǎng)約十余厘米的生物在Jerry斜前方的水里蠕動(dòng),,其運(yùn)動(dòng)軌跡明顯是一種生物,,而不是普通的頭發(fā)絲。 見(jiàn)多識(shí)廣的Jerry一下子就辨認(rèn)出,,這是寄生在螳螂體內(nèi)的鐵線蟲(chóng),。小學(xué)時(shí)Jerry和小伙伴們?cè)?jīng)捕捉過(guò)螳螂來(lái)玩,把螳螂踩死后,,曾親眼目睹體內(nèi)的鐵線蟲(chóng)鉆出來(lái),。 這種生物的防御力和它的名稱一樣,,當(dāng)時(shí)我們用磚頭砸都砸不爛。 眼看Jerry馬上就要和它親密接觸了,,嚇的Jerry馬上起水,,再也不游了。 鐵線蟲(chóng)寄生在螳螂等節(jié)肢動(dòng)物體內(nèi),,到了產(chǎn)卵季節(jié),,就會(huì)控制著螳螂去一些靠近水源的地方,等宿主淹死之后,,鐵線蟲(chóng)從宿主體內(nèi)鉆出來(lái),,在水里產(chǎn)卵。這些卵或者孵出的幼蟲(chóng)被其他節(jié)肢動(dòng)物吞食后,,就開(kāi)始下一個(gè)寄生的循環(huán),。 至于鐵線蟲(chóng)為什么可以控制宿主的行動(dòng),至今科學(xué)家們也沒(méi)研究個(gè)所以然出來(lái),。Jerry在這里給廣大游泳愛(ài)好者提個(gè)醒,,到室外露天游泳池游泳時(shí),如果附近樹(shù)木茂盛,,最好還是提高警惕,,可以環(huán)顧游泳池四周有無(wú)節(jié)肢動(dòng)物的尸體,當(dāng)然不下水最安全,。 鐵線蟲(chóng)的圖片Jerry就不貼了,,非常惡心,好奇的朋友可以看看韓國(guó)電影《鐵線蟲(chóng)入侵》,,一部幻想的災(zāi)難片,。 平時(shí)大家提起SAP的Netweaver,總是習(xí)慣稱之為“SAP ABAP Netweaver”,,然而Netweaver內(nèi)部也存在一些寄生式的編程語(yǔ)言——絕大多數(shù)ABAP編程人員可能從未意識(shí)到它們的存在,。原因在于,盡管大多數(shù)的這些寄生式編程語(yǔ)言的名稱早已為大眾所熟知,,但它們實(shí)際上僅僅是ABAP Netweaver內(nèi)核里用C/C++實(shí)現(xiàn)的精簡(jiǎn)版的語(yǔ)言編譯和運(yùn)行環(huán)境,,并未直接開(kāi)發(fā)給ABAP開(kāi)發(fā)人員使用,或者已經(jīng)被標(biāo)注為obsolete. 下面就跟著Jerry來(lái)逐一了解一下吧,。 JavaScript在Netweaver里隱藏了這樣一個(gè)包:SJAVASCRIPT,,光看名字就知道它要干啥了。 Netweaver的C/C++內(nèi)核實(shí)現(xiàn)了一個(gè)微型的JavaScript引擎,,其接口通過(guò)ABAP類CL_JAVA_SCRIPT暴露,,可以讓ABAP開(kāi)發(fā)人員在Netweaver里編寫(xiě)和執(zhí)行JavaScript語(yǔ)言。 這個(gè)類于2000年2月創(chuàng)建,,這個(gè)時(shí)間點(diǎn)Jerry還在讀高中,,囧,。 如果您想使用Netweaver里這個(gè)JavaScript引擎操練操練ECMAScript 6.0規(guī)范里定義的那些新特性,比如Class關(guān)鍵字,,異步操作和Async函數(shù)等,,那Jerry覺(jué)得您應(yīng)該是想多了,因?yàn)檫@個(gè)類已經(jīng)明確標(biāo)注為obsolete,,因此SAP不建議使用在生產(chǎn)代碼里,,風(fēng)險(xiǎn)自擔(dān)。 當(dāng)然,,執(zhí)行包里的報(bào)表SJSEU,,把一些教科書(shū)上的JavaScript代碼粘貼進(jìn)去玩玩,是沒(méi)有任何問(wèn)題的,。比如下面這段用JavaScript遞歸實(shí)現(xiàn)的整數(shù)階乘代碼,, 可以正常運(yùn)行在ABAP Netweaver里: 在Jerry看來(lái),不存在必須在ABAP Netweaver里執(zhí)行JavaScript的場(chǎng)景,。如果大家有基于JavaScript的應(yīng)用需要和Netweaver里的ABAP應(yīng)用集成,,SAP推薦的做法是把這些JavaScript應(yīng)用部署在SAP Cloud Platform上。 RubyJerry最開(kāi)始使用Ruby,,是2000年的《暗黑破壞神2》里,。 把品質(zhì)各異的紅寶石鑲嵌到頭盔,鎧甲,,武器和盾牌上,,能獲得下表里定義的各種屬性加成。 SAP Cloud for Customer的開(kāi)發(fā)人員,,想必在UI designer里都編寫(xiě)過(guò)Ruby代碼: Jerry第一次接觸C4C UI designer里的Ruby代碼時(shí),,覺(jué)得很新鮮:這些代碼在運(yùn)行時(shí)怎么能夠被瀏覽器處理呢? 帶著這個(gè)好奇心,,我打開(kāi)包含了這段Ruby代碼的UI視圖,,發(fā)現(xiàn)在編寫(xiě)完畢Ruby代碼后,保存激活時(shí),,Netweaver后臺(tái)會(huì)自動(dòng)把這些Ruby代碼轉(zhuǎn)換成對(duì)應(yīng)的JavaScript代碼,,最后瀏覽器執(zhí)行的當(dāng)然就是后者,即轉(zhuǎn)換后的JavaScript代碼,。 也就是說(shuō),,SAP Cloud for Customer的Netweaver系統(tǒng)里,存在一個(gè)微型的Ruby解析器,。Jerry把這些觀察和研究寫(xiě)到了SAP社區(qū)的這篇博客里: Ruby Script in C4C Oberon View 因?yàn)镃4C后臺(tái)沒(méi)有對(duì)客戶和Partners開(kāi)發(fā),因此我無(wú)法像CL_JAVA_SCRIPT那樣,,貼出這個(gè)Ruby解析器的ABAP實(shí)現(xiàn)類的名稱和代碼,,不過(guò)其原理和CL_JAVA_SCRIPT一樣,,都是使用ABAP的關(guān)鍵字SYSTEM-CALL,調(diào)用ABAP內(nèi)核的Ruby接口,。 ABSL - ABAP Script LanguageNetweaver里的ABSL和前面介紹的兩種精簡(jiǎn)版語(yǔ)言引擎JavaScript和Ruby有所區(qū)別——ABSL是一門(mén)DSL-Domain Specific Language(領(lǐng)域特定語(yǔ)言). Wikipedia對(duì)領(lǐng)域特定語(yǔ)言的定義是“為了解決某一類任務(wù)而專門(mén)設(shè)計(jì)的計(jì)算機(jī)語(yǔ)言”,,Martin Fowler則認(rèn)為, 而ABSL,,則是SAP為了確保C4C partners能夠高效安全地在多租戶云上開(kāi)發(fā)自定義邏輯而設(shè)計(jì)出的一門(mén)寄生于ABAP Netweaver的領(lǐng)域特定語(yǔ)言。 我們?cè)贑loud Application Studio里編寫(xiě)完ABSL,,保存激活后,,ABAP Netweaver后臺(tái)就會(huì)自動(dòng)生成對(duì)應(yīng)的ABAP代碼。同之前介紹的JavaScript和Ruby一樣,,在C4C的ABAP Netweaver后臺(tái),,存在一個(gè)針對(duì)ABSL的語(yǔ)言解析器和編譯器來(lái)完成ABS對(duì)應(yīng)的ABAP代碼的生成。 C4C的運(yùn)行時(shí),,執(zhí)行的就是轉(zhuǎn)換后生成的ABAP代碼,。 Jerry 2011年還在SAP BYD部門(mén)工作時(shí),也曾經(jīng)參與過(guò)基于ABSL生成對(duì)應(yīng)的ABAP代碼的開(kāi)發(fā)工作,,當(dāng)時(shí)我所在的團(tuán)隊(duì)負(fù)責(zé)的任務(wù)是把Cloud Application Studio里編寫(xiě)的Application Exit ABSL代碼,,轉(zhuǎn)換成ABAP Netweaver里的BAdI模型和對(duì)應(yīng)的ABAP代碼。 最后再來(lái)說(shuō)說(shuō)C/C++. 人類是異形的宿主,,而C/C++則是ABAP的宿主,。這一點(diǎn)在Jerry之前的文章 聊聊C語(yǔ)言和ABAP里已經(jīng)闡述清楚了。 我們可以在F1喚出的ABAP幫助文檔里根據(jù)關(guān)鍵字“Kernel"查找出ABAP kernel的相關(guān)信息: 在SAP內(nèi)部的Netweaver服務(wù)器上,,我們是能夠查看這些C/C++的源代碼的,,只是我不能將這些代碼貼出來(lái): 希望這篇文章能夠給廣大ABAP從業(yè)者一些開(kāi)闊了眼界的感覺(jué),感謝閱讀,。 要獲取更多Jerry的原創(chuàng)文章,,請(qǐng)關(guān)注公眾號(hào)"汪子熙": |
|