用Rust以脚本语言的方式实现Go语言标准

581 阅读3分钟

// 转发一下自己项目 Goscript 的readme

Playground

goscript.dev/

啥?

  • 简单地说,它是另一个风味的Go语言。
  • 其作用是用于其他的Rust项目,有时候你需要用一个更简单的语言封装和调用底层的Rust代码。就像Lua之于Redis/WoW,或者Python之于NumPy/Sublime Text。

为?

  • 当你的Rust项目需要一个用Rust写的脚本语言。
  • Go语言简单易学且已经被广泛使用。
  • Rust程序员应该已经体会到编译器是编程助手,作为一个严格类型的语言,Goscript相对于其他动态语言更能帮你写好程序,特别是代码量变大的时候。

咋?

  • 有六个项目:
    • parser 把源代码变成AST,移植自Go官方代码。
    • type checker 基于AST做类型推倒和类型检查,也移植自Go官方代码。
    • codegen 基于AST和类型信息生成字节码。
    • vm 运行字节码.
    • std 官方库,移植自Go官方库.
    • engine 包含官方库的native部分,再加上简单封装.

时?

  • 本次readme更新可以看作是alpha版本发布。
  • 几乎所有的语言特性都实现了(pre-1.18版本,即不包含范型)。
  • 移植了部分官方库,且这部分也没完全好。
  • 还有很多其他工作要做,比如API整理,文档,大量完备的测试用例等。
  • 总体上bug可能还不少,但是已经能通过很多测试用例
  • 预期在一年以内发布beta版本。

谁?

  • 这是个新语言吗?

    不是,因为它实现了Go语言的规范,所以理论上就是Go语言(的一种)。它可以看作是一个Go和Python的混血:用Python语言的实现方式实现了Go语言。所以你叫它脚本语言也对。

  • 为什么不弄个新语言?

    设计一门语言比实现一门语言难多了,自认为没有能力设计一门语言好到能让其他程序员愿意学习它的新的“更好的”语法。Go作为脚本语言可能不完美,但是我觉得够用。

  • 为什么不直接用 Python/Lua (在Rust项目中)?

    大家会用Python/Lua的, Goscirpt只是提供了另外一个选项,强类型系统可以帮你写好代码而不是限制你。

  • Goscript快吗/慢吗?

    可能比你想象的要慢。它是没有JIT的基于虚拟机运行的,性能上存在上限,而且我们需要在性能和复杂度上找平衡,不希望它大到不适合被嵌入。目前我们只能期望一个跟Python相当的性能,远期优化能做到什么地步目前不好预测。

  • Goscirpt支持多线程/并行吗?

    不支持,因为多线程支持会降低单线程的性能,并且写起来也复杂很多。我猜这也是Python/Lua不支持并行的原因。不过对并发的支持是无与伦比的好:),因为有goroutine。不排除将来用库的方式支持并行。

  • 什么时候能真正用?

    如前面提到的,我希望能在一年内达到生产可用的成熟度。这个项目是三年前开始的,我会尽可能完成它。

  • 可以怎么参与项目?

    • 提issue。
    • 小的改动可以直接提PR。
    • 大的改动请先联系我讨论一下。

就想跑点Go代码试试

  • 安装最新版的Rust。
  • Clone本项目。
  • 到goscript/engine目录。
  • temp.gos 写你想写的Go代码。
  • 运行 cargo test temp -- --nocapture
  • 或者参照test.rs 弄个可以执行Go代码的exe。
  • 你的代码跑不了?不好意思,不过你可以看看测试文件夹里那些可以跑的代码。