linkboy十周年:一門國產(chǎn)編程語言背后的故事(王強)

不知不覺間,linkboy面世已到十年。十年前的這個時候,開始著手設(shè)計開發(fā)這門編程語言,經(jīng)過不斷迭代和升級,目前l(fā)inkboy已具有較為完備的生態(tài)體系。除了用于工控、IoT物聯(lián)網(wǎng)、邊緣計算等專業(yè)領(lǐng)域外,在國家推進科技創(chuàng)新的大環(huán)境下,近年來linkboy也逐漸應(yīng)用在中小學(xué)的信息技術(shù)和編程教育中。本文將回顧和總結(jié)過去十年的開發(fā)歷程,感興趣的朋友可以借此一窺linkboy的內(nèi)部設(shè)計細節(jié)和研發(fā)演進。


Linkboy3.6版本

概述

眾所周知,編程語言是連接軟件和硬件的橋梁,同時也是計算機科學(xué)中最底層技術(shù),甚至要比操作系統(tǒng)還要底層(因為操作系統(tǒng)本身也是用某種編程語言開發(fā))。由于歷史原因,各類編程語言大都起源于國外技術(shù)體系并由國外所主導(dǎo),鮮有獲得主流應(yīng)用的國產(chǎn)編程語言。

linkboy是首款面向嵌入式、物聯(lián)網(wǎng)、工業(yè)自動化等領(lǐng)域的國產(chǎn)編程語言,從語言語法的設(shè)計、編譯器詞法語法分析到后端目標處理器移植和適配、以及最終機器碼文件的生成,整個過程均為自主開發(fā),沒有使用和基于任何國外的開源技術(shù)體系,適合于部分對國產(chǎn)化率有嚴格要求的場景。

相比于國外的同領(lǐng)域編程語言,linkboy具有一些獨特的優(yōu)點,如支持圖形化連線進行各個模塊的配置;語言具有底層硬件無關(guān)性,免除用戶跨平臺移植的各類底層問題;支持常見MCS51、AVR8位處理器和ARM32位內(nèi)核等功能。

尤其是語言的跨平臺特性,意味著同樣的程序可以配置在不同的平臺上運行并給出完全一致的結(jié)果。此特性做到極致,就演化出linkboy的一個標志性功能——支持模擬仿真。此前業(yè)界主流的方案是:工控或物聯(lián)網(wǎng)項目原本需要部署到實際設(shè)備上運行,才能看到結(jié)果,如果出現(xiàn)問題,則需要返工,通過專業(yè)手段設(shè)置各種程序斷點,深入到程序內(nèi)部調(diào)試和排錯。 而基于linkboy的仿真機制,則可以直接在電腦上模擬執(zhí)行整個工程項目,工程中各個變量的實時值和各外設(shè)的工作情況可視化展示,一目了然,程序流程和指令的執(zhí)行也有直觀提示。這樣就把傳統(tǒng)的黑盒開發(fā)轉(zhuǎn)變成了透明的白盒開發(fā),提高了程序調(diào)試和排錯的效率。

除了應(yīng)用在工控、物聯(lián)網(wǎng)行業(yè)實現(xiàn)快速原型設(shè)計外,基于linkboy的圖形化配置、模擬仿真,以及極低門檻的中文編程理念(所有庫模塊均有中文指令集接口)等特性,linkboy也在全國各地的中小學(xué)編程教育中獲得了較為廣泛的使用。

一、緣起

2009年7月,開始編寫程序構(gòu)建linkboy。那時候是大二即將結(jié)束要放暑假,關(guān)于語言的構(gòu)想已經(jīng)成熟,在學(xué)校實驗室里正式著手開發(fā)這門編程語言。而之前很長一段時期,則一直是比較零散的,模糊的想法。有一些想法其實可以追溯到更早的大一時候。

大一是學(xué)習(xí)的起點,借助網(wǎng)絡(luò)有無窮無盡的學(xué)習(xí)資料和軟件,對于剛從高中苦海解脫的我來說,確實是大開眼界。記得有一次跟同學(xué)去網(wǎng)吧,我下載裝好兩個軟件8051IDE和GBD8051,然后敲幾行程序后,在GBD8051上運行,一個紅色的端口就不斷地閃爍。我興奮地演示給同學(xué)看,他一臉茫然,說:“老大,這個有啥用?”

