linkboy十周年:一门国产编程语言背后的故事(王强)

不知不觉间,linkboy面世已到十年。十年前的这个时候,开始着手设计开发这门编程语言,经过不断迭代和升级,目前linkboy已具有较为完备的生态体系。除了用于工控、IoT物联网、边缘计算等专业领域外,在国家推进科技创新的大环境下,近年来linkboy也逐渐应用在中小学的信息技术和编程教育中。本文将回顾和总结过去十年的开发历程,感兴趣的朋友可以借此一窥linkboy的内部设计细节和研发演进。


Linkboy3.6版本

概述

众所周知,编程语言是连接软件和硬件的桥梁,同时也是计算机科学中最底层技术,甚至要比操作系统还要底层(因为操作系统本身也是用某种编程语言开发)。由于历史原因,各类编程语言大都起源于国外技术体系并由国外所主导,鲜有获得主流应用的国产编程语言。

linkboy是首款面向嵌入式、物联网、工业自动化等领域的国产编程语言,从语言语法的设计、编译器词法语法分析到后端目标处理器移植和适配、以及最终机器码文件的生成,整个过程均为自主开发,没有使用和基于任何国外的开源技术体系,适合于部分对国产化率有严格要求的场景。

相比于国外的同领域编程语言,linkboy具有一些独特的优点,如支持图形化连线进行各个模块的配置;语言具有底层硬件无关性,免除用户跨平台移植的各类底层问题;支持常见MCS51、AVR8位处理器和ARM32位内核等功能。

尤其是语言的跨平台特性,意味着同样的程序可以配置在不同的平台上运行并给出完全一致的结果。此特性做到极致,就演化出linkboy的一个标志性功能——支持模拟仿真。此前业界主流的方案是:工控或物联网项目原本需要部署到实际设备上运行,才能看到结果,如果出现问题,则需要返工,通过专业手段设置各种程序断点,深入到程序内部调试和排错。 而基于linkboy的仿真机制,则可以直接在电脑上模拟执行整个工程项目,工程中各个变量的实时值和各外设的工作情况可视化展示,一目了然,程序流程和指令的执行也有直观提示。这样就把传统的黑盒开发转变成了透明的白盒开发,提高了程序调试和排错的效率。

除了应用在工控、物联网行业实现快速原型设计外,基于linkboy的图形化配置、模拟仿真,以及极低门槛的中文编程理念(所有库模块均有中文指令集接口)等特性,linkboy也在全国各地的中小学编程教育中获得了较为广泛的使用。

一、缘起

2009年7月,开始编写程序构建linkboy。那时候是大二即将结束要放暑假,关于语言的构想已经成熟,在学校实验室里正式着手开发这门编程语言。而之前很长一段时期,则一直是比较零散的,模糊的想法。有一些想法其实可以追溯到更早的大一时候。

大一是学习的起点,借助网络有无穷无尽的学习资料和软件,对于刚从高中苦海解脱的我来说,确实是大开眼界。记得有一次跟同学去网吧,我下载装好两个软件8051IDE和GBD8051,然后敲几行程序后,在GBD8051上运行,一个红色的端口就不断地闪烁。我兴奋地演示给同学看,他一脸茫然,说:“老大,这个有啥用?”

但我知道这个意义非凡,就像是开启了一扇大门通往新奇的计算机世界。使用汇编语言编程,大一做了一个俄罗斯方块游戏机,通过家用小霸王的手柄操纵并在128*64液晶上显示游戏画面。51芯片内存有限,外扩了一个6264RAM存储器。

这个游戏机当时几乎被同班同学们玩遍了。后续我又开发了坦克大战等程序,每次去网吧先把程序从邮箱里下载,然后修改,调试,增加功能;下机时候再把程序发回邮箱里,就这样总共编写近一万行汇编代码。从这些项目的开发中也总结了不少的经验,如规范形参传递、全局变量的使用、手工方式计算寄存器的占用等。实际上这里边已经包含了后来设计编程语言的萌芽,编译器无非就是把这些过程自动化。

