#goscript #vm #golang #编程语言

go-vm

GoScript项目的虚拟机

5个版本

0.1.5 2023年9月12日
0.1.4 2023年9月8日
0.1.2 2023年7月4日
0.1.1 2023年7月4日
0.1.0 2023年4月4日

#410编程语言

Download history 13/week @ 2024-03-16 3/week @ 2024-03-23 34/week @ 2024-03-30 15/week @ 2024-04-06 11/week @ 2024-04-13 13/week @ 2024-04-20 14/week @ 2024-04-27 19/week @ 2024-05-04 15/week @ 2024-05-11 18/week @ 2024-05-18 14/week @ 2024-05-25 17/week @ 2024-06-01 12/week @ 2024-06-08 18/week @ 2024-06-15 25/week @ 2024-06-22 5/week @ 2024-06-29

63 每月下载量
5 crates 中使用

BSD-2-Clause

550KB
14K SLoC

Goscript

一个Golang规范的替代实现,用Rust编写,用于嵌入或包装。

中文

网站

https://goscript.dev/

什么是

  • 换句话说,它只是Go的另一种风味。
  • 它设计用于与其他Rust代码协同工作,在你希望为你的库/应用程序的用户提供使用“更简单”的语言调用原生(Rust)代码的能力时,比如Lua对Redis/WoW,或Python对NumPy/Sublime Text一样。

为什么

  • 它是Rust的本地语言,你的Rust项目正在寻找一种脚本语言。
  • Go很棒且易于使用,你也熟悉它。
  • 对于Rust程序员来说,编译器作为严格类型语言的帮助应该非常容易理解,与动态类型语言相比,GoScript的类型检查器帮助很大,尤其是当你的代码库变大时。

如何

Goscript 内部结构 I:概述

何时

  • 此README更新作为alpha版本发布公告。
  • 几乎所有语言功能都按规范实现(pre-1.18,即不包括泛型)。
  • 部分标准库已移植,但尚未完全工作。
  • 除了库之外,还有很多工作要做,比如API清理、文档和大量测试用例。
  • 总体来说,尽管通过了数十个测试用例 (链接),但它被认为是存在bug的。
  • 预计一年后会有beta版本发布。

常见问题解答

  • 这是一个新的语言吗?

    不是的,这是定义上的Go。你可以将其视为Go和Python的混合体,它采用了Go的设计并以Python的方式实现。因此,我认为也称其为脚本语言也是公平的。

  • 为什么不设计一种新语言?

    实现一种语言比设计一种语言容易得多,我不认为我有能力设计一种人们愿意投入时间学习的语言。Go可能不是一个完美的脚本语言,但对我来说它效果不错。

  • 为什么不直接使用Python/Lua(与Rust一起)?

    人们会做/会做,Goscript 可以是一个合理的替代品,强类型系统可以是你的创意的朋友而不是敌人。

  • Goscript 快/慢?

    恐怕它可能比你想象的要慢。它是一个基于虚拟机的实现,没有 JIT,因此有一个上限。此外,性能和项目复杂性之间有一个权衡,我们不想让嵌入语言变得太大。目前,你只能期望一个与 Python 相当的性能,我无法确定我们长期优化的极限在哪里。

  • Goscript 支持多线程/并行化吗?

    不,这会损害单线程性能,并且会使实现变得更加困难。我想这也是 Python/Lua 不支持并行化的原因。但是它通过 goroutine 以极好的方式支持并发:)。未来也有可能通过库引入并行化。

  • 我们什么时候可以使用 Goscript?

    如上所述,我希望我们能在一年内达到生产就绪。我三年前开始了这个项目,我会尽我所能不放弃它。

  • 我如何帮忙?

    • 报告问题。
    • 如果只是小修复,请发送 PR。
    • 如果您计划贡献复杂的更改,请先与我讨论。

只是想看看它是否可以运行 Go 代码

  • 确保您的 Rust 安装是最新的。
  • 克隆此存储库。
  • 转到 goscript/engine 目录。
  • 将您想要的内容放入 temp.gos
  • 运行 cargo test temp -- --nocapture
  • 或者根据 test.rs 创建一个可以执行 Go 代码的可执行文件。
  • 如果你的代码无法运行,很抱歉,你可以查看测试文件夹中那些可以运行的代码。

Goscript_Readme_中文版

Go 语言规范的非官方实现,用于 Rust 项目的内嵌或封装。

网站

https://goscript.dev/

什么?

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

为什么?

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

怎么?

Goscript 设计原理一: 总览

什么时候?

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

谁?

  • 这是个新语言吗?

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

  • 为什么不设计一门新语言?

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

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

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

  • Goscript 快/慢?

    可能比你想象的要慢。它是没有 JIT 的基于虚拟机运行的,性能上存在上限,而且我们需要在性能和复杂度上找平衡,不希望它变得太大以至于不适合嵌入。目前我们只能期望一个与 Python 相当的性能,远期优化的极限目前尚不清楚。

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

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

  • 什么时候能真正使用?

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

  • 如何参与项目?

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

就想跑点 Go 代码试试

  • 安装最新版的 Rust。
  • 克隆本项目。
  • 到 goscript/engine 目录。
  • temp.gos 编写你想要编写的 Go 代码。
  • 运行 cargo test temp -- --nocapture
  • 或者参照 test.rs 创建一个可以执行 Go 代码的可执行文件。
  • 如果你的代码无法运行,很抱歉,不过你可以查看测试文件夹中那些可以运行的代码。

lib.rs:

这个 crate 是 Goscript 项目的组成部分。有关更多信息,请参阅 https://goscript.dev

功能

  • async:支持通道和 goroutine
  • btree_map: 使其使用 BTreeMap 而不是 HashMap
  • instruction_pos: 将指令位置添加到字节码中以便调试
  • serde_borsh: 使用 Borsh 提供对字节码的 Serde 支持

依赖项

~1.3–2.2MB
~47K SLoC