Skip to content
On this page

凹语言在KCD深圳2023


凹语言项目联合发起人柴树杉在 KCD 深圳 2023 论坛分享了凹语言最新的进展和案例,以下是本次分享的内容回顾:


案例-NES模拟器:

在线演示地址:https://wa-lang.org/nes/

模拟器代码地址:http://gitee.com/wa-lang/nes-wa,将仓库克隆至本地,下载最新版凹语言编译器,在控制台输入以下命令(其中 ./nes-wa 为模拟器代码的本地路径):

wa run ./nes-wa

即可编译模拟器,并在本地8000端口(localhost:8000)发布页面应用。

桌面版浏览器访问,使用键盘控制:小键盘方向键对应手柄方向键;空格对应手柄select键;回车对应手柄start键Ctrl对应手柄A键;Shift对应手柄B键。

手机等触屏设备浏览器访问,直接在UI触控:左下方摇杆操作为先在中心按下,然后四向摇动(类似于王者荣耀等手游);按住X键为A键连发;按住Y键为B键连发。


案例-WebGPU:

在线演示地址:https://wa-lang.org/webgpu/

WebGPU示例代码地址:https://gitee.com/wa-lang/webgpu,将仓库克隆至本地,下载最新版凹语言编译器,在控制台输入以下命令(其中 ./webgpu 为WebGPU示例代码的本地路径):

wa run ./webgpu

即可编译示例,并在本地8000端口(localhost:8000)发布页面应用。

WebGPU标准尚处于实验阶段,移动设备的浏览器普遍尚不支持,本案例建议使用Chrome等最新版的桌面版浏览器访问。


分享讲稿全文:

0. 自我介绍

大家好,我是来自凹语言社区的柴树杉。很荣幸能够参加这次KCD深圳大会,感谢主办方和各个赞助者、志愿者和参加的朋友。我要分享的题目是:WASM初体验——以凹语言为例。

凹语言是一个开源的、针对WebAssembly设计的通用编程语言。借此机会,给各位朋友介绍下。

1. 为何选择WASM为目标

1.1 背景历程(2018)——WASM代表计算的自由

首先:民主的技术,是通向计算自由的基石

WASM在2018年发布了草案,当时我们觉得WASM技术可能可以给我们计算的自由。哪怕是以开源软件为例,现在能够真正拥有自由的计算环境对个体程序员非常奢侈。而WASM计算,其核心思想是提供一套中间表达指令集和虚拟机,运行在浏览器内置的WASM虚拟机中。而WASM虚拟机的初始版本非常简单,不考虑极致性能的话,几乎每个程序员都可以自己实现一个,而这恰恰给了目前程序员最大的自由。

同时,作为W3C的国际标准,WASM技术前景非常广阔。基于这些判断,我们在18年底出版了《WebAssembly标准入门》这本书,尝试在国内推广这门技术。图书的封面引用了Ending定律的观点:所有可被编译为WASM的,终将被编译为WASM。

目前,各大主流语言都已经支持WASM。包括Docker技术的创始人也表达了类似的观点:如果WASM早点出现,可能就没有Docker了。

1.2 背景历程(2019)——WASM缺少好用的语言

到了2019年,我和丁尔男将之前在公司的实践经验总结成章,在机械工业出版了《面向WebAssembly编程》这本书。书中系统介绍了如何通过Emscripten使用C/C++来开发WASM程序。

虽然Emscripten工具链非常成熟,但是对于有经验的C++程序员来说,开发WASM程序依然是一个巨大挑战。 C++虽然支持WASM最好,但不是最好的WASM语言——我们想做一个简单易用的WASM 语言。

最开始语言的名字叫wasmlang,后来简化为Wa-lang。后来根据拼音Wa取了“凹语言”的名字。 “凹”不仅仅音同Wasm的前缀,形状也和WASM的图标很像。后来“凹”字又被社区小伙伴赋予了不同的解读。

2. 我们是如何构建以WASM为目标的凹语言的

2.1 凹语言项目筹备阶段(2019-2020)

为了启动语言项目,我们选择了以Go语言为蓝本开始设计语言,但是砍掉了WASM不需要的并发特性。 当时的V语言和TinyGo项目也给了我们很多启发。Go语言编译器本身是开源的,我们决定从Go蓝本开始这个线路极大降低了起步的难度。我们经常说,凹语言是站在Go语言的腰上成长起来的。

我们出版了《Go语言定制指南》这本书,并且首次公开了“凹语言”这个概念。在2020年,我们初步达成共识:“不做玩具车!”

2.2 凹语言开源大事记