到了大二开始从汇编转向C语言编程,使用Keil这个国外编程软件。根据老师和学习资料的指引,需要在网上寻找并下载破解版本,也就是盗版;正版是需要一笔钱的,而且国内没什么购买渠道(当时)。另外到一些工程师论坛上一看,很多公司的开发人员都在用这个盗版,不乏一些大型的正规科技公司。

经过调研,国内还没有自己的面向嵌入式和工控领域的编程语言,普遍在使用国外的编程工具。此外,电路仿真、EDA软件等这类基础、核心的开发工具,基本也都是掌握在国外厂商的手中,导致国内的技术研发人员只能被挤到产业链下游,做做应用。

大二使用Keil做了几个项目,又发现了C语言的一些弊端(也可能是自己过于吹毛求疵了吧)。最明显的是,C语言移植性比较差,你需要严格遵守MISRAC规范才会尽可能保证移植性。两者经常是矛盾的,比如C语言提供了三元运算符(?:),MISRAC规范中又禁止使用这个运算;C语言允许任意位运算,而MISRAC规定:不得对有符号数施加位操作。而且这样的规则一共有127条,即使稍微不注意,编程语言也不会给你报错,但是开发出来的工程却可能存在安全隐患,产生数据溢出等严重问题。

经过一些模糊想法逐渐清晰和成型,大二下学期快结束了时候,决定设计一门全新的面向工业编程语言,来在语言层面上做重新设计,也就是说使用这个语言的工程师,不需要再刻意遵守那127条规则,已全部融合到语言的层面,如有违规将给出明确的报错提示,这样在程序开发阶段就能避免很多潜在的隐患。

期末考试结束后,我给家里打电话说这个暑假不回去了,要在学校做些事(因为家里没有电脑)。根据计划原定暑假一两个月就能完成编程语言的原型开发并测试完成,这样大三开学就可以准备外出实习和找工作了。花点时间做完这个项目,以后作为毕设也是可以的,不算白忙活。

二.启程

为了在电脑上开发编译器软件,还需要同时学习C#。整个暑假,用一个正在学的语言开发一门新语言的编译器,主要是各种字符串处理。这样磕磕绊绊,边学边做,总算基本完成一个语言内核,参考C语言的语法实现了一个子集,而且支持指针。之后做了一些测试,用这套语言重新编写了之前的俄罗斯方块游戏,运行良好。于是信心满满地在一些专业工程师论坛上推销这个编程语言。发了两个帖子,不过反响平平,工程师们觉得这个东西没什么前途。还有人表示,先能编译通过UCOS-II那样的嵌入式操作系统再说吧。

想了想,可能目前的成果确实不太成熟。仅仅是编译器内核有了,而配套的库,调试环境等都不完善。做个原型是可以的,可是要想做完整,能应用在工业领域,两三个月的开发周期实在是太短。还有不少的工作量要做,这样感觉到大三毕业可能都做不完。那么,要不要继续做下去??

真是“无知者无畏”,决定不去实习找工作了,先考本校的专接本,这样就又有两年的充足时间来完善这个项目。

大一在西校区上课,是挨着农村的很偏僻的地方,大二开始在校本部上课。师范学院的实验室资源相对有限,不过在学院甄老师等安排下,办公楼里有一个小储物间收拾干净,给我当实验室。还给配了一个台式机,不用像大一那样每次去网吧编程了。很感谢学校能提供这样一个学习环境,大学近四年的时间基本都在这个小实验室里度过,并完成了linkboy最内核的编译器和语言框架。

即使这样,到2012年6月毕业的时候,这个项目还是没有完成~~ 因为发现永远有需要做的事情——编译内核做完后需要做生态,要支持大量的工控传感器、通信协议;然后基于此语言开发面向嵌入式场景的操作系统(RTOS),做完生态后依旧少有人用。于是开始做图形界面,简化模块的配置和编程,基于RTOS实现事件驱动框架,这又是一个新的方向… 毕业后同学们都去找工作、上班了,我看着电脑里这个半成品,想到如果去上班的话,精力一分散,这些已有的成果可能就再也拿不起来了…… 于是决定先不去上班,学校附近租了个房子,继续潜心研究这个编程语言到2013年底(给自己放了一年半的假,哈)。