但我知道這個意義非凡,就像是開啟了一扇大門通往新奇的計算機世界。使用匯編語言編程,大一做了一個俄羅斯方塊游戲機,通過家用小霸王的手柄操縱并在128*64液晶上顯示游戲畫面。51芯片內(nèi)存有限,外擴了一個6264RAM存儲器。

這個游戲機當時幾乎被同班同學(xué)們玩遍了。后續(xù)我又開發(fā)了坦克大戰(zhàn)等程序,每次去網(wǎng)吧先把程序從郵箱里下載,然后修改,調(diào)試,增加功能;下機時候再把程序發(fā)回郵箱里,就這樣總共編寫近一萬行匯編代碼。從這些項目的開發(fā)中也總結(jié)了不少的經(jīng)驗,如規(guī)范形參傳遞、全局變量的使用、手工方式計算寄存器的占用等。實際上這里邊已經(jīng)包含了后來設(shè)計編程語言的萌芽,編譯器無非就是把這些過程自動化。

到了大二開始從匯編轉(zhuǎn)向C語言編程,使用Keil這個國外編程軟件。根據(jù)老師和學(xué)習(xí)資料的指引,需要在網(wǎng)上尋找并下載破解版本,也就是盜版;正版是需要一筆錢的,而且國內(nèi)沒什么購買渠道(當時)。另外到一些工程師論壇上一看,很多公司的開發(fā)人員都在用這個盜版,不乏一些大型的正規(guī)科技公司。

經(jīng)過調(diào)研,國內(nèi)還沒有自己的面向嵌入式和工控領(lǐng)域的編程語言,普遍在使用國外的編程工具。此外,電路仿真、EDA軟件等這類基礎(chǔ)、核心的開發(fā)工具,基本也都是掌握在國外廠商的手中,導(dǎo)致國內(nèi)的技術(shù)研發(fā)人員只能被擠到產(chǎn)業(yè)鏈下游,做做應(yīng)用。

大二使用Keil做了幾個項目,又發(fā)現(xiàn)了C語言的一些弊端(也可能是自己過于吹毛求疵了吧)。最明顯的是,C語言移植性比較差,你需要嚴格遵守MISRAC規(guī)范才會盡可能保證移植性。兩者經(jīng)常是矛盾的,比如C語言提供了三元運算符(?:),MISRAC規(guī)范中又禁止使用這個運算;C語言允許任意位運算,而MISRAC規(guī)定:不得對有符號數(shù)施加位操作。而且這樣的規(guī)則一共有127條,即使稍微不注意,編程語言也不會給你報錯,但是開發(fā)出來的工程卻可能存在安全隱患,產(chǎn)生數(shù)據(jù)溢出等嚴重問題。

經(jīng)過一些模糊想法逐漸清晰和成型,大二下學(xué)期快結(jié)束了時候,決定設(shè)計一門全新的面向工業(yè)編程語言,來在語言層面上做重新設(shè)計,也就是說使用這個語言的工程師,不需要再刻意遵守那127條規(guī)則,已全部融合到語言的層面,如有違規(guī)將給出明確的報錯提示,這樣在程序開發(fā)階段就能避免很多潛在的隱患。

期末考試結(jié)束后,我給家里打電話說這個暑假不回去了,要在學(xué)校做些事(因為家里沒有電腦)。根據(jù)計劃原定暑假一兩個月就能完成編程語言的原型開發(fā)并測試完成,這樣大三開學(xué)就可以準備外出實習(xí)和找工作了。花點時間做完這個項目,以后作為畢設(shè)也是可以的,不算白忙活。

二.啟程

為了在電腦上開發(fā)編譯器軟件,還需要同時學(xué)習(xí)C#。整個暑假,用一個正在學(xué)的語言開發(fā)一門新語言的編譯器,主要是各種字符串處理。這樣磕磕絆絆,邊學(xué)邊做,總算基本完成一個語言內(nèi)核,參考C語言的語法實現(xiàn)了一個子集,而且支持指針。之后做了一些測試,用這套語言重新編寫了之前的俄羅斯方塊游戲,運行良好。于是信心滿滿地在一些專業(yè)工程師論壇上推銷這個編程語言。發(fā)了兩個帖子,不過反響平平,工程師們覺得這個東西沒什么前途。還有人表示,先能編譯通過UCOS-II那樣的嵌入式操作系統(tǒng)再說吧。

