V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
jiyinyiyong
V2EX  ›  分享创造

用 Cirru 语法运行 WebAssembly 的 Hello World

  •  
  •   jiyinyiyong ·
    jiyinyiyong · 2015-10-18 18:59:21 +08:00 · 3258 次点击
    这是一个创建于 3328 天前的主题,其中的信息可能已经有所发展或是发生改变。

    先说明一下, WebAssembly 目前没有定稿, 现在做的只是玩具

    不过实际上推进蛮快的, 最近追的新闻, OCaml C# JavaScript 的实现都看到了
    特别是在 Twitter 上看 @indutny 狂刷新闻, 只知道这人是 Node core team member...
    https://twitter.com/indutny
    WebAssembly 最近相关的消息可以看新闻:
    https://auth0.com/blog/2015/10/14/7-things-you-should-know-about-web-assembly/

    然后 @indutny 搞的几个库包括:
    https://github.com/indutny/wasm-cfg
    https://github.com/indutny/wasm-jit/
    https://github.com/indutny/wasm-ast/
    https://github.com/indutny/wasm-cli

    基本上是模仿 JavaScript 定义了一套 AST, 设计了 C 风格的语法
    然后自己解析, 再以 JIT 的形式生成代码并且执行
    底层用了 jit.js 和 nmap.js , 主要是 C++ 我看不懂这块不管了

    总之就是这样的语法, 安装 wasm-cli 以后可以命令行执行

    void main() {
      i32.store(addr.from_64(i64.const(0)), i32.const(0x6c6c6568));
      i32.store(addr.from_64(i64.const(4)), i32.const(0x6177206f));
      i32.store(addr.from_64(i64.const(8)), i32.const(0x000a6d73));
    
      std::print(addr.from_64(i64.const(0)),
                 addr.from_64(i64.const(11)));
    }
    
    export main
    
    Error: language "wast" is not supported

    讲了一大堆, 然后我的做的是什么?

    反正 Cirru 语法已经能写 JavaScript AST 很久了, 于是开始搞 WebAssembly 的 AST
    不过注意下这个 AST 不是官方的, 以后很可能有变数
    总之我写了 npm 模块, 可以从 Cirru 语法生成想要的 AST 了
    https://github.com/Cirru/cirru-wasm-ast
    https://github.com/Cirru/cirru-wasm-cli

    所以, 现在可以全局安装 cirru-wasm-cli 这个模块, 然后创建一个 hello-world.cirru 文件:

    \ (void main) ()
      i32.store (addr.from_64 (i64.const 0)) (i32.const 0x6c6c6568)
      i32.store (addr.from_64 (i64.const 4)) (i32.const 0x6177206f)
      i32.store (addr.from_64 (i64.const 8)) (i32.const 0x000a6d73)
    
      std::print
        addr.from_64 (i64.const 0)
        addr.from_64 (i64.const 11)
    
    export main
    

    然后执行 cirru-wasm-cli hello-world.cirru 就可以看到 hello wasm 打印了
    因为是底层代码, 所以 hello 在源码里看不出来... 暴露了我看不懂十六进制 - -!

    他的 AST 我从他的 tests 里扒了一遍, 虽然以后可能变, 如果有人感兴趣看的话:
    https://github.com/Cirru/cirru-wasm-ast/blob/master/src/ast.cirru
    https://github.com/indutny/wasm-ast/blob/master/test/parser-test.js

    到这里位置上边的部分就结束了


    另外还有个玩具... 前面说了, WebAssembly 没有官方规定的标准的文本语法
    所有有的地方是这样写的, 用 S 表达式..
    https://github.com/WebAssembly/spec/blob/master/ml-proto/test/imports.wast
    举个例子就像是这样...

    (module
      (export "test" 0)
      (func (result i32)
        (i32.add (i32.const 1) (i32.const 2))))
    

    Cirru 对付圆括号那是家常便饭了.. 于是早一点的时候就搞了一个工具
    https://github.com/Cirru/sexpr-wasm-json
    大致可以用来把下边的语法解析一下, 然后把上边的括号引号全生成出来

    module
      export :test 0
      func (result i32)
        i32.add (i32.const 1) (i32.const 2)
    

    总之社区已有两种的语法, 一种 Lisp 风格一种 C 风格, 我这边搞出一个缩进风格
    对 WebAssembly 还有缩进语法有兴趣的同学来一起看看以后怎么搞~

    3 条回复    2015-10-20 13:19:05 +08:00
    ChiangDi
        1
    ChiangDi  
       2015-10-18 20:06:39 +08:00
    为何对缩进有这样的执念,我很多时候宁愿敲敲括号或者分号。。。
    jiyinyiyong
        2
    jiyinyiyong  
    OP
       2015-10-18 20:39:31 +08:00
    @ChiangDi 我不是处女座我觉得世界上比我执念的人有的是只是我执在缩进语法上边了
    编程搞不好是我一辈子的事情, 真的让我多敲个几十万次括号分号真心难受
    而且这种语法上的小坑搞不好还会影响到编程时候的思路..
    再说学好编译原理装装逼不是挺好玩的一件事情么
    bramblex
        3
    bramblex  
       2015-10-20 13:19:05 +08:00 via iPad
    @ChiangDi 如果你能搞清楚一堆右花括号的话…
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2883 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 15:10 · PVG 23:10 · LAX 07:10 · JFK 10:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.