Linkboy界面

三、迭代

毕业后没什么收入,老妈托我带给姐姐装修的钱被我占做生活费了,坚持到2013年底。文章比较长,写得像流水账。你要是能坚持看到这里,估计也猜到了,此刻还是有一堆的工作没有做完~ 比如又有了新的想法,想要支持更多的处理器,如STM32等ARM架构。但时间已经不允许了,各种内外的压力之下,新的一年要去北京找工作。以后所有的研究和计划,只能放到晚上和周末进行了。

2014-2016年,这段时间,从技术研发的状态来说,感觉进入一个低谷期。一方面对于自己研发一门编程语言的新鲜度逐渐降低,遇到的一些深层次问题和困难也会集中出现,更多是靠坚持走下去;另一方面,这个语言很难实际推广,几乎得不到用户反馈,只能自己探索着前进。原本计划暑假两三个月完成的项目,最后居然做了几年,而且还看不到什么希望。(估计没人愿意体验这种前不着村后不着店的感觉。有时候还真是有点心慌)

那么为何会有这么多需要做的事情?举一个比较类似的例子,就好像你在进行丛林探险:顺着一条小路进去之后,发现有个路口有几条小路,比较新鲜,于是先选择第一条小路进去看看;走了一会儿发现还有一个分叉路口,随便选一个分支继续进去,发现还有更多的路口在等着你——无穷无尽,最后已经迷路,眼花缭乱了。想到原本初心是要找到丛林深处散落的所有宝贝,方知整个工程量之庞大。

当然,如果光靠自己的兴趣研究,最后只是做一个自娱自乐的小玩具。项目要生存发展,必须有用户,所以还需要不断寻找最能接近用户的那些小路。

四、尝试突破生态怪圈

作为一个追赶者来说,自研技术的生态体系、兼容性等都比不过国外技术,吸引力不够导致用的人少;而用户少又会加剧这个状态差异,最终差距越来越大永远赶不上别人。从纯技术的角度来说,要想摆脱这种负面循环,办法只有一个,就是要在怪圈上找到一个薄弱处,集中力量重点突破缺口,方有可能跳出怪圈。

那么我们不妨以开源硬件体系中应用最广泛的arduino为例,探索一下。arduino是源自欧洲的一个硬件项目(但本质上也是一门编程语言),优点是各类的外设库很多。不过,我们切换到中小学编程教育的场景下看一看:首先arduino中的很多库在中小学场景可能根本不会用到;而常用模块linkboy也有,这样就等于抹平了对方的优势,使得中小学编程教育的场景下,你和对手短暂性的站在了同一个起跑线上。

然后基于你的自主技术,挖掘中小学编程教育场景的一些隐蔽的重点需求做深度开发,形成局部性的优势(而对手可能还顾及不到)。借助于这个微弱领先优势,可以得到种子用户,并根据用户反馈,不断迭代完善得到更大的用户量。这样可以认为突破原来的生态怪圈困境,找到了一个适合你的良性发展方向。

17年初,基于linkboy语言跨平台的特点,尝试了一下重定向机制。比如原本让灯亮灭的程序,硬件上是控制针脚高低电压,那么电脑上我处理为画一个圆圈在屏幕上(其他部分如RTOS都不做修改),实物灯的亮灭表现为电脑屏幕上的圆圈颜色改变,成功实现了最简单的,灯的模拟仿真。原本一个无心插柳的尝试,最后电脑界面上圆圈在闪烁的时候,我自己也有点惊讶了,原来硬件编程还可以这样玩~ 不失为一个全新的方向——而这个方向,是arduino等国外主流技术都没有的。(事实上直到今天,arduino官方依然没有增加模拟仿真功能)


