V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
chai2010
V2EX  ›  程序员

凹语言在 KCD 深圳 2023

  •  
  •   chai2010 · 132 天前 · 1038 次点击
    这是一个创建于 132 天前的主题,其中的信息可能已经有所发展或是发生改变。

    凹语言项目联合发起人柴树杉在 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

    spidah
        1
    spidah  
       131 天前
    和 moonbit 比有什么优势
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2795 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 05:48 · PVG 13:48 · LAX 22:48 · JFK 01:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.