原文:https://dev.to/bartoszosiej/i-built-a-programming-language-that-compiles-to-python-bash-and-binary-252(作者 @bartoszosiej)
大多数编程语言教程止步于一个计算器。而我想做点真实的东西——一门能够:
- 直接运行(像Python)
- 编译为Python(以接入生态系统)
- 编译为Bash(用于系统脚本)
- 编译为原生二进制(以获得性能)
的语言。一个源文件(.ext)→ 三种目标。这就是 Externum。
Externum = Python_readability ⊕ Binary_performance ⊕ Bash_control
长什么样
Externum 看起来像 Python,但能编译到三种目标:
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]
如果你能读 Python,你就能读 Externum。但在底层,它是一个完整的编译器管道:
source (.ext) → 词法分析器 → tokens → 语法分析器 → AST → 编译器 → python/bash/binary
难点:NV2.0 硬模式
真正的挑战不在于基础语言,而在于增加了一个硬模式,将 Externum 变成了真正困难的东西:
所有权
p: Ptr[Int] = alloc(Int) @p = 42 print(@p) # 42 free(p) # double-free after this = compile error
是的,在类Python语言中进行手动内存管理。类型检查器在编译时强制执行单所有权语义。
特征
trait Speaker:
def speak(self) -> Str
impl Speaker for Dog:
def speak(self) -> Str:
return "woof"
缺少实现?编译错误。返回类型错误?编译错误。
宏
macro SQ(x) { (x) * (x) }
print(SQ(5)) # expands to print((5) * (5))
在解析前进行文本展开——像C宏,但使用Python语法。
并发
ch = chan() spawn(worker(ch)) send(ch, v) recv(ch)
线程支持的通道,具有编译时安全性。
浏览器 playground
这里是变得有趣的地方。Externum 完全在你的浏览器中运行:
┌──────────────┐ ┌────────────────┐ ┌────────────────┐
│ 代码编辑器 │───►│ Externum (.ext) │───►│ Pyodide (WASM) │
│ (浏览器内) │ │ 转译器 │ │ Python运行时 │
└──────────────┘ └────────────────┘ └────────────────┘
│ │
└───────────── stdout / stderr ◄───────────┘
无需服务器。无需API密钥。无需网络请求。 转译器在 Pyodide(编译为WebAssembly的Python)内部运行。编写Externum代码,点击运行,即可看到输出。
issue-command 机器人
这是独特之处:你可以通过 GitHub Issues 扩展该语言。
/run print(2 + 2)— 在CI中执行Externum代码/define clamp(x, lo, hi) if x < lo: return lo ...— 通过PR添加新的标准库函数
该机器人解析Issue评论,生成包含新函数和测试的PR,并在合并前运行完整的192个测试套件。语言通过社区贡献演进。
DRM 系统
每个受保护的构建都包含完整的纵深防御栈:
- 许可证密钥 — 使用HMAC-SHA256签名
- 水印 — 每个文件包含作者/应用/构建/源码哈希
- 防篡改检测 — 源码SHA-256 + 构件自哈希
- 代码混淆 — 通过运行时辅助工具对字符串字面量进行编码
externum compile app.ext --protect --app-id game --author buffy --secret s3cret EXTERNUM_LICENSE=<key> externum run app.ext --protect
统计数据
| 指标 | 数量 |
|------|------|
| 单元测试 | 192 |
| 标准库模块 | 7 (structs, strings, mathx, fs, jsonx, net, drm) |
| 编译目标 | 3 (Python, Bash, binary) |
| PyPI 下载量 | 189+ |
| Docker 镜像 | GHCR |
技术栈
- Python 3.10+ — 实现语言
- 零依赖 — 全部来自标准库
- Pyodide — 通过WebAssembly的浏览器运行时
- GitHub Actions — 使用cosign签名、SLSA溯源、SBOM的CI/CD
- OpenSSF Scorecard — 自动化供应链安全
我学到了什么
- 词法分析比你想象的难 — 特别是涉及括号感知的缩进、Bash块和f-strings时
- 类型系统很美 — 所有权检查器教会我的关于Rust借用检查器的知识,比任何教程都多
- WebAssembly改变一切 — 在浏览器中运行完整的语言转译器,零服务器成本
- 社区驱动的语言设计可行 —
/define机器人已经添加了3个新的标准库函数
试用一下
pip install externum externum repl # Or try in your browser: # https://bartoszosiej.github.io/externum/
原文:https://dev.to/bartoszosiej/i-built-a-programming-language-that-compiles-to-python-bash-and-binary-252(作者 @bartoszosiej)