2.3 凹语言-国内首个实现纯浏览器编译+执行(2022.9)

这是凹语言的Playground,主要是扈梦明负责实现。

2.4 凹语言-游戏-贪吃蛇(2023.1.8)

贪吃蛇是凹语言开源半年时间,用凹语言第一次实现的小游戏。其虽然是通过比较原始的API来和Canvas交互,但第一次验证了凹语言在该方向的潜力。

2.5 凹语言-入选CNCF wasm 语言全景图(2023.9)

今年,凹语言有幸进入了CNCF的wasm语言全景图,其中很多都是C/C++、Go这种世界级的著名项目。 能够和他们同列我们很荣幸,对凹语言项目组也是极大的鼓励。

3. 如何以凹语言构建WASM程序

3.1 凹语言-脚手架

为了让WASM编程简单,凹语言内置了脚手架。在安装凹语言编译器之后,只需要2步即可生成并运行一个WASM示例。

3.2 凹语言-Canvas - 简介

在之前实现贪吃蛇时,使用的是比较底层的API,在编程的过程中经常需要在凹语言和宿主JS语言之间做深度切换,对于编程体验是一个极大的挑战。

为此,在9月份项目组通过设计好用的FFI,以达到对跨JS/凹语言提供更友好API的能力。在FFI的基础上我们重新次抽象了 Canvas 包。这是完全在凹语言环境直接操作Canvas对象,大大降低跨语言编程的噪声。

3.3 凹语言-Canvas-更多案例

有了更友好的Canvas接口之后,同类型的程序构造就会变成非常容易。

这里的3个案例都是基于Canvas的例子:

  • 左边是在凹语言实现对文本信息的QR码编码为图片,然后显示在Canvas上。
  • 中间的例子也是类似,基于分型的算法产生图片,然后显示在Canvas上。
  • 右边的例子则是生命游戏,从静止的Canvas图片进化为视频,其中每一帧图片的处理逻辑依然类似。

同样,基于新的Canvas接口重新实现贪吃蛇游戏也会更加简单。有兴趣的同学可以试一试。

3.4 凹语言-游戏-任天堂NES/FS模拟器(2023.12.15)

我第一次见到小霸王游戏机是在90年代初期,当时还是上小学的时候。然后在大学期间下载过游戏模拟器来玩坦克大战、超级玛丽这些经典游戏。当我们刚开始决定做凹语言的时候,有一个共识:“不做玩具车”。其实当时的想法是,通过凹语言能够来开发一些小玩具就可以了。而NES模拟器刚好可以满足小时候不花钱玩游戏的梦想,对于凹语言刚好也是一次很好的检验。开发组的小伙伴通过通力合作最终完成了凹语言版本NES模拟器的开发工作。整个核心凹语言代码将近3千行,在手机浏览器中执行非常的流畅——我当时突然意识到当初“不做玩具车”的小目标真的达成了!

感兴趣的图像可以通过二维码打开页面体验。项目的全部代码在Gitee仓库开源。

3.5 凹语言-WebGPU-模拟土星(电脑浏览器打开)

WASM诞生之初是为了提升JS的性能,是面向的计算密集型的应用。而浏览器中的WebGPU也是通过新兴的API来释放本地硬件的计算能力。换言之,WASM和WebGPU在计算密集型这个方向是有很大交集的。因此,凹语言的联合发起人丁尔男,在凹语言FFI的基础上开始封装WebGPU特性,最终实现了模拟土星的Demo。由于WebGPU是电脑浏览器才有的能力,大家可以在电脑浏览器查看。项目的全部代码也是在Gitee开源。

3.6 小结

以上的例子都是在今年8月份凹语言发布MVP版本之后的成果。它们在本地都可以通过 wa run 命令执行,非常简单。

4. 凹语言的未来规划

通过前面展示的几个例子,我们相信凹语言已经可以用于生产,是一个可以真正开上路的车子了。对于未来发展我们依然保持灵活策略,目前阶段主要是打磨已有的功能,补充缺失的关键特性。可能包含:扩展标准库和测试;完善Canvas和WebGPU的库封装;优化性能和实现包管理工具。

5. 最后

凹语言项目是一次草根程序员对重新掌握工具的尝试。感谢凹语言的小伙伴们:项目联合发起人丁尔男,临委会委员扈梦明和赵普明,开发者通力合作完成了项目的一次次突破。我们希望通过这次努力能够获得更多的自由。

最后也欢迎大家加入凹语言社区,共同推动WASM生态的发展。对于程序员来说,这个过程既有趣又很酷!

谢谢大家!