6 个版本
0.1.5 | 2023年9月12日 |
---|---|
0.1.4 | 2023年9月8日 |
0.1.3 | 2023年7月4日 |
0.1.1 | 2023年5月27日 |
0.1.0 | 2023年4月4日 |
#508 in 开发工具
每月 25 次下载
用于 2 个 crates(通过 go-engine)
1.5MB
31K SLoC
Goscript
使用 Rust 编写的 Golang 规范的替代实现,用于嵌入或包装。
网站
是什么
- 换句话说,它只是 Go 的另一种风味。
- 它设计用于与 Rust 代码一起工作,在这种情况下,您希望为库/应用程序的用户提供使用“更简单”的语言调用本地(Rust)代码的能力,就像 Lua 对 Redis/WoW 或 Python 对 NumPy/Sublime Text 所做的那样。
为什么
- 它是 Rust 的本地实现,您的 Rust 项目正在寻找一种脚本语言。
- Go 很好且易于使用,您对其也很熟悉。
- 对于 Rust 程序员来说,应该非常清楚编译器有帮助,作为一个严格类型化的语言,与动态类型语言相比,Goscript 的类型检查帮助很大,尤其是当您的代码库变得更大时。
如何
何时
- 本说明更新作为 alpha 版本发布公告。
- 几乎所有语言功能都按照规范实现(pre-1.18,即不包括泛型)。
- 部分标准库已被移植,但尚未完全工作。
- 除了库之外,还有很多工作要做,例如 API 清理、文档和大量测试用例。
- 总的来说,尽管它通过了数十个测试用例,但仍然被认为存在错误。
- 预计大约一年后会有一个 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
:
这个包是 Goscript 项目的组成部分。请参考https://goscript.dev获取更多信息。
功能
async
:支持通道和goroutinebtree_map
:使用 BTreeMap 而不是 HashMap
依赖项
~2.5MB
~53K SLoC