embedded-scripting-languages
embedded-scripting-languages copied to clipboard
A list of embedded scripting languages
Embedded scripting languages
The following is a list of reasonably mature open source embedded scripting languages to use in your application. Stretching the definition of a scripting language, it also includes Datalog implementations. Items with a strong copyleft license (like the GNU GPL) that will apply to the rest of your code are highlighted as a warning.
| Project name/link | Implementation language | GC | License | Notes |
|---|---|---|---|---|
| AbcDatalog | Java | JVM's GC | 3-clause BSD | Implements Datalog. |
| AngelScript | C++ | Ref. counting + cycle-detecting tracing GC | zlib | A statically typed curly brace language resembling C++ itself. |
| Anko | Go | Go's GC | MIT | Scriptable interpreter with syntax similar to Go. |
| ArkScript | C++ | None (resource release is destruction + optional manual MM) | MPL 2.0 | A small functional Lisp-like programming language. Separate bytecode compiler and VM. |
| Atlast | C | None (manual MM) | Public domain | A dialect of Forth originally developed at Autodesk. |
| BeanShell | Java | JVM's GC | Apache License 2.0 | An small, embeddable Java source code interpreter. Understands Java code with certain extensions like method closures. |
| Boron | C | Tracing | LGPL 3+ | An embeddable scripting language similar to Rebol. |
| Cascalog | Clojure | JVM's GC | Apache License 2.0 | Implements Datalog. |
| CircuitPython | C | Tracing | MIT | A fork of MicroPython, designed for API uniformity across many microcontrollers. |
| ChaiScript | C++ | Ref. counting | 3-clause BSD | A header-only C++14 interpreter library. |
| Chibi Scheme | C | Tracing | 3-clause BSD | Implements R7RS small. |
| CHICKEN Scheme | C | Tracing | 3-clause BSD | Implements R5RS (with some changes). R7RS support is a work in progress. Examples of embedding CHICKEN. |
| Clasp | Common Lisp, C++ | MPS GC (Boehm-Weiser also supported) | LGPL 2+ | Full Common Lisp implementation well integrated with C++, using LLVM for the code generation, to integrate closely with C++ applications or libraries. |
| daScript | C++ | None (region-based + manual MM?) | 3-clause BSD | A statically-typed performance-oriented scripting language. |
| Datalog (c-cube) | OCaml | OCaml's GC | 2-clause BSD | Implements Datalog. |
| Datalog (fogfish) | Erlang | None (no collection inside interpreter state) | Apache License 2.0 | Implements Datalog. |
| Datalog (MITRE Corporation) | C | Tracing (Lua's GC) | LGPL 2+ | Implements Datalog. It is implemented on top of Lua 5.3 and can be extended with Lua functions. |
| Dhall | Haskell | Haskell's GC | 3-clause BSD | A statically-typed functional configuration language. Not Turing-complete. Untrusted code: can't access the file system, can fetch Dhall libraries over HTTP(S) from static URLs (but libraries aren't allowed to access your data), can use up memory and CPU time for a DoS attack. Has a work-in-progress Clojure and Ruby implementation. |
| Duktape | C | Ref. counting + cycle-detecting tracing GC | MIT | Implements JavaScript E5/E5.1. |
| DWScript | Object Pascal (Delphi 2009 or later) | Ref. counting + cycle-detecting tracing GC | MPL 1.1, GPL 3 (JavaScript code generator) | Description. A statically typed Delphi/Free Pascal-like language. Can compile to JavaScript. |
| Dyon | Rust | None (Rust-style lifetimes) | Apache License 2.0 or MIT | Has optional, optimistic (succeed-by-default) static type checking. |
| Embeddable Common Lisp | Common Lisp, C | Boehm-Weiser GC | LGPL 2+ | Full Common Lisp implementation, available as a shared library libecl.so embeddable in any C, C++ or other application. |
| ephp | Erlang | None (no collection inside interpreter state) | LGPL 2.1 | Implements a subset of PHP 5.5. |
| Erlog | Erlang | None () | Apache License 2.0 | Interprets a subset of standard Prolog. |
| Espruino | C | Tracing | MPL 2.0 | Implements a subset of JavaScript ES5 in a way suitable for embedded hardware with 8+ KiB RAM. |
| Expr | Go | Go's GC | MIT | Compiles and evaluates statically-typed expressions. |
| Falcon | C++ | Tracing | GPL 2 or custom | The GC is pluggable. |
| FTH | C | Tracing | 2-clause BSD | A dialect of Forth with objects, hashes, regular expressions, and other extensions. |
| GameMonkey Script | C++ | Tracing | MIT | Comes with C bindings. Similar to Lua, multithreaded. |
| Gentee | Go | Go's GC | MIT | Statically typed. |
| gluon | Rust | Tracing | MIT | Statically typed. Inspired by Lua, Haskell, and OCaml. Each executing gluon thread gets a separate heap. |
| Goja | Go | Go's GC | MIT | Implements ECMAScript 5.1. Better standard compliance and performance than otto. |
| Golog | Go | Go's GC | MIT | Implements a subset of standard Prolog. |
| Go-Lua | Go | Go's GC | MIT | Implements a subset of Lua 5.2. |
| GopherLua | Go | Go's GC | MIT | Implements Lua 5.1 with the added support for Go's channels. Lacks the debug hooks and several functions from the C version. |
| Gravity | C | Tracing | MIT | A class-based concurrent scripting language with a Swift-like syntax. |
| Groovy | Java | JVM's GC | Apache License 2.0 | A scripting language for the JVM. A large subset of Java is valid Groovy. Integrating Groovy into applications. |
| GNU Guile | C | Boehm | LGPL 3+ | "Guile mostly implements R6RS." |
| HashLink | C | Tracing (lazy sweep) | MIT | A bytecode interpreter and a baseline JIT compiler (x86/x86_64 only) for Haxe. |
| Io | C | Tracing | 3-clause BSD | A prototype-based OO language. |
| Janet | C | Tracing | MIT | A functional and imperative language with a Lisp syntax. |
| JerryScript | C | Tracing | Apache License 2.0 | A full ECMAScript 5.1 interpreter written in C99 and optimized for low memory consumption. Uses CMake. |
| Jim Tcl | C | Tracing | 2-clause BSD | Largely compatible with Tcl 8.5 with its own additions. |
| Jinx | C++17 | Ref. counting | MIT | Designed for use in realtime applications such as video games. |
| JRuby | Java | JVM's GC | Choice of EPL, GPL, and LGPL | An implementation of Ruby on the JVM. |
| jsish | C | Ref. counting | MIT | A JavaScript ES 5.2+ interpreter. Internally structured after Tcl with an extensive C API. Features include subinterpreters, introspection, SQLite bindings, and a web framework with WebSocket support. The code is valid C and C++. |
| Jsonnet | C++ | Tracing | Apache License 2.0 | A functional configuration language that extends JSON. Untrusted code: can't access the file system or network, can use up memory and CPU time for a DoS attack. Has bindings for C, C++, Go, Python, and other languages, as well as a separate native Go implementation. |
| JTcl | Java | Ref. counting | Various BSD-like | Tcl 8.4 with some 8.5 features for the JVM. |
| Jython | Java | JVM's GC | PSFL (BSD-like) | An implementation of Python on the JVM. |
| Kawa | Java | JVM's GC | MIT | R7RS. Supports the javax.script API. Evaluating Scheme expressions from Java. |
| Ketos | Rust | None (no heap allocation)? | Apache License 2.0 | A functional Lisp. |
| LambdaChip | Scheme | Tracing | GPL 3+ | An optimizing compiler and VM for embedded systems. R7RS. |
| Libfawk | C | Ref. counting | 3-clause BSD | A multi-language VM. Includes compilers for three languages: Fawk (Awk dialect), Fbas (Basic dialect), and Fpas (Pascal dialect). |
| Libmawk | C | Ref. counting | GPL 2 | Implements Awk. A fork of mawk 1.3 restructured for embedding. |
| LIL | C, Object Pascal (separate implementations) | None (no reference support) | zlib | A Tcl-like language incompatible with mainline Tcl. |
| Lily | C | Ref. counting + GC | MIT | A language focusing on expressiveness and safety. |
| ljs | C | Tracing | MIT | Lua 5.3, Lua 5.1, and LuaJIT with a C/C++/Java/JavaScript syntax. Can convert Lua source code to ljs. |
| Lua | C | Tracing | MIT | The reference implementation of what is likely the world's most popular embedded scripting language. Allows you to precompile scripts to bytecode. Versions 5.1-5.3, which are the ones used today, are not fully compatible with each other. |
| LuaJ | Java | JVM's GC | MIT | A Lua 5.2 spec-compliant interpreter written in Java for JME and JSE. Complies Lua directly to JVM bytecode. |
| LuaJIT | C | Tracing | MIT | Fully compatible with Lua 5.1. Has a built-in C FFI library. Performance comparison. |
| Lua-ML | OCaml | OCaml's GC | 2-clause BSD | Embeddable Lua 2.5 reimplementation that integrates with OCaml type and module system. It's possible to extend or even replace the standard library with your own modules. |
| luerl | Erlang | Tracing | Apache License 2.0 | An implementation of Lua 5.2 in pure Erlang with some features like goto absent. |
| MicroPython | C | Tracing | MIT | Implements the Python 3.4 syntax and some of the core datatypes. |
| Molt | Rust | Ref. counting | 3-clause BSD | A minimal Tcl implementation for Rust applications and libraries. |
| Mond | C# | CLR's GC | MIT | A dynamically typed scripting language with generators, async, remote debugging, and a binding API. |
| Mono | C | Tracing | MIT and other | Implements the CLR. |
| MoonSharp | C# | CLR's GC | 3-clause BSD and other | CLR Based Lua implementation that is 99% compatible with Lua 5.2 |
| mruby | C | Tracing | MIT | A lightweight implementation of Ruby. Has a compile-time package manager. |
| mruby/c | C | Ref. counting | 3-clause BSD | An even smaller implementation of Ruby for microcontrollers with limited memory. |
| MuJS | C | Tracing | ISC | Implements JavaScript (ES5). Has a similar C interface to Lua. |
| MY-BASIC | C | Ref. counting + cycle-detecting tracing GC | MIT | A Basic dialect with prototype-based OOP. |
| Neko | C | Boehm | MIT | The NekoVM is a target for several compilers, including Haxe. |
| NetRexx | Java | JVM's GC | ICU (BSD-like) | Implements Rexx. |
| Never | C | Tracing | MIT | A statically typed functional programming language. |
| njs | C | None (no collection performed) | 2-clause BSD | Implements a subset of ES5.1 with some ES6 extensions. |
| ooRexx | C++ | Tracing | CPL | Implements Rexx extended with objects. |
| otto | Go | Go's GC | MIT | Implements ES5 with some limitations. |
| Pascal Script | Object Pascal | None (manual MM) | modified zlib/libpng-License with mandatory attribution | Statically typed. Implements "most of Object Pascal". Can't define new classes. |
| Pawn | C | None (no heap allocation) | Apache License 2.0 with a clause to explicitly permit static linking | A curly-brace language with a small-footprint VM. Represents data as 4/8-byte "cells". Compiles to CPU-specific bytecode. More. |
| pForth | C | None (manual MM) | Public domain | A dialect of Forth. |
| PH7 | C | Ref. counting | SPL or proprietary | Implements a subset of PHP 5.3 with some changes like native UTF-8 support. |
| PicoC | C | None (manual MM) | 3-clause BSD | Statically typed. Interprets a subset of C. |
| Picol | C | None (no reference support) | 2-clause BSD | A header-only library interpreter for a limited dialect of Tcl. |
| pocketlang | C | Tracing | MIT | A small language syntactically similar to Ruby. Embedding examples. Performance comparison. |
| Python | C | Ref. counting + cycle-detecting tracing GC | PSFL (BSD-like) | Embedding Python in Another Application. |
| gmqcc/qcvm | C++ | None (no dynamic memory allocation) | MIT | A QuakeC compiler and VM. |
| QuickJS | C | Ref. counting + cycle-detecting tracing GC | MIT | A small embedded JavaScript interpreter that implements almost all of ES2019 and much of ES2020. |
| Quirrel | C++ | Ref. counting | MIT | A fork of Squirrel with new features. |
| Red | Rebol, Red, Red/System | Tracing | 3-clause BSD, BSL | A descendant of Rebol. Embeddable via libRed. Features a cross-platform native GUI system. Intended to have low memory usage. |
| Rhai | Rust | None (Rust-style lifetimes) | MIT or Apache License 2.0 | An embedded scripting language for Rust inspired by ChaiScript. |
| Ring | C | Tracing | MIT | An embeddable applications programming language with a large standard library and GIL-less multithreading. |
| Ruby | C | Tracing | Choice of 2-clause BSD, Ruby license, GPL 2 | An embeddable object-oriented scripting language. Running Ruby in C. |
| s7 | C | Tracing | 3-clause BSD | Implements a subset of R5RS/R7RS. Descended from TinyScheme. |
| sci | Clojure | host VM's GC | EPL | An interpreter for a subset of Clojure for Clojure and ClojureScript. |
| SGScript | C | Ref. counting + tracing CG | MIT | Features include a built-in data serialization format, coroutines, class-based OOP, sandboxed evaluation, a built-in debugger and profiler. |
| Shine | C | Tracing | MIT | A language based on Lua with additional safety and expressiveness features implemented as a fork of LuaJIT. |
| SquiLu | C++ | Ref. counting | MIT, some extensions LGPL or GPL | A fork of Squirrel. Changes the syntax to accept a subset of JavaScript and C/C++. Implements Lua's features like string pattern matching and global table manipulation functions. Adds extensions for database access (SQLite3, MySQL, PostgreSQL), sockets, and other features. |
| Squirrel | C++ | Ref. counting | MIT | A language inspired by Lua and JavaScript/Python. Has a Lua-like C++ API. Differentiates itself from Lua with the use of reference counting in place of Lua's tracing GC, a curly-brace syntax, built-in class-based OOP, and zero-indexed arrays. |
| Starlark (Go) | Go | Go's GC | 3-clause BSD | A small dialect of Python for configuration. Not Turing-complete. Untrusted code: can't access the file system and network, can use up memory and CPU to perform a DoS attack. Spec. |
| Starlark (Java) | Java | JVM's GC | Apache License 2.0 | Starlark for the JVM. The original implementation. |
| Starlark (Rust) | Rust | ? | Apache License 2.0 | Starlark in Rust. |
| Tcl | C | Ref. counting | Tcl license (BSD-like) | An embeddable general-purpose scripting language with a rich C API. Has a cross-platform GUI toolkit called Tk. How to embed Tcl in C applications. |
| TinyScheme | C | Tracing? | 3-clause BSD | Implements a subset of R5RS. |
| Umka | C | Ref. counting | 2-clause BSD | Statically typed. |
| Wirefilter | Rust | None (no dynamic memory allocation) | An expression language for Wireshark-like filters. | |
| Wren | C | Tracing | MIT | A small class-based performance-oriented scripting language. Performance comparison. |
| zygomys | Go | Go's GC | 2-clause BSD | An embedded Lisp for Go. Inspired by Clojure, but more oriented towards imperative programming. Has an infix syntax layer that looks like a subset of Go. |
See also
- cwal: Scripting Engine Without A Language.
- Game scripting languages benchmarked.
- Languages that compile to JavaScript.
- Languages that compile to Lua.
- miniKanren logic programming language implementations.
- sol — C++ bindings for Lua.
Contributing
Your contributions are welcome! Please submit a pull request or create an issue to add a new language to the list. I am looking for language implementations that are either actively maintained or largely "done". The VM, bytecode compiler, and standard library (if any) must have a free (libre) license. They may have optional add-ons with any license. A Datalog implementation must be able to parse Datalog source code; it must not be just an EDSL.
License
Disclosure
The curator of this document maintains Picol and has contributed to Jim Tcl.
