Externum:可编译为Python、Bash和原生二进制的编程语言

原文:https://dev.to/bartoszosiej/i-built-a-programming-language-that-compiles-to-python-bash-and-binary-252(作者 @bartoszosiej)

大多数编程语言教程止步于一个计算器。而我想做点真实的东西——一门能够:

  1. 直接运行(像Python)
  2. 编译为Python(以接入生态系统)
  3. 编译为Bash(用于系统脚本)
  4. 编译为原生二进制(以获得性能)

的语言。一个源文件(.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 系统

每个受保护的构建都包含完整的纵深防御栈:

  1. 许可证密钥 — 使用HMAC-SHA256签名
  2. 水印 — 每个文件包含作者/应用/构建/源码哈希
  3. 防篡改检测 — 源码SHA-256 + 构件自哈希
  4. 代码混淆 — 通过运行时辅助工具对字符串字面量进行编码
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 — 自动化供应链安全

我学到了什么

  1. 词法分析比你想象的难 — 特别是涉及括号感知的缩进、Bash块和f-strings时
  2. 类型系统很美 — 所有权检查器教会我的关于Rust借用检查器的知识,比任何教程都多
  3. WebAssembly改变一切 — 在浏览器中运行完整的语言转译器,零服务器成本
  4. 社区驱动的语言设计可行/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)

发布评论
全部评论(0)