gi

package module
v0.0.0-...-06bba65 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 31, 2026 License: MIT Imports: 2 Imported by: 0

README

Go GoDoc go.mod Go version codecov Go Report Card examples

gi is a Go interpreter that creates an executable representation of a Go program from source. It offers a virtual machine that can step through such a program and allows access to the full stack and scoped variables (environment).

gi logo

gi is implemented using Go reflection API so one can expect 10x slower program execution depending on the complexity.

mission

runtime

  • support type parameterization (generics)
  • support Go modules (will require pre-compilation)

debugging

  • offer a DAP interface
  • handle source changes during a debugging session:
    • change a function definition
    • change a struct definition
    • add package constant|variable
  • debugging concurrent programs

status

This is work in progress. See examples for runnable examples using the gi cli. See status for the supported Go language features.

install

go install github.com/emicklei/gi/cmd/gi@latest

Use CLI

run

gi run .

step

gi step .

DAP server

gi dap --listen=127.0.0.1:52950 --log-dest=3 --log

For development, the following environment variables control the execution and output:

  • GI_TRACE=1 : produce tracing of the virtual machine that executes the statements and expressions.
  • GI_CALL=out.dot : produce a Graphviz DOT file showing the call graph.

Use as package

run a program

package main

import "github.com/emicklei/gi"

func main() {
	pkg, _ := gi.Parse(`package main

import "fmt"

func Hello(name string) int {
	fmt.Println("Hello,", name)
	return 42
}
`)
	answer, err := gi.Call(pkg, "Hello", "3i/Atlas")
}

use of in-process DAP (Debug Adapter Protocol)

	gopkg, _ := pkg.LoadPackage(".", nil)
	ipkg, _ := pkg.BuildPackage(gopkg)
	runner := pkg.NewDAPAccess(pkg.NewVM(ipkg))
	runner.Launch("main", nil)
	for {
		if err := runner.Next(); err != nil {
			if err == io.EOF {
				return
			}
		}
		_ = runner.Threads()
		_ = runner.StackFrames(...)
		_ = runner.Scopes(...)
		_ = runner.Variables(...)
	}

Limitations

The following features are not supported:

  • no functions/consts/vars from the following packages:
    • debug
    • go
    • syscall
    • runtime/testdata
  • these symbols are not available because of NumericOverflow in reflect.Value:
    • hash/crc64.ECMA
    • hash/crc64.ISO
    • math.MaxUint
    • math.MaxUint64
Credits

The build pipeline uses all programs of Go By Example to check whether they are executable with gi.

© 2026. https://ernestmicklei.com . MIT License

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func Call

func Call(p *pkg.Package, funcName string, params ...any) ([]any, error)

Call calls a function named funcName in the given package pkg with the provided parameters values. It returns the results of the function call and an error if any occurred during the call.

func LoadPackage

func LoadPackage(filePath string) (*pkg.Package, error)

Loads and builds the Go package located at the specified file path. filePath is the file path to a folder that contains Go files.

func Parse

func Parse(source string) (*pkg.Package, error)

Parse parses the provided Go source code string and returns a Package representation of it. The source must be valid Go, e.g. main package with a main function. It cannot have external dependencies ; only standard library packages are allowed.

func RegisterFunction

func RegisterFunction(pkgPath string, funcName string, fn reflect.Value)

RegisterFunction registers an external function for use within gi-executed code. This function exist to support generated code and is not meant to be used beyond that. The funcName argument should be in the format "FuncName[Type1,Type2,...]" for generic functions, where Type1, Type2, etc. are the type parameters used in the function signature. For non-generic functions, it should simply be "FuncName". The fn argument must be a valid reflect.Value representing a function. Example usage for a generic function: RegisterFunction("slices", "Contains[int]", reflect.ValueOf(func(a []int, b int) bool { /* implementation */ }))

func RegisterPackage

func RegisterPackage(pkgPath string, values map[string]reflect.Value, types map[string]reflect.Type)

RegisterPackage registers an external package with its values and types for use within gi-executed code. This function exist to support generated code and is not meant to be used beyond that.

func Run

func Run(filePath string) error

Run loads, builds, and runs the Go package located at the specified file path. filePath is the file path to a folder that contains a main.go file or any Go source file with a main function.

Types

This section is empty.

Directories

Path Synopsis
cmd
genstdlib command
gi command
treerunner command
api_call command
nestedloop command
pointers command
remoting command
script command
pkg
Code generated by cmd/genstdlib/main.go; DO NOT EDIT.
Code generated by cmd/genstdlib/main.go; DO NOT EDIT.
dap
mod

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL