3个版本

0.1.5 2023年9月12日
0.1.4 2023年9月8日
0.1.0 2023年4月4日

634编程语言 中排名

Download history 20/week @ 2024-03-11 21/week @ 2024-03-18 39/week @ 2024-03-25 117/week @ 2024-04-01 14/week @ 2024-04-08 18/week @ 2024-04-15 23/week @ 2024-04-22 19/week @ 2024-04-29 30/week @ 2024-05-06 18/week @ 2024-05-13 27/week @ 2024-05-20 19/week @ 2024-05-27 21/week @ 2024-06-03 21/week @ 2024-06-10 18/week @ 2024-06-17 28/week @ 2024-06-24

每月下载 90
用于 7 个crate(4个直接使用)

BSD-3-Clause

205KB
5.5K SLoC

Goscript

Go语言规范的替代实现,用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清理、文档和更多的测试用例。
  • 总的来说,它被认为是有缺陷的,尽管它通过了数十个测试用例 链接
  • 预计大约一年后会有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,Goscript 只是一个额外的选项,强类型系统可以帮助你写出更好的代码,而不是限制你。

  • 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:

此软件包是 Goscript 项目的组成部分。请参阅https://goscript.dev以获取更多信息。

它是从 Go 标准库的解析器https://github.com/golang/go/tree/release-branch.go1.12/src/go/parser的移植。

用法

fn parse_file() {
    let source = "package main ...";
    let mut fs = go_parser::FileSet::new();
    let o = &mut go_parser::AstObjects::new();
    let el = &mut go_parser::ErrorList::new();
    let (p, _) = go_parser::parse_file(o, &mut fs, el, "./main.go", source, false);
    print!("{}", p.get_errors());
}

功能

  • btree_map:使其使用 BTreeMap 而不是 HashMap

依赖项

~0–465KB