这是关于一个国产编程语言的故事,在研发 5 年、开源一年的过程中,他们有过迷茫和挑战,更有豁然开朗的心得与体会。在本篇文章中,他们围绕研发初衷、开源成果、最新进展、趟过的那些“坑”和学会的那些道理做一次深度的分享,也借此希望能够给为国产基础软件路上的同行者带来一些参考。这是在 CSDN 首发的文章,总结了凹语言开源一周年的进展和心得。
随着我国基础软件的快速发展,以操作系统、数据库为代表的的国产软件正在不断发力与追赶国际先进水平。而作为软件开发的最底层,软件开发的核心工具,编程语言在推动技术创新和产业发展方面起着至关重要的作用。
纵览国内外各大编程语言榜单,我们很难看到国产编程语言的身影,但这并不意味着国内开发者就放弃这一领域的探索与研发。论及当下,已有一门旨在推动 WASM 平台发展的编程语言已经开源一年了,在同类型项目中是首个实现浏览器内编译、链接、执行全链路能力,具备纯浏览器环境开发云基础设施的潜力,它就是——凹语言。
这门语言是在 2018 年底由国内一群编程语言爱好者发起的开源项目,在 2022 年 7 月正式开源( https://gitcode.net/wa-lang/wa )。在开源的一年时间了,它已经完成大部分语言特性的开发,开发组对外发布了 MVP 版本和配套的《凹语言参考手册》。
作为程序员三大浪漫的核心、传承计算机文化的编程语言,在国内依然是技术荒漠。在云原生领域最流行的 Go 语言,第一个“hello ,世界”中依然跑的是日文!没想到国内在编程语言领域依然和 20 年前一样。
2017 年前,凹语言创始人柴树杉在航天远景做 Emscripten 相关的探索和实践,彼时,凹语言的另一位创始成员丁尔男对 WebAssembly 做过一个断言——“一切可编译为 WebAssembly 的,终将被编译为 WebAssembly 。”后来该断言被逐渐验证,在 2018 年 8 月作为 Emscripten 的继承技术 WebAssembly 也发布草案。
随后,柴树杉和丁尔男结合工作中的实战经验,出版了《 WebAssembly 标准入门》一书,书中最后一章是讲 Go 语言和 WASM 技术的结合。
作为对编程有兴趣的老码农,他们本着为自己定制一些工具的想法,针对 WASM 平台精简定制 Go 语言。2018 年底,他们想到了“凹语言”这个名字,这不仅仅代表着 WASM 的初始目标,也表达了某些“躺平”的梦想。但是启动一个新语言的阻力是 360 度全方位的,他们甚至根本没有敢对外宣传(和很多的项目还没开源没发布就对外大肆宣传登顶各种排行榜的做法完全相反)这个事情——只是悄悄地注册了域名并在 GitHub 创建了组织,之后就是近乎 3 年的沉寂。
2019 年,国外分别诞生了 TinyGo 、AssemblyScript 和 V 语言等项目。这些同类或近似的潜在竞品都为他们提供了宝贵的路线参考。此外 WASI 规范诞生,WASM 包管理工具陆续出现,这些变化和发展几乎完美印证了他们 2018 年对 WASM 技术的推演,这也无形中增加了他们决心基于 WASM 平台研发一个好用的通用语言。
2020 年,他们一起探讨了凹语言路线,同时完善《面向 WebAssembly 编程》开源图书。与此同时,这一年,LLVM 社区专家史斌加入进来。到此,凹语言三个联合发起人组织初步成型。几个发起人对凹语言的目标达成了共识——不做玩具车!可以说“不做玩具车”是凹语言后来发展方向和各种决策的基础原则。在后半年,三个发起人还完成了《 Go 语言定制指南》一书,至此凹语言未来发展路线的关键技术均已完成理论准备。
时间再跨越 2 年到 2021 年底和 2022 年初,结合国内外、公司内外的各种环境的变化,凹语言的实现工作正式启动,并在 2022 年 7 月完成了凹语言的开源工作。开源之后,社区小伙伴的加入给凹语言项目带去了极大的活力。
在 2022 年刚开源的时候,凹语言尚未明确开源协议,采用的是保留全部权利。当时有人在网上质疑:说凹语言开始大量使用了 Go 语言的代码是 BSD ,凹语言改为自有协议是否合适?
对此,凹语言发起人柴树杉表示:“BSD 协议是不阻止、甚至是鼓励拿来商业化和私有化的,因此凹语言当时做法没有任何问题。但用户可能是在隐晦质疑开源道德——网上总是会有各种声音!”
后来经过多次会议讨论,团队决定采用了 AGPLv3 协议。主要是因为创始团队认为他们是一个草根团队,担心用爱发电的开源项目会被商业公司白嫖。他们还列了几个前车之鉴:
为何 OSI 会拒绝 SSPL ,为何能接受 GPL ?这背景是因为 OSI 代表的是商业公司在和 GPL 、SSPL 等代表博弈的结果。凹语言采用 AGPL 是因为它是 OSI 认证的限制最严格的协议,否则很多被说是伪开源。
基于此,柴树杉还重点提到:开源真是用爱发电,但是开源者不是傻瓜,为众人抱薪者,不可使其冻毙于风雪! MongoDB 的选择必须鼓励,而抵制和限制 GPL 协议的头部大厂才是需要指责!
为了项目能够民主快速地推进,凹语言成立了临时决策委员会,该机构平时简称临委会。根据临委会章程,语法或运营模式的变更需要由委员发起提案,经临委会投票通过后才能公示生效,也就是说委员可以通过发起提案,以及对提案进行投票的方式来对项目路线施加影响。除了在自己负责的方向持续推进之外,临委会委员还需要处理各种日常事务,比如开发会议组织、参加各种交流、评奖活动等等。
与此同时,为吸引更多志同道合地开发者参与进来,凹语言项目在多个平台建立沟通渠道。为保障贡献者们的权益,公平对待参与者、记住所有的贡献者,凹语言项目始终把人放在第一位。而他们所成立的临委会、贡献点制度都是为了保障这一点。
贡献点制度是凹语言社区用来量化记录和激励社区成员贡献的制度。
基本设计:社区从 2022 年开始,每年产生 10 万个贡献点,所有参与项目并产生贡献的人,都可以按照贡献量获得贡献点。贡献的工作可以是代码、文档、参与会议讨论、参与宣传等一切需要花费功夫的工作。分配周期为 1 年一次或半年一次,需要发起决策提案,由决策委员会负责工作量的鉴定和贡献点的划分。贡献点的分配流程和结果都会记录并在社区文档中,并公开展示。
到现在为止,已经进行了 3 次贡献点分配,共计 15 万点。这些贡献点分给了 12 名同学,数目从 35000 到 2000 不等。
等到社区成熟之时,社区的决策制度将转为公开投票制度,到时候贡献点可以用来调整投票的权重,即贡献点多的人可以投出更多的票数。最后,如果这个项目未来能够产生商业价值,那么收益分配阶段也可以用贡献点作为参考。
在过去开源的一年间,截止 2023 年 8 月底,凹语言团队召开 20+次社区会议,产生 8 次提案,代码提交 900+次,完全自研代码超过 2 万行,发布了 18 个版本,发表 30 篇碎碎念文章,完成 MVP 版本发布和《凹语言参考手册》编写,GitHub 650+ Star 。
最新的 MVP 版本初步达到语言可以试用状态。实现了大部分核心语法特性,开发者可以以此为基础进行标准库的开发。目前只有少数特性 MVP 尚未实现,主要有三个:map 、反射以及 defer 。另外目前的版本中,有一些运行时行为不满足语法定义,比如切片下标没有做边界检查、孤环内存会泄漏,但随着编译器的更新这些问题会自动解决,不影响向后兼容性。
比较大的功能有:
社区相关的有:
这群一群半路出家的非计算机专业出身、非编译器从业者,他们在追梦国产编程语言的道路上,遇到了哪些挑战和困难?
柴树杉直言,心理挑战贯穿始终。
时间回到 2010 年,那会儿 Go 语言刚刚开源,国内有一大批 Gopher 疯狂关注,柴树杉作为其中一员,为 Go 贡献了 BMP/TIFF 等图像库,2015 年翻译了《 Go 语言圣经》。这些经历让他第一次近距离围观了一个现代化语言的诞生和发展的过程。但在尝试自己开发一门编程语言后,压力还是油然而生。
要么快速发展,要么提前死掉。这是 2022 年紧急决定开源时,创始团队的想法。彼时凹语言作为一个纯草根项目,他们担心一些有资本和国家背景的竞品语言出来后,凹语言将失去被关注的机会,他们自己也将失去继续的信心。
而在语言的开发建设过程中,各个功能的设计与实现背后都有着诸多的深思熟虑。
凹语言社区成员赵普明负责中文语法的设计和实现,他最大的体会便是“众口难调”,大家既想要有编程语言的精炼性,又想要有自然语言的易读性。甚至连”if“关键字中文用”如果“还是”若“都可以争论半天。
经过一段时间的讨论和思考,赵普明打算应用凹语言的社区决策制度来重新决定中文语法的设计:把整套语法拆分成不同的部分,分别写出提案,征集各种方案,再经过讨论和决策委员会的投票定下来。过程虽繁琐,但他觉得,这是个不错的社区化尝试,过程中,他也可以不断学习和总结各个编程语言的特色。
此外,实现可能比设计更加重要,把本子上的想法用代码实现,调试、改错到最终成功。他不禁感叹到,中文语法,确实是很好的学习编译器开发的切入点。
最后,他提到:实现中文语法后发现了一个新的独特的需求,即凹标准库是用英文写得,那么该如何用中文去调用英文的库函数?如何访问英文实现的结构体?编译器需要在中英文代码之间架起一道转化翻译的桥梁。
在开发过程中,凹语言团队发现每个阶段和成果之后都有新的广阔空间需要去建设。比如随着项目的发展,代码变得开始膨胀,像早期的 Arduino Nano33 环境的例子已经不能执行。每个时刻,他们都会担心突然冒出一个咋看不起眼的问题击垮他们。剔除技术因素,人员工作变动也可能会让项目停滞,还有项目如何推广、对于社区成员来说,免费参与项目建设,却被人质疑炒作、假开源等……
编程语言是一个短期内毫无商业价值,但对应长期生态的基础软件技术。于凹语言团队而言,开发者能够在一个缺少商业价值的项目花费时间投入进来,必然是真正的编程语言爱好者。正如凹语言团队所推崇的 slow is fast——低成本低效率让项目团队具备长期运行的潜力(凹语言从立项到现在时间将近 5 年)。同时草根小团队因为缺少 KPI 压力,在实现过程中可以降低技术变现的风险,可以更坚持项目的初心和突出项目的个性口味。
当下的主流编程语言,C/C++,Java ,Python ,Ruby ,Lua ,Go ,TypeScript 、Swift ,他们的创始人都是个人在驱动。当然,如果大厂的编程语言团队能够彻底摆脱 KPI 的魔咒或许会有更大的潜力。
扈梦明作为凹语言社区的首位成员,他直言:“在实现凹语言官网重构和在线 Playground 的开发后发现,找准自己在团队中的角色和定位,以及心态的转变会让自己融入到开源团队变得简单。”
他表示:只需要找到自己的专长并持续为团队做出贡献,从而实现赋能。当然也离不开团队成员的鼓励支持和帮助。这也就是凹语言团队的魅力所在,其多样性和包容性让每个人都能在团队中发挥自己的专长。而且在与团队伙伴们交流过程中也能收获到不同领域的知识和经验。
创始人之一的丁尔男说:“语言项目门槛高,可能是种偏见。”
1996 年进入武汉大学学习计算机的他,一直觉得搞通用编程语言是神仙做的事,和他没啥关系,但随着凹语言一步步走过来,他意识到,之前的看法可能是种偏见。
他举例道:虽然编译器通常按照解析、转换、代码生成的流程执行,但学习上手并不一定需要严格遵守这个顺序,他选择的路线是从抽象语法树入手向前后两端扩展,因为抽象语法树在编译过程中起到了承上启下的作用,两套不同的语法可能背后对应的是同一个语法树(就好比凹语言的中文语法和英文语法看起来风格迥异,但实际上对应的是同一套 AST ),再加上市面上成熟的语言已经非常非常多,只要不是特别非主流的设计,大概率能找到 AST 风格相似的语言,然后按照自己的审美进行改造,这样就可以极大的降低启动阻力。
和其他类型的项目相比,语言项目在技术上并没有更难,而最需要克服的困难反倒是跨出第一步的犹豫不决。
凹语言从立项到开源,从开源到 MVP 版本发布,凹语言已经完成从一个编程语言爱好者的想法到真实产品的蜕变。未来还有很多有挑战性的工作待他们去体验和攻克。为此,也呼吁和欢迎编程语言爱好者加入共建,为国产编程语言的发展贡献自己的力量。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.