想了想,可能目前的成果確實不太成熟。僅僅是編譯器內(nèi)核有了,而配套的庫,調(diào)試環(huán)境等都不完善。做個原型是可以的,可是要想做完整,能應(yīng)用在工業(yè)領(lǐng)域,兩三個月的開發(fā)周期實在是太短。還有不少的工作量要做,這樣感覺到大三畢業(yè)可能都做不完。那么,要不要繼續(xù)做下去??

真是“無知者無畏”,決定不去實習(xí)找工作了,先考本校的專接本,這樣就又有兩年的充足時間來完善這個項目。

大一在西校區(qū)上課,是挨著農(nóng)村的很偏僻的地方,大二開始在校本部上課。師范學(xué)院的實驗室資源相對有限,不過在學(xué)院甄老師等安排下,辦公樓里有一個小儲物間收拾干凈,給我當實驗室。還給配了一個臺式機,不用像大一那樣每次去網(wǎng)吧編程了。很感謝學(xué)校能提供這樣一個學(xué)習(xí)環(huán)境,大學(xué)近四年的時間基本都在這個小實驗室里度過,并完成了linkboy最內(nèi)核的編譯器和語言框架。

即使這樣,到2012年6月畢業(yè)的時候,這個項目還是沒有完成~~ 因為發(fā)現(xiàn)永遠有需要做的事情——編譯內(nèi)核做完后需要做生態(tài),要支持大量的工控傳感器、通信協(xié)議;然后基于此語言開發(fā)面向嵌入式場景的操作系統(tǒng)(RTOS),做完生態(tài)后依舊少有人用。于是開始做圖形界面,簡化模塊的配置和編程,基于RTOS實現(xiàn)事件驅(qū)動框架,這又是一個新的方向… 畢業(yè)后同學(xué)們都去找工作、上班了,我看著電腦里這個半成品,想到如果去上班的話,精力一分散,這些已有的成果可能就再也拿不起來了…… 于是決定先不去上班,學(xué)校附近租了個房子,繼續(xù)潛心研究這個編程語言到2013年底(給自己放了一年半的假,哈)。


Linkboy界面

三、迭代

畢業(yè)后沒什么收入,老媽托我?guī)Ыo姐姐裝修的錢被我占做生活費了,堅持到2013年底。文章比較長,寫得像流水賬。你要是能堅持看到這里,估計也猜到了,此刻還是有一堆的工作沒有做完~ 比如又有了新的想法,想要支持更多的處理器,如STM32等ARM架構(gòu)。但時間已經(jīng)不允許了,各種內(nèi)外的壓力之下,新的一年要去北京找工作。以后所有的研究和計劃,只能放到晚上和周末進行了。

2014-2016年,這段時間,從技術(shù)研發(fā)的狀態(tài)來說,感覺進入一個低谷期。一方面對于自己研發(fā)一門編程語言的新鮮度逐漸降低,遇到的一些深層次問題和困難也會集中出現(xiàn),更多是靠堅持走下去;另一方面,這個語言很難實際推廣,幾乎得不到用戶反饋,只能自己探索著前進。原本計劃暑假兩三個月完成的項目,最后居然做了幾年,而且還看不到什么希望。(估計沒人愿意體驗這種前不著村后不著店的感覺。有時候還真是有點心慌)

那么為何會有這么多需要做的事情?舉一個比較類似的例子,就好像你在進行叢林探險:順著一條小路進去之后,發(fā)現(xiàn)有個路口有幾條小路,比較新鮮,于是先選擇第一條小路進去看看;走了一會兒發(fā)現(xiàn)還有一個分叉路口,隨便選一個分支繼續(xù)進去,發(fā)現(xiàn)還有更多的路口在等著你——無窮無盡,最后已經(jīng)迷路,眼花繚亂了。想到原本初心是要找到叢林深處散落的所有寶貝,方知整個工程量之龐大。

當然,如果光靠自己的興趣研究,最后只是做一個自娛自樂的小玩具。項目要生存發(fā)展,必須有用戶,所以還需要不斷尋找最能接近用戶的那些小路。

四、嘗試突破生態(tài)怪圈

