多宿主語(yǔ)言、跨平臺(tái)平部署的開(kāi)源圖形化腳本語(yǔ)言-OpenBlock
想了解更多內(nèi)容,請(qǐng)?jiān)L問(wèn):
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)
近期在OpenAtom OpenHarmony(簡(jiǎn)稱“OpenHarmony”)開(kāi)發(fā)者圈中,幾個(gè)演示視頻引起了廣泛關(guān)注,視頻中的演示程序成功運(yùn)行在了PC的瀏覽器、微信小程序和OpenHarmony的開(kāi)發(fā)板這三個(gè)環(huán)境中。讓人驚訝的是,這個(gè)項(xiàng)目的開(kāi)發(fā)工具是通過(guò)部署在網(wǎng)頁(yè)端類似Scratch的Web端IDE工具完成的!視頻畫(huà)面中程序運(yùn)行穩(wěn)定且流暢,具有相當(dāng)高的完成度。帶著好奇心,我們找到了視頻的發(fā)布者杜天微,一位住在老北京胡同里的開(kāi)源貢獻(xiàn)者。
視頻中演示的項(xiàng)目是通過(guò)OpenBlock編寫的,目前已經(jīng)開(kāi)源。知道OpenBlock還是在開(kāi)放原子開(kāi)源基金會(huì)的交流群中,彼時(shí)了解到OpenBlock是開(kāi)源項(xiàng)目OpenHarmony下的一個(gè)SIG(Special Interest Group),SIG的發(fā)起人很喜歡在微信群中與開(kāi)發(fā)者深入探討問(wèn)題。記得有一次,在OpenBlock SIG的微信群中有人提及近期火熱的“元宇宙”這一概念,杜天微與話題的參與者們進(jìn)行了三個(gè)多小時(shí)的探討。其他參與者因?yàn)闀r(shí)間太晚不得不休息了,杜天微仍然獨(dú)自一人在闡述自己對(duì)這一新興技術(shù)領(lǐng)域的觀點(diǎn),直至凌晨4點(diǎn)多仍意猶未盡……
什么是OpenBlock?
OpenBlock希望通過(guò)將編程簡(jiǎn)化、將業(yè)務(wù)邏輯可視化的一門圖形化編程語(yǔ)言,語(yǔ)言特性上有Erlang和 Smalltalk 的影子,語(yǔ)法層面借鑒了Scratch,使用Blockly作為語(yǔ)言前端。像很多高級(jí)語(yǔ)言一樣,OpenBlock擁有獨(dú)立的編譯器、鏈接器和運(yùn)行時(shí)(OpenBlockVM),提供了簡(jiǎn)單易用的IDE工具。
設(shè)計(jì)師、產(chǎn)品經(jīng)理、運(yùn)營(yíng)人員、行政、財(cái)務(wù)、人力資源等非程序員角色可以通過(guò)簡(jiǎn)單易用的圖形化編程提升工作效率;成熟的項(xiàng)目開(kāi)發(fā)團(tuán)隊(duì)中的非程序員角色也可以通過(guò)OpenBlock語(yǔ)言支撐商業(yè)項(xiàng)目的開(kāi)發(fā)。
從使用人群和語(yǔ)言定位來(lái)說(shuō),OpenBlock并沒(méi)有可以參考的成熟語(yǔ)言。OpenBlock追求語(yǔ)言極強(qiáng)的易用性和商業(yè)項(xiàng)目的開(kāi)發(fā)能力,定位為適用范圍廣泛的、面向非程序員群體的圖形化腳本語(yǔ)言。在當(dāng)前主流的語(yǔ)言中并無(wú)同時(shí)關(guān)注這兩點(diǎn)的先例,Scratch實(shí)現(xiàn)了面向非程序員群體,但對(duì)完整項(xiàng)目的開(kāi)發(fā)缺乏基礎(chǔ)支持,而能夠支撐完整項(xiàng)目開(kāi)發(fā)的主流編程語(yǔ)言需要較高的學(xué)習(xí)成本,無(wú)法面向非程序員群體。
OpenBlock有哪些技術(shù)特性?
為了平衡易用性和商業(yè)項(xiàng)目開(kāi)發(fā)能力,OpenBlock在語(yǔ)言設(shè)計(jì)上做了必要取舍,也包含了關(guān)鍵性創(chuàng)新。這些特性飽含了OpenBlock團(tuán)隊(duì)這些年來(lái)的思考和探索。
面向“狀態(tài)機(jī)”編程
與主流語(yǔ)言的“面向?qū)ο缶幊?rdquo;不同,OpenBlock是面向“狀態(tài)機(jī)編程”。目前只有微軟正在孵化的P語(yǔ)言采用了這種設(shè)計(jì)。“狀態(tài)機(jī)”是OpenBlock語(yǔ)言中一個(gè)非常關(guān)鍵的概念。它的概念非常簡(jiǎn)單,遵從一個(gè)簡(jiǎn)單的運(yùn)行規(guī)則:在當(dāng)前狀態(tài)的邏輯中決定是否要切換到其他狀態(tài)。當(dāng)“狀態(tài)機(jī)”可切換的狀態(tài)被限定,僅有有限的幾個(gè)可切換狀態(tài)時(shí)就是“有限狀態(tài)機(jī)”。有限狀態(tài)機(jī)普遍存在于我們現(xiàn)實(shí)生活中,譬如說(shuō)門的狀態(tài)僅限于開(kāi)和關(guān)兩種。
圖形化交互
有別于主流的文本語(yǔ)言,OpenBlock使用Blockly作為前端語(yǔ)言,圖形化代碼語(yǔ)句,并通過(guò)圖像與使用者交互。比如OpenBlock可以把狀態(tài)機(jī)的狀態(tài)轉(zhuǎn)換以圖表的形式在IDE中展現(xiàn)出來(lái),這在主流文本的語(yǔ)言里,通常是沒(méi)有的。
支持多宿主語(yǔ)言、可跨平臺(tái)部署
OpenBlock在設(shè)計(jì)上就考慮了可移植性,通過(guò)宿主語(yǔ)言來(lái)實(shí)現(xiàn)跨平臺(tái)。在語(yǔ)言設(shè)計(jì)上,OpenBlock最小化了系統(tǒng)庫(kù),保留了數(shù)據(jù)操作相關(guān)的系統(tǒng)庫(kù);使用小型指令集,指令數(shù)量預(yù)計(jì)限制在100個(gè)左右;使用宿主語(yǔ)言的運(yùn)行時(shí),可以利用任何可用的宿主語(yǔ)言的特性。這使得OpenBlock在跨平臺(tái)部署時(shí)不需要繁復(fù)的開(kāi)發(fā)。
支持高并發(fā)、多線程
在OpenBlock中,狀態(tài)機(jī)之間不存在方法調(diào)用,只能通發(fā)送可跨運(yùn)行時(shí)傳輸?shù)南?lái)完成數(shù)據(jù)傳遞。因?yàn)闆](méi)有方法調(diào)用,OpenBlock可以在多線程、高并發(fā)的環(huán)境下運(yùn)行。我們可以把VM當(dāng)做Actor,在服務(wù)器集群中創(chuàng)建成千上萬(wàn)個(gè)VM實(shí)例,每個(gè)VM里放業(yè)務(wù)緊密相關(guān)的狀態(tài)機(jī)。所有的VM放在一個(gè)線程組里運(yùn)行。只要保證每個(gè)VM不同時(shí)出現(xiàn)在多個(gè)線程中調(diào)用,就可以保證數(shù)據(jù)的線程安全,從而實(shí)現(xiàn)高并發(fā)。而從單線程到多線程的處理,只是在與框架集成的代碼中提供支持就可以了。
低耦合,業(yè)務(wù)拆解難度低
在面相對(duì)象編程時(shí),我們?nèi)绾卧O(shè)計(jì)一個(gè)打坦克的游戲呢?最直觀的想法是將坦克封裝成一個(gè)高度聚合的類,在一個(gè)類里處理全部的坦克控制邏輯。當(dāng)業(yè)務(wù)變得復(fù)雜,我們就會(huì)拆分出移動(dòng)控制類、火炮系統(tǒng)、生命系統(tǒng)等組件,但是對(duì)外仍然暴露聚合的坦克接口。無(wú)論怎么拆分,這個(gè)聚合的接口都會(huì)與其他系統(tǒng)發(fā)生耦合。
OpenBlock面相狀態(tài)機(jī)編程從根本上打破了這個(gè)過(guò)程。首先我們并不認(rèn)為坦克是一個(gè)整體,而是由一組分別運(yùn)行的狀態(tài)機(jī)組成,每個(gè)狀態(tài)機(jī)對(duì)應(yīng)一組獨(dú)立運(yùn)行的業(yè)務(wù):生命行為、火炮行為、移動(dòng)行為。各個(gè)行為是獨(dú)立的狀態(tài)機(jī),可以在不同的狀態(tài)進(jìn)行切換,對(duì)外沒(méi)有暴露任何實(shí)際interface代碼。而是通過(guò)把這些狀態(tài)機(jī)捆綁為一個(gè)坦克實(shí)體,共同接收坦克上發(fā)生的所有事件和收到的消息,分別處理實(shí)現(xiàn)自己的邏輯,完成業(yè)務(wù)上的整合。而不同的狀態(tài)機(jī)之間,只有約定的消息,沒(méi)有固定的接口,所以在代碼層面是沒(méi)有實(shí)際的耦合的,要替換組件非常的容易。
為什么選擇了開(kāi)源?
作為編程語(yǔ)言,我覺(jué)得想讓它發(fā)展起來(lái)就要生態(tài)化運(yùn)作,這不是一門簡(jiǎn)單是生意。語(yǔ)言不做生態(tài)就沒(méi)人用,沒(méi)人用就是死水一潭。要想搞活,就要開(kāi)源,這也是幾乎所有主流語(yǔ)言的統(tǒng)一做法。大公司都把編程語(yǔ)言開(kāi)源,自己去做生態(tài)的生意,而小公司沒(méi)有人力,沒(méi)有財(cái)力,還想生存下去,沒(méi)有理由不開(kāi)源。
也許20年前,一個(gè)新生的編程語(yǔ)言可以依靠小體量的業(yè)務(wù)生存下去,但是今天,肯定不行。我將OpenBlock捐獻(xiàn)給開(kāi)放原子開(kāi)源基金會(huì),也是希望借助開(kāi)放原子開(kāi)源基金會(huì)的開(kāi)源社區(qū)運(yùn)營(yíng)經(jīng)驗(yàn)來(lái)提升項(xiàng)目影響力、擴(kuò)大項(xiàng)目應(yīng)用領(lǐng)域、獲得更廣泛的支持,讓OpenBlock能夠繼續(xù)發(fā)展下去。
目前OpenBlock的商業(yè)實(shí)踐有哪些?目前是否獲得了一定的商業(yè)成功?
商業(yè)上,目前OpenBlock實(shí)踐并不多,主要是因?yàn)樗耐瓿啥冗€不是很高。
目前,跟北京大學(xué)有個(gè)VR編輯器的項(xiàng)目,是面向非技術(shù)學(xué)科的研究生做科普教育的。也有使用OpenBlock開(kāi)發(fā)的商業(yè)App,目前已經(jīng)上線運(yùn)營(yíng)一年多了。最近,我們正在跟一家游戲公司合作開(kāi)發(fā)商業(yè)游戲。
因?yàn)樯婕暗讲糠稚虡I(yè)內(nèi)容,就不過(guò)多透露了,目前這些項(xiàng)目對(duì)于一個(gè)早期的編程語(yǔ)言來(lái)說(shuō)已經(jīng)是很好的成績(jī)了。
在這些領(lǐng)域中,OpenBlock絕對(duì)不是用來(lái)解決技術(shù)問(wèn)題的,它解決的是業(yè)務(wù)邏輯的問(wèn)題。以Unity游戲研發(fā)為例,程序員通過(guò)C#寫的代碼在iOS上是不能更新的,所以引入一個(gè)Lua,所有的游戲代碼使用Lua來(lái)寫,用Lua去調(diào)用C#的東西,這才把C#帶入到iOS,這些全是程序員在編寫。OpenBlock相較于Lua來(lái)說(shuō)嚴(yán)格區(qū)分了技術(shù)和業(yè)務(wù),原來(lái)是程序員寫Lua,現(xiàn)在換成策劃在寫OpenBlock,程序底層的基礎(chǔ)部分仍然使用C#來(lái)寫。業(yè)務(wù)是業(yè)務(wù),技術(shù)是技術(shù),這樣的明確分開(kāi)后能夠讓技術(shù)人員專注于基于C#的具體業(yè)務(wù)實(shí)現(xiàn),也能讓策劃人員更好地通過(guò)OpenBlock表達(dá)出明晰的業(yè)務(wù)邏輯。
您認(rèn)為OpenBlock未來(lái)會(huì)在哪個(gè)領(lǐng)域大放異彩?
未來(lái),我希望OpenBlock能夠?qū)崿F(xiàn)全民編程。
就像抖音在視頻領(lǐng)域里做的一樣,把拍攝、剪輯、發(fā)布從專業(yè)級(jí)做到了全民級(jí)。我希望未來(lái)每個(gè)人都可以用OpenBlock解決自己面對(duì)的任何問(wèn)題,比如批量處理龐大的Excel數(shù)據(jù)、處理大數(shù)量級(jí)的郵件、管理家里的物聯(lián)網(wǎng)設(shè)備等;在幼兒編程領(lǐng)域使用OpenBlock制作可交互的幻燈片和小游戲;在商業(yè)領(lǐng)域能夠支撐商業(yè)級(jí)的APP的開(kāi)發(fā)等等。
OpenBlock本身的可拓展性比較高,也是比較新的開(kāi)源項(xiàng)目,未來(lái)走向何方具有不確定性,這些領(lǐng)域和場(chǎng)景只是基于OpenBlock現(xiàn)有的實(shí)踐作出的構(gòu)想。
目前很多服務(wù)平臺(tái)都提供了圖形化開(kāi)發(fā)的能力,通過(guò)鼠標(biāo)拖拽就能夠完成開(kāi)發(fā),OpenBlock有什么優(yōu)勢(shì)呢?
這種低代碼開(kāi)發(fā)的東西其實(shí)特別多,它多是以業(yè)務(wù)模塊來(lái)組合的,當(dāng)遇到非標(biāo)準(zhǔn)型業(yè)務(wù)的時(shí)候,這類型的低代碼開(kāi)發(fā)就無(wú)能為力了。歸根結(jié)底就是這類平臺(tái)不具有創(chuàng)造力,而開(kāi)發(fā)人員面對(duì)的大部分企業(yè)業(yè)務(wù)需求都具有自己的一些不能被低代碼開(kāi)發(fā)平臺(tái)滿足的特性。這種平臺(tái)只能造杯子,頂多DIY一下杯身、杯蓋、杯墊的樣式,并不能創(chuàng)造出一個(gè)帶加熱和保溫功能的杯子,加熱和保溫就是這類平臺(tái)不具備、需要開(kāi)發(fā)人員單獨(dú)開(kāi)發(fā)的功能。
而OpenBlock是你隨手就可以作做出一些貼合場(chǎng)景的東西來(lái),不管你面對(duì)的場(chǎng)景是什么。雖然我做不了太多,但我什么都能做點(diǎn),今天想開(kāi)發(fā)一個(gè)微信小程序在移動(dòng)端跑,明天想做一個(gè)網(wǎng)頁(yè)在PC端跑,后天還想控制一下家里的家電在開(kāi)發(fā)板上跑,這些事兒都能通過(guò)OpenBlock這一種語(yǔ)言來(lái)實(shí)現(xiàn)。
未來(lái)OpenBlock開(kāi)源項(xiàng)目還會(huì)做哪些事情?向哪個(gè)方向努力?
未來(lái)OpenBlock會(huì)不斷完善功能,主要在向使用者表達(dá)方面做更多努力。
為了提高編程效率,也會(huì)支持文本編程的形式,但仍然以圖形方式做反饋。最初的接觸到OpenBlock的開(kāi)發(fā)者很難理解把OpenBlock定義為語(yǔ)言這件事,所有人都會(huì)覺(jué)得編程語(yǔ)言就是在那敲代碼。有這種認(rèn)知的人并不知道世界上有大量的小學(xué)生在用Scratch這種東西,它也是一種語(yǔ)言。雖然,Scratch在成年人的眼里就是小孩玩具,但是它背后蘊(yùn)含的教育原理是深刻的。它真的不能研發(fā)產(chǎn)品,它本身就是一個(gè)非常完美的產(chǎn)品,迄今為止,我沒(méi)有看到任何在編程語(yǔ)言在科普項(xiàng)目領(lǐng)域能夠超越它。在OpenBlock上引入文本編碼形式并不是在迎合這種偏見(jiàn),只是純粹想提升深度使用者的編程效率。深化圖形反饋是OpenBlock根上的東西,未來(lái)很長(zhǎng)一段時(shí)間都會(huì)做持續(xù)優(yōu)化。
另外,OpenBlock會(huì)使用更多的語(yǔ)言實(shí)現(xiàn)運(yùn)行時(shí),首當(dāng)其沖的就是C 語(yǔ)言。按照OpenBlock的設(shè)計(jì),將來(lái)會(huì)選擇性的實(shí)現(xiàn)一些語(yǔ)言的運(yùn)行時(shí),并不會(huì)涵蓋所有。最初OpenBlock的研發(fā)考慮了VM的實(shí)現(xiàn)問(wèn)題,C# 和 JS 環(huán)境支持最全面,實(shí)現(xiàn)VM相對(duì)容易,且適用范圍也很廣,所以會(huì)優(yōu)先適配這兩個(gè)語(yǔ)言。考慮到C/C語(yǔ)言被廣泛使用,接下來(lái)的重要工作是適配C/C語(yǔ)言,同時(shí)也可以進(jìn)一步拓寬OpenBlock的應(yīng)用范圍。
目前項(xiàng)目有多少人參與?急需哪方面的開(kāi)發(fā)者參與共建?
目前項(xiàng)目已經(jīng)有除我以外的開(kāi)發(fā)者加入了,同時(shí)開(kāi)發(fā)文檔搭建這部分已經(jīng)有在校的教師和大學(xué)生參與共建了。
OpenBlock迫切需要一些JS和前端的開(kāi)發(fā)者參與到項(xiàng)目共建中來(lái),除此之外沒(méi)有其他的要求。對(duì)一個(gè)新生的項(xiàng)目組來(lái)說(shuō),即使有開(kāi)發(fā)者能夠使用OpenBlock做一些小作品,能夠參與文檔共建都是不錯(cuò)的開(kāi)始。
于我而言比較困難的就是我沒(méi)有組織過(guò)社區(qū)的經(jīng)驗(yàn),開(kāi)發(fā)者進(jìn)入項(xiàng)目中來(lái),我還不知道能不能組織好協(xié)作,這部分前期還需要開(kāi)放原子開(kāi)源基金會(huì)的幫助。
您認(rèn)為國(guó)內(nèi)的開(kāi)源環(huán)境會(huì)受到哪些挑戰(zhàn)?
其實(shí)開(kāi)源這塊最大的挑戰(zhàn)莫過(guò)于,用了開(kāi)源產(chǎn)品,而不回饋開(kāi)源社區(qū),這種情況在全球都挺普遍的。
于開(kāi)源開(kāi)發(fā)者個(gè)人而言,既然做開(kāi)源項(xiàng)目,也應(yīng)該有所覺(jué)悟,如果接受不了企業(yè)用了某個(gè)開(kāi)源產(chǎn)品,掙了很多錢,且并不打算通過(guò)任何形式回饋開(kāi)源社區(qū),干脆就不要做開(kāi)源。開(kāi)源和回饋,是品德,品德是用來(lái)律己的,不能苛求別人。
從生態(tài)大局考慮,應(yīng)方方面面來(lái)保證開(kāi)源項(xiàng)目貢獻(xiàn)者的合法權(quán)益,促進(jìn)生態(tài)圈內(nèi)的良性循環(huán),以及加強(qiáng)開(kāi)源文化的宣傳和推廣,讓更多人了解開(kāi)源,認(rèn)可開(kāi)源模式。
受訪人簡(jiǎn)介:
杜天微
郵箱:duzc2@163.com
OpenBlock代碼倉(cāng):https://gitee.com/openblock/openblock
簡(jiǎn)介:
OpenBlock核心貢獻(xiàn)者;前上市集團(tuán)技術(shù)總監(jiān);10年大型游戲研發(fā)經(jīng)驗(yàn);15年互聯(lián)網(wǎng)研發(fā)經(jīng)驗(yàn)
想了解更多內(nèi)容,請(qǐng)?jiān)L問(wèn):
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)