即使复杂游戏也可以在电脑上模拟仿真

整个2017年基本在完善仿真,最后每个模块都支持了这个功能。得益于编程语言的跨平台,只需要修改硬件映射的部分即可。直观的模拟仿真一定程度上降低了中小学生的入门难度,排除了很多不必要的错误调试过程,另外“所见即所得”的展示效果也能提高小学生对编程的兴趣。

从17年以来,感受到linkboy用户量开始不断增加,有各行业开发者,也有各地的一线教师和学生。根据用户的反馈,不断修改优化编程语言,以适应更多类似用户。例如,有教师反馈,小学生对这个编程软件感兴趣,但是孩子手小,鼠标右键用不太好。于是软件的操作习惯及时做出调整,把大部分常用功能集中到鼠标左键上,这样也更适合教师触屏操作教学。

作为个人开发的公益平台,linkboy没有相关的资金支持,也没有什么大机构做背书和宣传,确实感谢各地的一线教师们能试用并喜欢这个编程平台,有些教师通过本校实践应用,编写整理成规范教材,进而引起上级教育部门的调研和重视。2018年,linkboy被选入山东省小学信息技术教学软件,并由一线教师们完成了教材的编写。2019年春季,小学六年级部分完成出版,正通过试点和学校选修等方式,面向全省开展信息技术编程课程。

江苏、广东等其他省市也有不少一线教师在使用linkboy进行信息技术教学。近日,由广东省教研院编著的广东省初级中学信息技术课本完成出版,这套教材采用linkboy平台,展示了智能家居编程、基于北斗定位系统的防丢器、多传感器的校园气象站等项目式案例。新教材将在9月份投入教学应用。

五、新征程:人工智能 / 物联网

随着人工智能的应用普及以及国家政策的推动,教育部门开始逐步引入python到中小学信息技术课程中。这之中又存在一个鸿沟,就是中小学应用最普遍的Arduino开源硬件无法运行python,学校需要额外采购更高价的python装备(如英国的micro:bit)。经过调研,目前国外还没有让8位arduino运行python的解决方案,这对于国产技术又是一个契机。未使用任何国外的开源技术情况下,linkboy首次实现了在arduino2560主板上运行python(子集)。

基于自研python编译/解释器可以与linkboy仿真引擎深度整合,实现“数据仿真可视化”:即仿真引擎会自动提取出所有的用户自定义变量,并根据程序单步执行状态,实时地在图形界面上显示出各个变量的当前值,此功能可直观展示各种程序算法的运行状态。

这些案例也侧面说明了在当今物联设备几何增长,技术生态环境分散化的趋势下,面对国外老牌技术厂商无暇顾及的一些场景,如人工智能+物联网(AIoT)、人工智能+编程教育等新兴方向,国产EDA/CAE类工业软件完全可以放下生态兼容等思想包袱,和国外技术站在同一个起点上同台竞技,并依托自主技术深挖场景需求,取得单点突破和局部的领先优势。

展望

在探索的道路上越走越远,总是能发现更多激动人心的方向。研究编程语言就像是奇妙的山泉,如果持续深挖,那么各种想法和创意能不断地涌出来,可做的事情实在是很多。现在依托目前的成果,一方面可以向应用层上扩展,结合国家产业政策,适合面向青少年做人工智能、军民融合(北斗等)科普编程平台;另一方面可向底层继续扎根,支持龙芯嵌入式CPU、兆易等各类国产处理器。尤其近两年RISC-V开源指令集在物联网领域开始大展身手,华为、阿里都在基于RISC-V研发更自主可控的芯片,那么做一些配套的编程语言移植工作,比如面向中小学提供基于开源指令集的编程仿真工具,也是比较有意义的事情。


大家如果感兴趣,可以到官网(www.linkboy.cc)下载最新3.6版本,体验试用。


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

原文链接:https://blog.csdn.net/XiaoYanZiShenFei/article/details/97775275(王强老师)

你可能感兴趣的:(linkboy十周年:一门国产编程语言背后的故事(王强))