作為一個追趕者來說,自研技術(shù)的生態(tài)體系、兼容性等都比不過國外技術(shù),吸引力不夠?qū)е掠玫娜松伲欢脩羯儆謺觿∵@個狀態(tài)差異,最終差距越來越大永遠趕不上別人。從純技術(shù)的角度來說,要想擺脫這種負面循環(huán),辦法只有一個,就是要在怪圈上找到一個薄弱處,集中力量重點突破缺口,方有可能跳出怪圈。

那么我們不妨以開源硬件體系中應(yīng)用最廣泛的arduino為例,探索一下。arduino是源自歐洲的一個硬件項目(但本質(zhì)上也是一門編程語言),優(yōu)點是各類的外設(shè)庫很多。不過,我們切換到中小學(xué)編程教育的場景下看一看:首先arduino中的很多庫在中小學(xué)場景可能根本不會用到;而常用模塊linkboy也有,這樣就等于抹平了對方的優(yōu)勢,使得中小學(xué)編程教育的場景下,你和對手短暫性的站在了同一個起跑線上。

然后基于你的自主技術(shù),挖掘中小學(xué)編程教育場景的一些隱蔽的重點需求做深度開發(fā),形成局部性的優(yōu)勢(而對手可能還顧及不到)。借助于這個微弱領(lǐng)先優(yōu)勢,可以得到種子用戶,并根據(jù)用戶反饋,不斷迭代完善得到更大的用戶量。這樣可以認為突破原來的生態(tài)怪圈困境,找到了一個適合你的良性發(fā)展方向。

17年初,基于linkboy語言跨平臺的特點,嘗試了一下重定向機制。比如原本讓燈亮滅的程序,硬件上是控制針腳高低電壓,那么電腦上我處理為畫一個圓圈在屏幕上(其他部分如RTOS都不做修改),實物燈的亮滅表現(xiàn)為電腦屏幕上的圓圈顏色改變,成功實現(xiàn)了最簡單的,燈的模擬仿真。原本一個無心插柳的嘗試,最后電腦界面上圓圈在閃爍的時候,我自己也有點驚訝了,原來硬件編程還可以這樣玩~ 不失為一個全新的方向——而這個方向,是arduino等國外主流技術(shù)都沒有的。(事實上直到今天,arduino官方依然沒有增加模擬仿真功能)


即使復(fù)雜游戲也可以在電腦上模擬仿真

整個2017年基本在完善仿真,最后每個模塊都支持了這個功能。得益于編程語言的跨平臺,只需要修改硬件映射的部分即可。直觀的模擬仿真一定程度上降低了中小學(xué)生的入門難度,排除了很多不必要的錯誤調(diào)試過程,另外“所見即所得”的展示效果也能提高小學(xué)生對編程的興趣。

從17年以來,感受到linkboy用戶量開始不斷增加,有各行業(yè)開發(fā)者,也有各地的一線教師和學(xué)生。根據(jù)用戶的反饋,不斷修改優(yōu)化編程語言,以適應(yīng)更多類似用戶。例如,有教師反饋,小學(xué)生對這個編程軟件感興趣,但是孩子手小,鼠標右鍵用不太好。于是軟件的操作習(xí)慣及時做出調(diào)整,把大部分常用功能集中到鼠標左鍵上,這樣也更適合教師觸屏操作教學(xué)。

作為個人開發(fā)的公益平臺,linkboy沒有相關(guān)的資金支持,也沒有什么大機構(gòu)做背書和宣傳,確實感謝各地的一線教師們能試用并喜歡這個編程平臺,有些教師通過本校實踐應(yīng)用,編寫整理成規(guī)范教材,進而引起上級教育部門的調(diào)研和重視。2018年,linkboy被選入山東省小學(xué)信息技術(shù)教學(xué)軟件,并由一線教師們完成了教材的編寫。2019年春季,小學(xué)六年級部分完成出版,正通過試點和學(xué)校選修等方式,面向全省開展信息技術(shù)編程課程。

江蘇、廣東等其他省市也有不少一線教師在使用linkboy進行信息技術(shù)教學(xué)。近日,由廣東省教研院編著的廣東省初級中學(xué)信息技術(shù)課本完成出版,這套教材采用linkboy平臺,展示了智能家居編程、基于北斗定位系統(tǒng)的防丟器、多傳感器的校園氣象站等項目式案例。新教材將在9月份投入教學(xué)應(yīng)用。

