Skip to main content

Typing SVG

# ⚡ Externum

License Python PyPI Tests Docker License: MIT

A self-hosted programming language blending Python readability, binary performance, and Bash system control. The compiler is written in Externum itself — bootstrap with a minimal Python runtime.

Externum = Python_readability ⊕ Binary_performance ⊕ Bash_control

🇵🇱 Wersja polska · Documentation · Language Spec · Codespaces

▶ Try in your browser — no install

Externum REPL — live in the terminal Compiling Externum to Python, Bash and a standalone binary


Why?

Most languages force you to choose: readable or fast, scripting or systems. Externum is one language for all three targets — write readable Python-style code, keep inline Bash for system control, and compile to a standalone artifact when you need to ship. Self-hosted: the compiler is written in Externum itself.

$ externum run demo.ext
hello world from Externum
Linux 7.2.4-arch1-2

$ externum demo.ext --target python -o demo.py
Output written to demo.py

$ python3 demo.py        # pure Python — runs without Externum
hello world from Externum
Linux 7.2.4-arch1-2

(source: demo.ext — typed variable, $"…" interpolation, inline `uname -sr`)


Table of Contents


What it can do

Area Support
Data types lists, dicts, tuples, sets, f-strings, $"…" interpolation, binary 0b and hex 0x literals
Control flow if/elif/else, while, for ... in, break, continue, try/except/else/finally, with, assert
Functions default parameters, *args/**kwargs, type annotations, recursion, lambdas, closures, generators (yield)
OOP classes, inheritance, methods, self, attributes
Modules import/from ... import, custom .ext modules, standard library
Expressions full operator precedence, chained comparisons, bitwise, ternaries, comprehensions, tuple unpacking
Shell inline bash `cmd` and %% ... %% blocks
Tooling REPL, compilation to 3 targets, argv, TUI IDE

Installation

pip install externum        # PyPI
externum --version          # Externum 4.1.0

# From source
git clone https://github.com/BartoszOsiej/externum.git
cd externum
pip install -e .

Usage

# Run a program
externum run examples/pokedex.ext

# TUI IDE (written in Externum itself)
externum ide
externum ide myprogram.ext

# REPL
externum repl

# Compile to a runnable .exbc artifact (no source needed to run it)
externum examples/hello.ext --target bytecode -o hello.exbc
externum run hello.exbc

# Compile to all targets
externum examples/hello.ext

# Compile to Python / Bash
externum examples/hello.ext --target python -o hello.py
externum examples/hello.ext --target bash

Example

String interpolation — $"…"

name: Any = "Bartosz"
print($"Hello {name}, 2+2 = {2+2}!")   // → Hello Bartosz, 2+2 = 4!
print($"{{literal}}")                    // → {literal}

$"…" strings interpolate {expr} at runtime — arithmetic, calls and any variable in scope. The Python target emits native f-strings; the bytecode VM concatenates parts with the str intrinsic. Same semantics on every target.

examples/pokedex.ext uses classes with inheritance, comprehensions, lambdas, exceptions, generators, f-strings, and the standard library:

import mathx
import strings

class Fire(Pokemon):
    def __init__(self, name, hp=50):
        Pokemon.__init__(self, name, ["fire"], hp)

fire_team = [p.name for p in squad if p.is_type("fire")]
weakest = min(squad, key=lambda p: p.hp)
nums = [f for f in fibonacci(10) if f % 2 == 0]

Demos

🎬 VHS-powered TUI recordings — rendered in CI, auto-committed as GIFs.

Demo Preview
REPL REPL
Compile Compile

Browser Playground & Bot

🌐 Live Playground

Try Externum in your browser — zero install, zero server. The transpiler runs inside Pyodide (Python compiled to WASM):

# Open in Codespaces and run:
externum repl

# Or open the browser playground:
https://bartoszosiej.github.io/externum/
What works What doesn't (browser sandbox)
Full REPL with custom functions Shell `cmd` and %% ... %% blocks
Classes, lambdas, comprehensions File I/O (sandboxed filesystem)
Stdlib: mathx, strings, structs Binary compilation (Python target only)

🤖 Issue-Command Bot

Extend Externum from GitHub Issues — no local setup needed:

Command What it does Example
/run <code> Execute Externum code in CI /run print(2 + 2)
/define <name> <body> Add a new stdlib function via PR /define clamp(x, lo, hi) if x < lo: return lo ...

The bot parses Issue comments, generates a PR with the new function + tests, and runs the full test suite before merge. Language evolves through community contributions.


Standard Library

Module Contents
structs Stack, Queue, Counter
strings reverse, is_palindrome, slugify, word_count, capitalize, truncate
mathx clamp, is_even, gcd, fib, factorial, sum_of_digits
fs read_file, write_file, append_file, file_exists, list_dir
jsonx load, load_str, dump, dump_str — JSON read/write
net http_get, http_get_status — HTTP GET with timeout
drm make_license, verify_license, sign, verify, watermark

DRM System

Every protected build carries the full defense-in-depth stack:

  1. License keys — HMAC-SHA256 signed; externum keygen issues keys
  2. Watermark — author/app/build/source-hash header in every file
  3. Tamper detection — source SHA-256 + artifact self-hash embedded
  4. Obfuscation — string literals encoded through a runtime helper
externum compile app.ext --protect --app-id game --author buffy --secret s3cret
EXTERNUM_LICENSE=<key> externum run app.ext --protect --app-id game --author buffy --secret s3cret

Project Structure

externum/
├── lexer.py          # Tokenization (bracket-aware, bash, f-strings)
├── parser.py         # Full grammar → AST
├── bytecode.py       # Bytecode compiler (EXBC format) + .exbc artifact I/O
├── compiler.py       # Python/Bash transpiler
├── vm.py             # Bytecode virtual machine
├── typesys.py        # Static type checker
├── drm.py            # DRM: license, watermark, tamper-detection
├── runtime/          # Runtime: exec, import .ext, REPL
└── __main__.py       # CLI (run / repl / compile / keygen)
lib/                  # Standard library (.ext)
tools/                # Tooling in Externum
examples/             # hello, calc, pokedex, hardcore.ext
tests/                # 366 unit tests
docs/WIKI.md          # Language specification

Tests

python3 -m unittest discover -s tests -v   # 366 tests

Docker

# Build
docker build -t externum .

# Run
docker run --rm externum run examples/hello.ext

# REPL
docker run -it externum repl

Benchmarks

Measured on Intel i7-4610M (3.00 GHz), Arch Linux, CPython 3.14.7 — median of 30 runs (examples/hello.ext, typed bindings + inline Bash):

Scenario Time
externum compile (.ext → Python target) 78 ms
externum run (lex + parse + compile + exec) 95 ms
bin/externum run (6 KB bootstrap, self-hosted path) 63 ms
Running the compiled .py directly 36 ms
Artifact Size
hello.ext source 177 B
Compiled hello.py 161 B
bin/externum bootstrap (the only Python needed) 6.4 KB

The full toolchain — lexer, parser, bytecode compiler, VM and runtime — bootstraps from a 6.4 KB Python stub; everything else is written in Externum.


License

MIT

Deep Dives

Extended dossiers (architecture, verification, benchmarks, error codex) ship in this repo:

Release files for externum 4.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for externum 4.1.0
File Size Uploaded
externum-4.1.0.tar.gz 93.6 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for externum 4.1.0
File Interpreter ABI Platform
externum-4.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 167.1 kB

Release files / externum-4.1.0.tar.gz

Download URL externum-4.1.0.tar.gz
Size 93.6 kB
Tags Source
SHA-256 checksum
How to use checksums
5756fdfb074c82ca5f56c3efbf3e603ad5b2b9b5b0d77fa48fac3a592a7e8a78
BLAKE2b-256 checksum
How to use checksums
b749e2469c143d46c92f9a11a7c7f367898efa08cbfdf96a39df3c038011f9dc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.7

Release files / externum-4.1.0-py3-none-any.whl

Download URL externum-4.1.0-py3-none-any.whl
Size 73.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
22af91e528bedbbd5cf51c43f4ea955f118cde3c44db4c202798b3afa3253ec3
BLAKE2b-256 checksum
How to use checksums
f6013a93cd3c737c0921d1e79096651ddee5df8ed8ef9de2979accbe17866c9f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.7

Release history Release notifications | RSS feed

4.3.0

2 release files

4.2.2

2 release files

4.2.1

2 release files

4.2.0

2 release files

This release

4.1.0 This release

2 release files

4.0.0

2 release files

2.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page