【CSDN 编者按】放眼各大编程语言排行榜,几乎很难看到国产编程语言身影,伴随着我国基础软硬件的发力与追赶,尤其是在操作系统、数据库等技术领域的累积,我们也渐渐看到一些国产编程语言的诞生,例如由一群 Go 语言爱好者发起的凹语言,2018 年筹备再到今年 7 月正式开源,其背后有着怎样的故事,开源 3 个月后,其又进行了哪些改进与提升呢?


凹语言最近刚刚发布 v0.3.0,而正式开源不知不觉已经过去一个季度,这是凹语言开源的第一个季度的非正式总结,也是对未来的计划和展望。

1. 凹语言简介

凹语言(凹读音“wā”)是 国内 Gopher 针对 WASM 平台设计的通用编程语言。凹语言作为WASM原生 的编程语言,天然对浏览器环境亲和,同时支持 Linux、macOS 和 Windows 等主流操作系统,此外通过 LLVM 后端对本地应用和单片机等环境提供支持。

下面是凹语言的Logo:

从形状上看,“凹”字形似 WASM 图标(方块上部缺个口);从读音上看,“凹”正好是 WASM 的前半部;从结构上看,实心的“凹”字约等于字母“C”逆时针旋转 90 度——C 可以理解为 C 语言,也可以理解为 Coder,那么“凹”也可以暗示躺平的的 C/躺平的 Coder……

2. 凹语言项目发起人

该项目的发起人柴树杉、丁尔男、史斌均是国内资深 Gopher。其中柴树杉是《Go 语言高级编程》等多本 Go 畅销书作者,目前在蚂蚁从事 KusionStack 和 KCL 语言的设计和开发工作。丁尔男是《WebAssembly 标准入门》等多本 WASM 专著作者,长年从事 3D 开发热衷于性能优化,目前在航天远景科技股份有限公司分管 3D 相关产品开发工作。史斌是编译器领域专家,曾为 Go 编译器提交过 127 个优化补丁,在 Go 全球贡献者排名中长期处于前 50 名,同时拥有 Go 与 LLVM 官方 Git 仓库的提交权限,同时也是《Go 语言定制指南》图书的作者。

在开发实践中,因为不同的原因,先后萌生了发展一门新语言的想法,Go 语言克制的风格是我们对于编程语言审美的最大公约数,因此选择它作为初始的蓝本。不必讳言:本项目启动时大量借鉴了 Go 的设计思想和具体实现——这是在有限投入下不得不作出的折衷,我们希望随着项目的发展,积累更多原创的设计,为自主创新的大潮贡献一点力量。

3. 设计哲学和开发计划

凹语言的整体设计,是围绕着“对开发人员友好”来进行的。字符串/切片作为基本类型、无需(也不能)手动管理内存、视觉上更显著的变量类型定义等均是这一核心思想的具体体现。

2022 年 7 月,凹语言正式开源,并公布了半年度的线路图:

随着项目的公开,有了更多的同学加入了凹语言开发组,讨论组社区也逐渐形成并保持活跃。感谢开发组的同学协同努力,第一季度的目标全部达成!

4. 取得了哪些进展

首先,经过多次讨论,开发组慎重决定凹语言采用 AGPLv3 开源协议,并制定了对应的了凹语言贡献协议。目前已经有外部同学通过新的流程贡献了代码。此外还取得了以下重大进展。

4.1 发布第三版网站

从 2018 年起,网站经过 3 次较大更新。最开始第一版的网站只有一个静态页面(2018),第二版是刚开源时基于 MDBoo k构建(2022年7月),最新版本于 2022 年 9 月开发到 10 月底正式上线。

该版本网站由子项目负责人扈梦明开发,他还是凹语言 VSCode 插件和 Playground 的负责人。

4.2 发布纯浏览器环境的的 Playground

Playground 是一套在线编译凹源代码并执行的环境。该环境的编译、执行没有调用后端服务,完全在页面中运行;是一个非常便捷的体验、测试凹语言的入口。

4.3 创建 VSCode/Fleet/Vim 等高亮插件

VSCode 插件提供了语法高亮、代码片段补全、补全建议等功能,支持纯 Web 环境安装:)

9 月 JetBrains Fleet 发布了预览版本,凹语言第一时间开发了高亮插件:

当然,传统的 Vim 插件也不能少:

更多和插件和功能完善希望社区同学参与共建。

4.4 WASM 后端原型如期发布

WASM 后端原型如期发布,已支持数值/字符串基本类型、结构体、方法、数组、切片等常用特性,项目组开始着手以此为基础开发贪吃蛇等带有交互功能的网页小游戏。

可以通过以下方式测试:

  1. go install github.com/wa-lang/wa@latest
  2. wa init -name=_examples/hi
  3. wa run _examples/hi

或者创建以 hello.wa 文件,包含下代码

fn main {
    println("你好,凹语言!")
    println(add(40, 2))
}

fn add(a: i32, b: i32) => i32 {
    return a+b
}

运行并输出结果:

$ go run main.go hello.wa 
你好,凹语言!
42

程序默认会基于WAT后端编译并执行,看到以上输出表示一切正常!

4.5 作为嵌入 Go 程序脚本

凹语言也可以作为 Go 语言包被导入,然后以脚本方式执行:

package main

import (
    "fmt"
    "github.com/wa-lang/wa/api"
)

func main() {
    output, err := api.RunCode("hello.wa", "fn main() { println(40+2) }")
    fmt.Print(string(output), err)
}

4.6 LLVM 后端提前启动

原定于 2023 年春节后启动的 LLVM 后端,提前启动。LLVM 后端的主战场在本地和嵌入式环境,下面是凹程序翻译到 LLVM-IR 的效果:

目前已经支持素数例子的执行:

更新路线图:

5. 展望

目前,凹语言是一个爱好者共建的业余项目,没有设置 KPI。一门新语言真正达到实用化,所需的工作量极其巨大,我们热切的期望更多有兴趣的同学能参与共建,尤其是承担子项目负责人的职责。

与普通贡献者相比,子项目负责人可以直接参与决策,在项目发展中获得上不封顶的话语权。由于尚处于起步阶段,可以单独成为子项目的模块遍地都是:一组堆管理函数、一个wat转二进制wasm的包、一种与其他语言交互的接口……

出名要趁早,参与开源同样需要趁早,欢迎参与共建。