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