Tengo语言:为Go打造的轻量级动态脚本语言
tengo A fast script language for Go 项目地址: https://gitcode.com/gh_mirrors/te/tengo
项目介绍
Tengo 是一款专为Go语言设计的小型、动态、快速且安全的脚本语言。它不仅具备高效的编译和执行能力,还拥有简洁易读的语法,使得开发者能够轻松编写和维护脚本代码。Tengo的核心优势在于其基于栈的虚拟机,完全由Go语言实现,无需外部依赖或cgo,确保了代码的安全性和执行效率。
/* The Tengo Language */
fmt := import("fmt")
each := func(seq, fn) {
for x in seq { fn(x) }
}
sum := func(init, seq) {
each(seq, func(x) { init += x })
return init
}
fmt.println(sum(0, [1, 2, 3])) // "6"
fmt.println(sum("", [1, 2, 3])) // "123"
在 Tengo Playground 中体验上述代码
项目技术分析
Tengo语言的核心技术在于其独特的虚拟机设计。该虚拟机采用栈结构,能够高效地执行编译后的字节码,从而实现快速的脚本执行。此外,Tengo支持动态类型和类型强制转换,使得开发者能够灵活地处理不同类型的数据。高阶函数和闭包的引入,进一步增强了语言的表达能力。
项目及技术应用场景
Tengo语言的应用场景非常广泛,特别适合以下几种情况:
- 规则引擎:Tengo的动态特性和高效执行能力使其成为构建复杂规则引擎的理想选择。
- 状态机:通过Tengo脚本,可以轻松实现状态机的逻辑,简化状态管理的复杂性。
- 数据管道:在数据处理流程中,Tengo可以作为中间脚本语言,灵活处理数据转换和过滤。
- 转译器:Tengo还支持与其他语言的互操作,可以用于实现简单的转译功能。
项目特点
- 简洁易读的语法:Tengo的语法设计简洁明了,易于理解和维护。
- 动态类型与类型强制转换:支持动态类型和类型强制转换,使得数据处理更加灵活。
- 高阶函数与闭包:支持高阶函数和闭包,增强了代码的复用性和表达能力。
- 安全嵌入与扩展:Tengo可以安全地嵌入到Go应用中,并支持扩展,满足不同场景的需求。
- 独立运行与REPL:除了嵌入到Go应用中,Tengo还可以作为独立的脚本语言运行,并提供REPL环境,方便开发者进行交互式编程。
快速开始
go get github.com/d5/tengo/v2
以下是一个简单的Go示例代码,展示了如何编译和运行Tengo脚本,并传递输入输出值:
package main
import (
"context"
"fmt"
"github.com/d5/tengo/v2"
)
func main() {
// 创建一个新的Script实例
script := tengo.NewScript([]byte(
`each := func(seq, fn) {
for x in seq { fn(x) }
}
sum := 0
mul := 1
each([a, b, c, d], func(x) {
sum += x
mul *= x
})`))
// 设置值
_ = script.Add("a", 1)
_ = script.Add("b", 9)
_ = script.Add("c", 8)
_ = script.Add("d", 4)
// 运行脚本
compiled, err := script.RunContext(context.Background())
if err != nil {
panic(err)
}
// 获取值
sum := compiled.Get("sum")
mul := compiled.Get("mul")
fmt.Println(sum, mul) // "22 288"
}
或者,如果你只需要评估一个简单的表达式,可以使用 Eval
函数:
res, err := tengo.Eval(ctx,
`input ? "success" : "fail"`,
map[string]interface{}{"input": 1})
if err != nil {
panic(err)
}
fmt.Println(res) // "success"
参考资料
为什么叫Tengo? 这个名字来源于村上春树的小说《1Q84》。
tengo A fast script language for Go 项目地址: https://gitcode.com/gh_mirrors/te/tengo