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