五、新征程:人工智能 / 物聯(lián)網(wǎng)

隨著人工智能的應(yīng)用普及以及國家政策的推動,教育部門開始逐步引入python到中小學(xué)信息技術(shù)課程中。這之中又存在一個鴻溝,就是中小學(xué)應(yīng)用最普遍的Arduino開源硬件無法運行python,學(xué)校需要額外采購更高價的python裝備(如英國的micro:bit)。經(jīng)過調(diào)研,目前國外還沒有讓8位arduino運行python的解決方案,這對于國產(chǎn)技術(shù)又是一個契機。未使用任何國外的開源技術(shù)情況下,linkboy首次實現(xiàn)了在arduino2560主板上運行python(子集)。

基于自研python編譯/解釋器可以與linkboy仿真引擎深度整合,實現(xiàn)“數(shù)據(jù)仿真可視化”:即仿真引擎會自動提取出所有的用戶自定義變量,并根據(jù)程序單步執(zhí)行狀態(tài),實時地在圖形界面上顯示出各個變量的當前值,此功能可直觀展示各種程序算法的運行狀態(tài)。

這些案例也側(cè)面說明了在當今物聯(lián)設(shè)備幾何增長,技術(shù)生態(tài)環(huán)境分散化的趨勢下,面對國外老牌技術(shù)廠商無暇顧及的一些場景,如人工智能+物聯(lián)網(wǎng)(AIoT)、人工智能+編程教育等新興方向,國產(chǎn)EDA/CAE類工業(yè)軟件完全可以放下生態(tài)兼容等思想包袱,和國外技術(shù)站在同一個起點上同臺競技,并依托自主技術(shù)深挖場景需求,取得單點突破和局部的領(lǐng)先優(yōu)勢。

展望

在探索的道路上越走越遠,總是能發(fā)現(xiàn)更多激動人心的方向。研究編程語言就像是奇妙的山泉,如果持續(xù)深挖,那么各種想法和創(chuàng)意能不斷地涌出來,可做的事情實在是很多。現(xiàn)在依托目前的成果,一方面可以向應(yīng)用層上擴展,結(jié)合國家產(chǎn)業(yè)政策,適合面向青少年做人工智能、軍民融合(北斗等)科普編程平臺;另一方面可向底層繼續(xù)扎根,支持龍芯嵌入式CPU、兆易等各類國產(chǎn)處理器。尤其近兩年RISC-V開源指令集在物聯(lián)網(wǎng)領(lǐng)域開始大展身手,華為、阿里都在基于RISC-V研發(fā)更自主可控的芯片,那么做一些配套的編程語言移植工作,比如面向中小學(xué)提供基于開源指令集的編程仿真工具,也是比較有意義的事情。


大家如果感興趣,可以到官網(wǎng)(www.linkboy.cc)下載最新3.6版本,體驗試用。


————————————————

原文鏈接:https://blog.csdn.net/XiaoYanZiShenFei/article/details/97775275(王強老師)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 從以上圖片可以看出本次更新內(nèi)容——**Python IDE**** 以下轉(zhuǎn)自微信公眾號linkboy開源社區(qū) li...
    linkboy創(chuàng)客閱讀 4,601評論 7 12
  • "大眾創(chuàng)新 萬眾創(chuàng)業(yè)",學(xué)校對于創(chuàng)客教育日漸重視,熱情高漲,紛紛開始創(chuàng)客教育課程,有條件的打造學(xué)校創(chuàng)客實驗室,不吝...
    少兒創(chuàng)客閱讀 15,319評論 11 52
  • 計算機編程語言可用于將指令傳達給計算機。它們基于某些句法和語義規(guī)則,定義了編程語言中每種結(jié)構(gòu)的含義。 現(xiàn)在我得到了...
    幻凌風閱讀 8,207評論 1 26
  • TITLE: 編程語言亂燉 碼農(nóng)最大的煩惱——編程語言太多。不是我不學(xué)習(xí),這世界變化快! 有時候還是蠻懷念十幾、二...
    碼園老農(nóng)閱讀 5,354評論 2 35
  • “好讀書;不求甚解;每有會意;便欣然忘食。”——晉·陶潛《五柳先生傳》作者:少兒創(chuàng)客幫轉(zhuǎn)載請注明出處:[http:...
    少兒創(chuàng)客閱讀 9,407評論 2 7