回到 2018 年,突然就到了码农 35 岁面临下岗的年龄。为了缓解焦虑也喝了不少之前不屑一顾的鸡汤,没想到偶尔喝一些鸡汤也没有那么腻。在喝鸡汤过程中印象最深的一个概念是:从 25 岁 35 岁才工作 10 年,35 岁到 60 岁退休还有 25 年,职业生涯才刚刚走了 1/3 呢!另一个有感触的概念是工作是短期阶段性的、而职业是一生的。在这一年我才开始思考后半生的职业方向。
时间再往前推到大学期间,作为一个非计算机专业的半路出家人士,我对编程语言底层工作原理一直比较感兴趣。当时照着《编译原理及实践》书本最后的 Tiny 例子实现代码,将其移植到了早期程序员考试大纲定义的 CASL 汇编语言上,在实现 CASL 汇编器的过程中独立发现了单次扫描的算法(后来知道 Gnu 的汇编器也是采用单次扫描算法)。虽然对编程语言方向感兴趣(当时还分不清 PL 和编译器方向的差别),毕业工作之后排除外界环境等因素,甚至没有敢想过以后能够从事编程语言相关的工作。
时间再回到 2018 年 8 月份,WebAssembly 国际标准刚好发布 1.0 草案版本。因为在之前公司就深度实践过 WebAssembly 的前身 Emscripten 技术,因此就快速攒了一本《WebAssembly 标准入门》。因为对 WASM(WebAssembly 的简称)技术的热爱,同时对现有的编程语言不太满意,我们就低调启动了针对 WASM 平台的凹语言项目。
到了 2019 年,国外分别出现了 TinyGo、AssemblyScript 和 V 语言等项目,而这些正是我之前期望但是又无力实现的语言。为了弥补知识的欠缺,2019 年底恶补了 Go 语言语法树的一些知识,后来《Go 语言定制指南》出版。期间,我对凹语言的技术路线也逐渐变得清晰,到 2020 年全部小伙伴也针对目标达成了共识。同年,我也参与到了蚂蚁的 KCL 配置语言开发团队,应该算是真正的编程语言从业者了。
到了 2022 年,回顾国产编程语言这个方向,我发现这已经不再是之前的一片信息荒漠,而是有很多可以八卦的事件。虽然目前还没有真正形成影响力的通用国产语言,但是这些早期的故事也是非常值得关注的。刚好还没有人写,所以我在元旦前后有了写这个文章的想法。
什么是国产编程语言
首先要明确本文对国产编程语言的定义。通俗地说,如果一个编程语言是在中国环境(没有强依赖国外的资本)、由中国公司或中国人发起并主导,那么它就是国产编程语言。
为何要加一个在中国环境产生这个限制?作一个类比,杨振宁在 1957 年获得诺贝尔奖时还是中国国籍,但是一般我们不会把这个奖算作是中国的。同理,如果一个编程语言如果是在非国内环境诞生的,那么即使是中国人发起也不作为国产编程语言讨论(后面的文言是一个例外,因为文言更偏向个人和社区项目、同时面向的是中文编程的方向)。
2021 年底,人民邮电出版社新出了知名漫画作者西乔的《什么塑造了今天的编程世界》漫画作品。作为编程语言爱好者,纵观全书发现其中涉及的超过 15 个编程语言都是国外的,其中有美国的、欧洲的、甚至日本的,唯独没有国产的编程语言!作为码农、作为语言爱好者和从业者,既然没有现成的轮子那就自己动手吧,因此我在 2022 年 7 月发起了中国编程语言收集的项目——我们只关注国产编程语言!
国产编程语言有哪些
可以参考中国编程语言列表,仓库地址:https://github.com/china-programming-languages/zh-lang-book。这个地址主要收录了国内环境产生的编程语言,会重点考虑中文社区、中文支持、中文用户和中文教程等在国内的影响力。对于有国际影响力的语言自会有国际权威机构做出最客观的评价,不在国产语言这个列表的考虑范围内。
以下是目前收录的国产编程语言:
目前,列表收录的编程语言超过 20 个(都是已经开源的项目),而且几乎是绝大部分的语言都还处于非常早期的开发阶段。我不敢说这些项目就一定能够成功,但是从这个新兴的列表可以看到中国码农同学们积极探索的态度。
为何要国产、为何要开源?
为何要聚焦国产语言?
本文开始讲到作者 2018 年 35 岁到了焦虑时间,当时刚好也是中美贸易对抗的开始。作为国内第一批 Go 语言爱好者,近距离围观了 Go 的开源和成长的过程 10 年之久。但是随着国内 Gopher 参与的深入,融入国际开源项目的阻力也越来愈大:比如 Go2 的泛型设计为何没有中国的声音?Go2 为何还没有解决中文名字不能导出的问题?同一个 Issue 由中国社区提出和 Rob Pike 提出为何是两种截然不同的反响(参考 Issue9097 和 Issue45624)?
我想这和芯片、操作系统的原因类似,编程语言也是软件行业的生态基础,当触及这些生态的核心时,中国人是很难有参与的机会的。如果说在 2008 年软件环境还不具备,那么到了 2018 年尤其随着千禧年之后计算机在中国普及,我们国家的程序员已经在追赶并紧跟着世界前沿技术的发展,更多同学有能力开始试水编程语言领域。
编程语言为何要开源?
编程语言不仅仅是作为基础设施、基础软件,更是作为影响程序员心智和思维的界面,只有当有更多的人使用和交流才能体现其更大的价值,从而促进更上层生态的发展。
目前市面上出现的编程语言几乎是 99% 都是开源的,还有极少数未开源的编程语言则会因此错过发展壮大的可能。比如 90 年代就出现的易语言,虽然在国内拥有不错的用户量,但是因为不开源、不支持非 Windows 系统而失去了成为主流编程语言的可能。开源是语言作为交流工具的基因,闭源则是拒绝交流、拒绝生态、拒绝成为主流语言的可能。
中文真的不适合编程吗?
国产编程语言安支持的文字语言可以分 3 类:英文编程、中文编程和对中英文兼顾的编程。其中,中文编程是后两类语言需要探索的主要目标方向。
但是,知乎上对中文编程的态度并不友好。反对的观点主要是:中文输入麻烦、中文编程只是简单的英文关键字的翻译并没有带来编程思想的更新,特别是计算机领域中文就是没有英文香,因此中文编程没有必要。相比而言,我更喜欢这个实在的回答:因为觉得中文编程很有用的那群人没本事!但是我想补充的是:国产编程语言正在慢慢变多(虽然大部分还是玩具),只要有新的国产语言不断产生,新的中文编程必然会出现。
另一个问题:编程中,中文输入真的很慢吗?真的很慢!但是慢的原因并不能完全归因于中文本身!我们知道在汇编语言出现之前,编程中输入英文效率也是非常之低的!在发明智能拼音输入法之前,拼音的输入效率也是很低的(之前还需要大量背诵五笔输入口诀)!而现在随着 AI 的发展,通过语音来输入编程也不是不可能。为何在中文编程这个问题上,就拿中文输入效率低来敷衍?输入 fn,补全为 func、function 还是中文的“函数”其实并无本质差别。
英文真的就是编程的理想语言吗?英文之所以能够成为世界语言有很多的偶然因素,英文能成为编程的首选语言同样也有很多偶然因素。当然,早期电脑能力太弱,一个 Byte 刚好能表示全部的英文字符是一个重要因素。经过多年的发展,英文编程语言确实诞生了很多有创意的设计。但是现在再拿 8bit 来限制中文的表达就不厚道了。正所谓,常在河边走自然有机会湿鞋!如果不进行探索,如果还是以英文编程语言的思维方式来思考(为何关键字不能说一个字符?),中文就永远也不可能找到适合自己的编程范式!
千里之行,始于足下。我们不能因为第一个包子还没有吃饱就不吃第一个包子了。同样,中文编程语言只有进行实在的探索才会有机会发现新的、适合中文文化的编程模式。
个人和公司主导的编程语言
如前文所述,编程语言的基因就是开源的。然而,开源项目一般有个人和公司主导之分,那么个人和公司主导的编程语言会有哪些差异呢?区别主要来自编程语言涉及的开源和语言两个纬度。
首先从开源角度看:公司或者资本的力量雄厚,有着充裕的资源雇佣全职开发者,并通过资本运作实现更大的影响力;而个人驱动的开源项目只能是用爱发电。所以现在有说法是开源已经成为资本的附庸,个人英雄主义已经彻底没落。
然而,正如市场经济虽然在配置资源的过程中效果更高,但其追逐短期利益的本质也必然使其面临经济危机的风险。特别是作为编程语言这种需要长期投入、短期看不到经济回报的方向,对于国内大部分公司和资本是没有吸引力的(这可能也是到目前还没有国产主流编程语言的主要原因)。
而作为个人爱好者,因为爱好选择的这个方向倒是更有可能长期走下去。很多草根项目不仅仅生存是靠用爱发电,参与社区各种开源评奖也是全靠运气,因此希望大家给草根开源项目更多的宽容和发展空间,正是这些不放弃的星星之火才可能为国产编程语言带来更多的活力。
再次从编程语言角度看:少数人人主导的编程语言更容易形成独特的口味!当然,公司主导的编程语言也可以有个体的发明者和主导者,比如 Go 语言的作者只有 3 个,Swift 语言作者也只有 1 个。
不管是公司、还是社区主导的编程语言项目,如果不是绝对少数人控制语言设计最终难免会发展为没有个性的大杂烩语言。特别是公司发起的语言项目,如果最终沦为 KPI 的工具那么决策的方向就不是少数人能够控制的了。当然语言个人每个人看法不同,我个人更喜欢有个性的语言、哪怕它不是主流的编程语言。
2022 年开源的国产语言
2022 年可以说是国产编程语言的一个爆发年,中国编程语言列表中至少有何语言(2k Star)、HVML(1k Star)、Ulilang(500+ Star)、凹语言(500+ Star)、KCL(250+ Star)、洛书(100+ Star)、蝉语 /Cicada(30+Star)、入墨答 /RuCalculus(50+Star)、凸语言(20 Star)等 9 个新语言诞生。这里我们选择超过 100 Star 的几个语言做简单介绍。
9 月,Unilang 语言诞生 -Deepin
2022 年 9 月,Deepin 的一篇“生而为创新!我们自研的编程语言 Unilang 问世”正式公开了自研全新通用目的编程语言——Unilang!从官网的例子看,Unilang 是混合了 Lisp 函数式语法风格的动态语言,内置了 Qt 的绑定支持主要面向 GUI 开发。
代码主仓库:https://github.com/linuxdeepin/unilang
下面是 Unilang 提供的循环的例子:
以上的代码是通过 defn 定义函数,实现了查找列表元素的逻辑。Unilang 目前在 Github 上有 500 多个 Star。
Deepin 作为国内的 Linux 发行版深受国内很多同学的关注,他们对编程语言方向的投入更说明了从操作系统视角对新语言的期望。如何为 GUI 编程设计灵活的语法也是很多主流语言努力的方向(比如 SwiftUI、Flutter 的 Dart 等)。
8 月,HVML 语言诞生 - 飞漫
HVML 是 Hybrid Virtual Markup Language 的缩写。它是由中国首个开源项目 MiniGUI 的作者魏永明提出并设计的一种通用且易学的编程语言。
HVML 语言主页:https://hvml.fmsoft.cn/zh
例如,下面的 HTML 文件定义了一个包含 Hello, world! 段落的文档:
<html> <body> <p>Hello, world!</p> </body> </html>
就像 Python、PHP 或 JavaScript 脚本一样,HVML 需要一个解释器来运行这个 HVML 程序。换句话说,浏览器呈现 HTML 文档,而 HVML 解释器执行 HVML 程序。
HVML 目前已经获得大约 1000 个 star 关注:
HVML 更像一种面向 UI 的声明式语法,类比 Vue 等框架又引入了逻辑控制的能力。HVML 采用了和 Unilang 完全不同的思路,不管怎么说,这是一个不错的探索方向。
8 月,何语言诞生 - 草根
何同学是知名的科技视频制作者,在 2022 年 8 月发布了一个爆款视频《我做了一个自己打字的键盘》,在 B 站有几百万的播放量。视频中有一个环节涉及 C 语言的代码,广大读者发现了其中一个 BUG。这在知乎引起了该 BUG 的大讨论,其中一个相关问题就有 180 个回答。
许多网友在研究何同学 C 程序的同时也极大地提升了自己的编程能力,更有同学以此为契机发明了何语言——次世代赛博编程语言。何语言在 GitHub 发布不到一周就斩获 1800 个 Star 关注,其相关视频 B 站有 7 万多的播放次数。
何语言最初是用 Python 实现,发布后吸引了各路爱好者加入二次创作,出现了 Kotlin、C#、Rust、TypeScript、Go、汇编语言、Swift、OCaml 等多种其他语言的实现。可以说,何语言是 2022 年中国开源社区编程语言领域最有影响力的事件。
何语言主页:https://github.com/kifuan/helang
打印里塘的代码:
sprint 72 | 101 | 108 | 108 | 111 | 44 | 32 | 76 | 105 | 116 | 97 | 110 | 103 | 46;
// Hello, Litang.
何语言诞生不到 1 个月就获得大约 2000 star:
何语言虽然可能开始是一个恶搞语言,但是凸显了大家对编程语言领域的关注,可以说这是一个风向标事件。
7 月,凹语言诞生 - 草根
凹语言是国内 Gopher 发起的纯社区构建的开源国产编程语言项目,同时凹语言也是国内第一个实现纯浏览器内编译、执行全链路的自研静态类型的编译型通用编程语言。凹语言不仅仅点亮了 Arduino Nano 33 开发板,同时也通过实现了 BrainFuck 虚拟机证明了其图灵完备的能力,最近还验证了通过凹语言开发 Web 版本贪吃蛇的能力。
凹语言主页:https://wa-lang.org/
凹语言版本的“你好世界”:
官方页面刚刚增加了在线的贪吃蛇游戏(https://wa-lang.org/wa/snake):
凹语言从开源到现在大约获得了 500 个 Star 关注:
与何语言一样,凹语言也是社区发起的纯社区构建项目。其开始依托于 Go 语言生态、聚焦在 WASM 平台,目前已经取得了不错的进展。
7 月洛书语言诞生 - 草根
洛书是由陈朝臣设计的一款开源、轻量、跨平台、易拓展中文编程语言。根据仓库说明文件,其目标主要是针对现阶段国人编程需求与编程门槛的矛盾,致力于提供一种人人参与,快速构建的编程方式。语言采用 C++11 编写,目前可以在几个主流系统运行。洛书目前没有官网,其代码仓库地址:https://gitee.com/chen-chaochen/lpk
下面是项目提供的单片机开发版点 LED 灯的例子:
可以容易根据加载、导入、方法等猜测其对应的含义,然后通过管理 LED 灯引脚关系,最后并在循环中控制灯的开关。
洛书作者目前可能还是一个高中同学,也开始在探索中文编程的方向。通过洛书与何语言可以发现,国内确实有更多新同学关注和试水设计新编程语言的实践。
5 月,KCL 语言诞生 - 蚂蚁
Kusion 配置语言(KCL)是由徐鹏飞负责设计的、基于约束的记录及函数语言。KCL 通过成熟的编程语言技术和实践来改进大量繁杂的配置,比如云原生 kubernetes 配置场景的编写,其致力于构建围绕配置更好的模块化、扩展性和稳定性,更简单的逻辑编写,以及更快的自动化集成和良好的生态延展性。徐鹏飞从清华大学毕业加入蚂蚁后就开始负责 KCL 的设计和实现工作,他的兴趣方向主要在编程语言、云原生、DevOps 等方向。目前 KCL 已经作为 KusionStack 子项目通过中国电子技术标准化研究院颁布的初级开源项目认证,项目进展势头不错。
KCL 语言的主页:https://kcl-lang.io/
下面看看如何通过 KCL 代码配置一个 Nginx 服务:
import base.pkg.kusion_models.kube.frontend
server: frontend.Server {
image = "nginx"
}
KCL 通过模型库提供了 frontend.Server 服务抽象,然后在实例化的时候制定应用的镜像即可完成服务的基本配置。这是一个面向云原生运维的领域语言。
KCL 语言目前大约有 250 多个 Star:
KCL 是今年发布的语言中唯一一个面向云原生领域的语言,目前已经在蚂蚁和有赞等企业环境使用上。KCL 语言本身可能还在完善打磨中,但是企业用户的认可说明这是一个有很大需求的创新方向。
登上 Hacker News 首页的国产语言
因为样本太少,目前中国编程语言列表收录的只有 20 多个语言,都是刚刚诞生不久的新语言。因此我们还可以换个角度,看看有哪些国产编程语言上过 Hacker News 首页。
Hacker News 简称 HN,是《黑客与画家》作者 Paul Graham 联合创办的、Y Combinator 旗下的新闻社区,它的界面虽然丑陋,但是社区的用户质量、评论质量都非常高。很多知名的项目早期都会通过 HN 传播,比如国内的 TiDB 就多次登上过 HN 的首页。而在国产编程语言领域,目前至少有 Go+、文言、凹语言、KCL 几个语言登上过 HN 首页。
Go+ 编程语言
Go+ 语言是国内首席 Go 布道师许式伟发起的国产编程语言项目。
Go+ 的前身最早可以追溯到 2014 年前后。当时,许大在 Go 语言中国讨论组发过其设计的 Qlang 语言(大约是七牛语言的意识),还没有开源的时候我就找其要过代码,语言是有着 Go 语法风格的脚本语言。然后到了 2019 年,许大已经正式启动了 Go+ 语言(在 Go 语言之上扩展新的语法),并在 2020 年正式对外发布了第一个版本。中间还有一些 github 仓库地址被占用的八卦,Go+ 目前有 8000 多 Star 关注,是目前国产通用语言关注度最高的。
Go+ 的主页:https://goplus.org/
Go+ 通过引入推导式并简化函数调用参数的方式,看起来更像脚本语言。下面是打印列表的例子:
fields := [
"engineering",
"STEM education",
"and data science",
]
println "The Go+ language for", fields.join (", ")
在 2020 年,Go+ 刚对外发布后就在 Hacker News 引起了广泛讨论,其中争论主要围绕其引入了 Python 风格的列表推导式。总之是有人欢喜有人忧,大家的口味都不尽相同。此外还有一些对 cgo 的讨论,Go+ 社区后来也针对 C 语言做了一些转化工具。
https://news.ycombinator.com/item?id=23550042
文言文风格的文言
文言是是来自卡内基梅隆大学的黄令东在大四时设计的语言,是一门以汉语文言文为基础进行程序编写所用的语言。编译器主要以 JavaScript 实作,支援将原始码编译为 JavaScript、Python 或 Ruby 程式码。文言目前关注 Star 有 18000,其仓库地址为:https://github.com/wenyan-lang/wenyan
下面看看文言的循环打印的例子:
吾有一數。曰三。名之曰「甲」。
為是「甲」遍。
吾有一言。
曰「「問天地好在。」」。書之。
云云。
文言编译器会翻译为以下的 JavaScript 代码:
var n = 3; for (var i = 0; i < n; i++) { console.log ("問天地好在。"); }
虽然不是一个面向主流的通用语言,但是文言一经面世就引起了广泛的讨论。以下是 Hacker News 上关于文言的帖子:
https://news.ycombinator.com/item?id=22213406
文言是一个非常有意思的项目,从其被国内外广泛关注可以说明中文编程是有着较大的创新空间的。
面向 WASM 的凹语言
在 Go 语言官方发布 13 周年文章的时候,凹语言也上了 Hacker News 首页。
https://news.ycombinator.com/item?id=33544641
当时,凹语言仓库的 Issue、Readme 和网站都是中文为主,其中争论的焦点主要是“为何不是英文”,然后衍生出“既然不是英文为何要来 Hacker News 推广”的争议。凹语言官方解释是希望中文和英文能够平等对待,之后官网和 Github 也都提供了英文的基本文档。
面向云原生的 KCL 语言
随着云原生影响的范围越来越大,面向该领域也出现了很多领域语言(比如 CUE、Rego、jsonnet 等),KCL 就号称是面向 DevOps 的配置策略语言。
https://news.ycombinator.com/item?id=34144566
我想目前大家可能更关注 DevOps 以及 KCL 语言是如何给 DevOps 带来不一样的技术和体验的。云原生和 DevOps 都是一个快速发展的行业,也是众多互联网公司关注的领域,希望 KCL 语言在该方向能有更多的沉淀。
未来展望
编程语言是所有软件的基础,正是因为 C 语言才造就了 UNIX 的辉煌,从而奠定了现代软件行业的走向。但是目前主流编程语言均是由西方发明,这使得主流的编程语言缺乏中国的声音,对中文的支持甚是匮乏。
如果从 2018 年算起已经过去 5 年,从疫情开始算也有 3 年,我觉得这 3-5 年可以说是新兴国产编程语言酝酿和起步的阶段。希望在未来 3-5 年,这些语言能够逐渐走向成熟、构建更大的生态!大家一起努力!
作者简介:
柴树杉,KusionStack 项目开源负责人,凹语言作者。同时也是国内最早一批 Go 语言和 WebAssembly 技术爱好者。出版了《WebAssembly 标准入门》《Go 语言高级编程》《Go 语言定制指南》等畅销图书。