凹语言在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技术前景非常广阔。基于这些判断,我们在19年底出版了《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生态的发展。对于程序员来说,这个过程既有趣又很酷!

谢谢大家!


原文链接:https://wa-lang.org/smalltalk/st0036.html

2 个赞

对计算自由有所理解,
我也是汉化了伍六一写的一个wasm虚拟机后, 才懂得了wasm到底是啥
粗略汉化: 汉化wasm/汉化网页汇编wasm的栈机.md · 冷孤独2020/用C汉字编程 - 码云 - 开源中国 (gitee.com)

不过伍六一写的这个实现没有做跨平台支持, 里面有几个函数需要改一改, 但我没有这个能力,唉, 我只能看懂很简单的C代码.自我审视可能连半桶水都达不到.

我的一些观点写在 .md 里了.

老实说,网页汇编给我的启发就是, 终于可以摆脱在C上研究中文汉字编程了.
要速度有速度, 栈机又简单, 原生支持Unicode, 跨平台跨各种处理器,
可以说是一个理想的平台. 只恨没有早一点探索这个技术.
我15 16年那会儿就想找个简单的编程语言练习编程, 那会儿啥都不懂, 对C也是一知半解,
更是听都没听说过除C以外的编程范式,如lisp 符号表达式, forth没闻过, forth19年才接触到.
这么些年一直断断续续研究底层, 比如编码, 汇编, 机器码, 各种格式, 也汉化了很多编译器解释器, 大多遇到一点阻难就无法进行, 因为根本找不到人请教,
直到2022年底, chatgpt横空出世, 这一年多的时间, 我通过问大模型, 才知道了过去几年, 好多简单又基础的问题(请教别人的时候别人不屑并嘲讽), 之后我就把以前学过的研究过的连起来, 才得到如今对计算机与计算的理解.

这让我坚定了一个想法, 走简化编程的道路.

或许正是这个思路指导我关注wasm网页汇编, 还有lisp, forth, 最近还学了SICP部分章节, 发现原来编程真的可以很简单.

这几天萌生一个想法,

就是基于wasm做一个内核底层都是中文汉字的中文操作系统, 但光凭我一个人无法做到. 发出来, 希望大佬们看到, 能给出评价否, 这个想法是否行得通.

我的预设, 预想设计是这样的:

操作系统虚拟化;
把内核写在wasm上, 而之上的各种运行库, 服务与组件, 图形界面壳也如此.
原生提供Unicode支持, 一开始就写出输入法支持中文汉字的输入.
若要实现这一点, 就需要写一个能运行在物理裸机上的wasm虚拟机,
除此之外, 还需要跟这个虚拟机配套的设施, 比如某种接口,
用来访问除CPU内存以外的其它物理硬件,
通过接口映射到wasm虚拟机里去, 这样就可以被虚拟机上的各种程序访问和利用.

写一个中文版lisp-scheme编译器与解释器,和一个中文版forth解释器/编译器,
分别把它们都生成为wasm虚拟机可以执行的虚拟机器码,

之后, 用它们写内核, 写各种运行库, 服务与组件, 图形界面壳,
中文scheme或中文forth, 哪种功能适合用哪种语言就用相应的语言写.
当然, 也可以选定一种固定的来写全部,

波兰与逆波兰, 前缀或后缀, 可能有不同的适用区域.

如此一来,我们就可以获得一个真●跨平台的操作系统啦, 几乎不会受到未来新硬件的干扰. 过去的硬件通吃. 手机平板更不用说. 未来还有机器人的各种处理器.

之后再把数据库的功能也原生集成到内核里: 如何评价在数据库之上运行操作系统的dbos? - 知乎 (zhihu.com)

未来大模型必定是流行的趋势,
所以运行大模型需要用到的库, 比如矩阵, 变形器算法, 都原生集成到内核里,

这样类型的操作系统, 不知能否一战.
集成数据库功能可以从基因层面支持大模型的检查点文件,即-权重文件.