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.0.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 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)
├── 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.0.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.0.0
File Size Uploaded
externum-4.0.0.tar.gz 92.3 kB Details

Built distribution (wheel)

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

Total release size: 164.8 kB

Release files / externum-4.0.0.tar.gz

Download URL externum-4.0.0.tar.gz
Size 92.3 kB
Tags Source
SHA-256 checksum
How to use checksums
07703a9b668a54bb130aad897c2f55bb8e2122f724961c1575dad8acac72ce3d
BLAKE2b-256 checksum
How to use checksums
d44098f9f3f40b98235d163e6bd184fc4627cfcd513700b583ac5771a7d56012
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.0.0-py3-none-any.whl

Download URL externum-4.0.0-py3-none-any.whl
Size 72.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
016d06720a16f7f57e6249098afb7a747512ec0d2bdb541c7dad44d432cde7dc
BLAKE2b-256 checksum
How to use checksums
dcbc2a94b0968b0e8ba1a9f45a618d6137a1872271f50f768f4810597fbcbe64
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

4.1.0

2 release files

This release

4.0.0 This release

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