The Tengo Language
Tengo is a small, dynamic, fast, secure script language for Go.
Tengo is fast and secure because it's compiled/executed as bytecode on stack-based VM that's written in native Go.
/* The Tengo Language */
each := func(seq, fn) {
for x in seq { fn(x) }
}
sum := func(init, seq) {
each(seq, func(x) { init += x })
return init
}
n := sum(0, [1, 2, 3]) // == 6
s := sum("", [1, 2, 3]) // == "123"
Run this code in the Playground
Features
- Simple and highly readable Syntax
- Dynamic typing with type coercion
- Higher-order functions and closures
- Immutable values
- Garbage collection
- Securely Embeddable and Extensible
- Compiler/runtime written in native Go (no external deps or cgo)
- Executable as a standalone language / REPL
Benchmark
|
fib(35) |
fibt(35) |
Type |
Go |
58ms |
4ms |
Go (native) |
Tengo |
4,180ms |
5ms |
VM on Go |
Lua |
1,695ms |
3ms |
Lua (native) |
go-lua |
5,163ms |
5ms |
Lua VM on Go |
GopherLua |
5,525ms |
5ms |
Lua VM on Go |
Python |
3,097ms |
27ms |
Python (native) |
starlark-go |
15,307ms |
5ms |
Python-like Interpreter on Go |
gpython |
17,656ms |
5ms |
Python Interpreter on Go |
goja |
6,876ms |
5ms |
JS VM on Go |
otto |
81,886ms |
12ms |
JS Interpreter on Go |
Anko |
97,517ms |
14ms |
Interpreter on Go |
* fib(35): Fibonacci(35)
* fibt(35): tail-call version of Fibonacci(35)
* Go does not read the source code from file, while all other cases do
* See here for commands/codes used
References