#golang #goscript #type-checker #compiler

go-types

Goscript项目的类型检查器

4个版本

0.1.5 2023年9月12日
0.1.4 2023年9月8日
0.1.1 2023年5月27日
0.1.0 2023年4月4日

#316 in 编程语言

每月42次下载
3 个crate中(2个直接) 使用

BSD-3-Clause

780KB
18K 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的混合体,它以Python的方式实现了Go的设计。因此,我认为称它为脚本语言也是合理的。

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

    实现一种语言比设计一种语言要容易得多,我认为我不具备设计出人们愿意投入时间学习的那种语言的能力。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:

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

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

功能

  • btree_map:让它使用BTreeMap而不是HashMap

依赖项

~680KB
~15K SLoC