Forked and more actively developed tengo version
Find a file
Daniel 61890b15cb
module refactor (#148)
* wip

* move print and JSON functions to modules

* builtin functions are not replacable now

* builtin functions are added for default nil symbol table

* importables: builtin modules and source modules

* refactoring runtime tests

* fix tests

* update documentation

* cleanup

* clean up cli

* fix REPL prints
2019-03-18 08:15:26 -07:00
assert limit max object allocations (#129) 2019-03-06 17:20:05 -08:00
cli module refactor (#148) 2019-03-18 08:15:26 -07:00
cmd module refactor (#148) 2019-03-18 08:15:26 -07:00
compiler module refactor (#148) 2019-03-18 08:15:26 -07:00
docs module refactor (#148) 2019-03-18 08:15:26 -07:00
objects module refactor (#148) 2019-03-18 08:15:26 -07:00
runtime module refactor (#148) 2019-03-18 08:15:26 -07:00
script module refactor (#148) 2019-03-18 08:15:26 -07:00
stdlib module refactor (#148) 2019-03-18 08:15:26 -07:00
.gitignore add goreleaser deploy to travis 2019-01-30 00:52:55 -08:00
.goreleaser.yml Decoupled stdlib from vm, script and compiler (#126) 2019-03-04 10:21:39 -08:00
.travis.yml add goreleaser deploy to travis 2019-01-30 00:52:55 -08:00
LICENSE Create LICENSE 2019-01-11 01:17:07 -08:00
Makefile module refactor (#148) 2019-03-18 08:15:26 -07:00
README.md update benchmark result with v1.15.0 (#141) 2019-03-14 01:31:40 -07:00
tengo.go Limit the maximum size of string/bytes values (#121) 2019-03-01 10:48:02 -08:00

The Tengo Language

GoDoc Go Report Card Build Status

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 67ms 4ms Go (native)
Tengo 3,104ms 5ms VM on Go
Lua 1,754ms 3ms Lua (native)
go-lua 5,121ms 5ms Lua VM on Go
GopherLua 5,499ms 5ms Lua VM on Go
Python 2,859ms 26ms Python (native)
starlark-go 16,846ms 5ms Python-like Interpreter on Go
gpython 18,638ms 6ms Python Interpreter on Go
goja 6,626ms 5ms JS VM on Go
otto 88,489ms 13ms JS Interpreter on Go
Anko 108,415ms 15ms 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