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 在 编程语言 中
63 每月下载量
在 5 crates 中使用
550KB
14K SLoC
Goscript
一个Golang规范的替代实现,用Rust编写,用于嵌入或包装。
网站
什么是
- 换句话说,它只是Go的另一种风味。
- 它设计用于与其他Rust代码协同工作,在你希望为你的库/应用程序的用户提供使用“更简单”的语言调用原生(Rust)代码的能力时,比如Lua对Redis/WoW,或Python对NumPy/Sublime Text一样。
为什么
- 它是Rust的本地语言,你的Rust项目正在寻找一种脚本语言。
- Go很棒且易于使用,你也熟悉它。
- 对于Rust程序员来说,编译器作为严格类型语言的帮助应该非常容易理解,与动态类型语言相比,GoScript的类型检查器帮助很大,尤其是当你的代码库变大时。
如何
何时
- 此README更新作为alpha版本发布公告。
- 几乎所有语言功能都按规范实现(pre-1.18,即不包括泛型)。
- 部分标准库已移植,但尚未完全工作。
- 除了库之外,还有很多工作要做,比如API清理、文档和大量测试用例。
- 总体来说,尽管通过了数十个测试用例 (链接),但它被认为是存在bug的。
- 预计一年后会有beta版本发布。
谁
- 邮箱:
pb01005051
at Gmail。 - discord:加入
常见问题解答
-
这是一个新的语言吗?
不是的,这是定义上的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 项目的内嵌或封装。
网站
什么?
- 简单地说,它是另一种风格的 Go 语言。
- 其作用是用于其他的 Rust 项目,有时候你需要用一个更简单的语言封装和调用底层的 Rust 代码。就像 Lua 对于 Redis/WoW,或者 Python 对于 NumPy/Sublime Text。
为什么?
- 当你的 Rust 项目需要一个用 Rust 编写的脚本语言时。
- Go 语言简单易学且已经被广泛使用。
- Rust 程序员应该已经体会到编译器是编程助手,作为一个严格类型的语言,Goscript 相对于其他动态语言更能帮助你写出好程序,特别是当代码量变大时。
怎么?
什么时候?
- 本次 readme 更新可以看作是 alpha 版本发布。
- 几乎所有语言特性都已实现(pre-1.18 版本,即不包括泛型)。
- 移植了部分官方库,且这部分也没完全完善。
- 还有很多其他工作要做,比如 API 整理,文档,大量完备的测试用例等。
- 总体上可能还存在不少 bug,但已经可以通过许多 测试用例。
- 预期在一年内发布 beta 版本。
谁?
- 邮箱:
pb01005051
at Gmail。 - discord: 加入
问
-
这是个新语言吗?
不是,因为它实现了 Go 语言规范,所以理论上就是 Go 语言(的一种)。它可以看作是 Go 和 Python 的混血:用 Python 语言的实现方式实现了 Go 语言。所以你可以称它为脚本语言。
-
为什么不设计一门新语言?
设计一门语言比实现一门语言难得多,自认为没有能力设计一门语言,其新的“更好的”语法能让其他程序员愿意学习。Go 作为脚本语言可能不完美,但我认为足够使用。
-
为什么不直接使用 Python/Lua(在 Rust 项目中)?
大家都会使用 Python/Lua 的,Goscirpt 只是提供了一个额外的选择,强类型系统可以帮助你写出更好的代码,而不是限制你。
-
Goscript 快/慢?
可能比你想象的要慢。它是没有 JIT 的基于虚拟机运行的,性能上存在上限,而且我们需要在性能和复杂度上找平衡,不希望它变得太大以至于不适合嵌入。目前我们只能期望一个与 Python 相当的性能,远期优化的极限目前尚不清楚。
-
Goscript 支持多线程/并行吗?
不支持,因为多线程支持会降低单线程性能,并且编写起来也复杂得多。我猜这也是 Python/Lua 不支持并行的原因。但是对并发的支持是无与伦比的,因为有 goroutine。未来也不排除通过库的方式支持并行。
-
什么时候能真正使用?
如前面提到的,我希望能在一年内达到生产可用的成熟度。这个项目是三年前开始的,我会尽我所能完成它。
-
如何参与项目?
- 提 issue。
- 小的改动可以直接提 PR。
- 大的改动请先联系我讨论一下。
就想跑点 Go 代码试试
lib.rs
:
这个 crate 是 Goscript 项目的组成部分。有关更多信息,请参阅 https://goscript.dev。
功能
async
:支持通道和 goroutinebtree_map
: 使其使用 BTreeMap 而不是 HashMapinstruction_pos
: 将指令位置添加到字节码中以便调试serde_borsh
: 使用 Borsh 提供对字节码的 Serde 支持
依赖项
~1.3–2.2MB
~47K SLoC