All Projects → traefik → Yaegi

traefik / Yaegi

Licence: apache-2.0
Yaegi is Another Elegant Go Interpreter

Programming Languages

go
31211 projects - #10 most used programming language
shell
77523 projects

Projects that are alternatives of or similar to Yaegi

Brainfuck
Brainfuck interpreter written in C
Stars: ✭ 275 (-93.2%)
Mutual labels:  interpreter
Enso Archive
Looking for Enso, the visual programming language? ➡️ https://github.com/enso-org/enso
Stars: ✭ 305 (-92.46%)
Mutual labels:  interpreter
Partcl
ParTcl - a micro Tcl implementation
Stars: ✭ 313 (-92.26%)
Mutual labels:  interpreter
Rascal
The implementation of the Rascal meta-programming language (including interpreter, type checker, parser generator, compiler and JVM based run-time system)
Stars: ✭ 284 (-92.98%)
Mutual labels:  interpreter
Makejs
A sub Javascript interpreter for interpreting itself
Stars: ✭ 297 (-92.66%)
Mutual labels:  interpreter
Clojush
The Push programming language and the PushGP genetic programming system implemented in Clojure.
Stars: ✭ 305 (-92.46%)
Mutual labels:  interpreter
Swiftpascalinterpreter
Simple Swift interpreter for the Pascal language inspired by the Let’s Build A Simple Interpreter article series.
Stars: ✭ 270 (-93.32%)
Mutual labels:  interpreter
Craftinginterpreters
Repository for the book "Crafting Interpreters"
Stars: ✭ 4,298 (+6.28%)
Mutual labels:  interpreter
Awesome Graal
A curated list of awesome resources for Graal, GraalVM, Truffle and related topics
Stars: ✭ 302 (-92.53%)
Mutual labels:  interpreter
Goby
Goby - Yet another programming language written in Go
Stars: ✭ 3,296 (-18.5%)
Mutual labels:  interpreter
Lbforth
Self-hosting metacompiled Forth, bootstrapping from a few lines of C; targets Linux, Windows, ARM, RISC-V, 68000, PDP-11, asm.js.
Stars: ✭ 293 (-92.75%)
Mutual labels:  interpreter
Csml Engine
🦜 Conversational Standard Meta Language
Stars: ✭ 292 (-92.78%)
Mutual labels:  interpreter
Calculatex
in progress pretty printing calculator language
Stars: ✭ 302 (-92.53%)
Mutual labels:  interpreter
Eval5
A JavaScript interpreter written in TypeScript - Support ES5
Stars: ✭ 281 (-93.05%)
Mutual labels:  interpreter
My basic
A lightweight BASIC interpreter written in standard C in dual files. Aims to be embeddable, extendable and portable.
Stars: ✭ 316 (-92.19%)
Mutual labels:  interpreter
Melang
A script language of preemptive scheduling coroutine in single thread
Stars: ✭ 273 (-93.25%)
Mutual labels:  interpreter
Rbpf
Rust virtual machine and JIT compiler for eBPF programs
Stars: ✭ 306 (-92.43%)
Mutual labels:  interpreter
V8
The official mirror of the V8 Git repository
Stars: ✭ 18,808 (+365.08%)
Mutual labels:  interpreter
Pycparser
C parser and interpreter written in Python with automatic ctypes interface generation
Stars: ✭ 320 (-92.09%)
Mutual labels:  interpreter
Umka Lang
Umka: a statically typed embeddable scripting language
Stars: ✭ 308 (-92.38%)
Mutual labels:  interpreter

Yaegi

release Build Status GoDoc Discourse status

Yaegi is Another Elegant Go Interpreter. It powers executable Go scripts and plugins, in embedded interpreters or interactive shells, on top of the Go runtime.

Features

  • Complete support of Go specification
  • Written in pure Go, using only the standard library
  • Simple interpreter API: New(), Eval(), Use()
  • Works everywhere Go works
  • All Go & runtime resources accessible from script (with control)
  • Security: unsafe and syscall packages neither used nor exported by default
  • Support Go 1.16 and Go 1.17 (the latest 2 major releases)

Install

Go package

import "github.com/traefik/yaegi/interp"

Command-line executable

go get -u github.com/traefik/yaegi/cmd/yaegi

Note that you can use rlwrap (install with your favorite package manager), and alias the yaegi command in alias yaegi='rlwrap yaegi' in your ~/.bashrc, to have history and command line edition.

CI Integration

curl -sfL https://raw.githubusercontent.com/traefik/yaegi/master/install.sh | bash -s -- -b $GOPATH/bin v0.9.0

Usage

As an embedded interpreter

Create an interpreter with New(), run Go code with Eval():

package main

import (
	"github.com/traefik/yaegi/interp"
	"github.com/traefik/yaegi/stdlib"
)

func main() {
	i := interp.New(interp.Options{})

	i.Use(stdlib.Symbols)

	_, err := i.Eval(`import "fmt"`)
	if err != nil {
		panic(err)
	}

	_, err = i.Eval(`fmt.Println("Hello Yaegi")`)
	if err != nil {
		panic(err)
	}
}

Go Playground

As a dynamic extension framework

The following program is compiled ahead of time, except bar() which is interpreted, with the following steps:

  1. use of i.Eval(src) to evaluate the script in the context of interpreter
  2. use of v, err := i.Eval("foo.Bar") to get the symbol from the interpreter context, as a reflect.Value
  3. application of Interface() method and type assertion to convert v into bar, as if it was compiled
package main

import "github.com/traefik/yaegi/interp"

const src = `package foo
func Bar(s string) string { return s + "-Foo" }`

func main() {
	i := interp.New(interp.Options{})

	_, err := i.Eval(src)
	if err != nil {
		panic(err)
	}

	v, err := i.Eval("foo.Bar")
	if err != nil {
		panic(err)
	}

	bar := v.Interface().(func(string) string)

	r := bar("Kung")
	println(r)
}

Go Playground

As a command-line interpreter

The Yaegi command can run an interactive Read-Eval-Print-Loop:

$ yaegi
> 1 + 2
3
> import "fmt"
> fmt.Println("Hello World")
Hello World
>

Note that in interactive mode, all stdlib package are pre-imported, you can use them directly:

$ yaegi
> reflect.TypeOf(time.Date)
: func(int, time.Month, int, int, int, int, int, *time.Location) time.Time
>

Or interpret Go packages, directories or files, including itself:

$ yaegi -syscall -unsafe -unrestricted github.com/traefik/yaegi/cmd/yaegi
>

Or for Go scripting in the shebang line:

$ cat /tmp/test
#!/usr/bin/env yaegi
package main

import "fmt"

func main() {
	fmt.Println("test")
}
$ ls -la /tmp/test
-rwxr-xr-x 1 dow184 dow184 93 Jan  6 13:38 /tmp/test
$ /tmp/test
test

Documentation

Documentation about Yaegi commands and libraries can be found at usual godoc.org.

Limitations

Beside the known bugs which are supposed to be fixed in the short term, there are some limitations not planned to be addressed soon:

  • Assembly files (.s) are not supported.
  • Calling C code is not supported (no virtual "C" package).
  • Interfaces to be used from the pre-compiled code can not be added dynamically, as it is required to pre-compile interface wrappers.
  • Representation of types by reflect and printing values using %T may give different results between compiled mode and interpreted mode.
  • Interpreting computation intensive code is likely to remain significantly slower than in compiled mode.

Contributing

Contributing guide.

License

Apache 2.0.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].