← 返回信息流
AI 资讯Hacker News·5 天前

E– –:一种在英语与Python之间切换的新语言

原标题:Show HN: E– – A language you dial between English and Python

速览

E--语言允许用户在英语和Python之间通过类似拨号的方式切换,降低了编程门槛。该语言旨在弥合自然语言与编程语言的差距,使非技术人员也能参与开发。它可能对AI领域的自然语言编程有启发意义。

AI 深度解读

背景

在AI与编程的交汇处,LLM(大型语言模型)生成的代码虽然灵活,但存在运行时不可复现、每次调用昂贵、难以调试等问题。传统的编程语言则要求严格的语法,学习曲线陡峭。如何结合自然语言的易用性与确定性编译的可靠性,成为开发者探索的方向。E--(English--)正是在这一背景下诞生——一种用规范、无歧义的英语编写,并能确定性编译为Python的语言。

核心内容

E--(全称"English--")是一种编程语言,其语法是去除了歧义的英语:固定的语法规则和词汇表,每个结构只有一种规范的表述方式。它旨在像英语一样可读、可编辑,同时编译为普通、可复现的Python代码。

设计理念:分离LLM与执行

LLM生成代码在运行时存在模糊性:不可复现、按调用付费、难以调试。E--将LLM的角色与执行阶段分离——LLM(可选)在编写时生成规范的E--代码;确定性解析器将E--编译为Python;运行时保持纯净。这样兼顾了两者优势:需要时利用LLM的创造力,之后始终保持确定性行为。

安装与使用

从PyPI安装:

pip install e-minus-minus

将规范的E--文件转换为Python:

emm-transpile examples/describe.emm

如果文件中不包含 {{ }} 插槽,则无需LLM。如需使用LLM处理自由英文输入或值插槽,需额外安装:

pip install "e-minus-minus[llm]"

开发者模式:克隆仓库后,在PYTHONPATH下以模块方式调用CLI:

PYTHONPATH=src python -m e_minus_minus.transpiler examples/describe.emm

许可证与输出归属

E--基于Apache License 2.0(包含明确的专利授权),可自由嵌入商业产品。需要澄清两点:

  • 许可证覆盖E--工具本身,但生成的Python代码属于用户,不受本项目许可证约束。
  • LLM由用户自行提供,E--的规范化器和插槽解析需要用户指定语言模型,其服务条款独立于本项目。

程序化API

from e_minus_minus import transpile
python_source = transpile(emm_source)

transpile() 是纯函数:无网络请求,无副作用。可传入 resolve_slot 回调以处理 {{ ... }} 插槽。

两阶段管线

E--采用两阶段管线,将不可靠部分与确定性部分严格分离:

  1. 规范化器(可选,LLM):将自由形式的英语转换为规范的E--。这是唯一处理语言歧义性的阶段。
  2. 编译器(确定性):将规范的E--通过普通解析器转换为Python——无LLM,完全可复现、可调试。

LLM仅在编译时运行,绝不参与运行时。生成的Python总是纯的、自包含的。LLM只用于填充明确界定的值插槽 {{ ... }},且解析结果会被缓存,保证构建的可复现性。

规范E--示例

以下代码:

Set result to [[fibonacci]]( {{the first prime number greater than 5}} ).
Do [[print]](result).

编译为Python:

result = fibonacci(7)
print(result)

标记规则:[[name]] 表示函数调用,裸词表示变量,"x"3 是字面量,<1, 2, 3> 是列表,{{ ... }} 是英语短语,编译器解析一次后固化。

运行示例

文件 examples/describe.emm

Define [[describe]] taking n:
    If n is greater than 10:
        Give back "big".
    Give back "small".

For each n in <3, 42, 7>:
    Do [[print]]([[describe]](n)).

编译并运行:

python3 src/transpiler.py examples/describe.emm --run

输出:

small
big
small

插槽解析

{{ ... }} 插槽是一个英语短语,编译器在编译时使用LLM将其解析为Python表达式一次,然后缓存结果,后续构建可离线且可复现。无插槽的文件无需API密钥和设置。

示例文件 examples/primes.emm

For each p in {{the first five prime numbers, as a Python list}}:
    Do [[print]](p).

首次运行调用Anthropic Haiku模型解析插槽,生成列表 [2, 3, 5, 7, 11],缓存到 .emm_cache.json。后续运行离线命中缓存,结果相同。

语句级插槽

插槽不仅可用于表达式位置,也可放在语句位置(独立一行,缩进处),委托LLM生成一个或多个Python语句。例如:

Define [[summarize]] taking numbers:
    {{ compute mean, median and count of numbers into mean_v median_v count_v }}
    Do [[print]](count_v).
    Do [[print]](mean_v).
    Give back mean_v.

编译为:

def summarize(numbers):
    from statistics import mean, median
    mean_v = mean(numbers)
    median_v = median(numbers)
    count_v = len(numbers)
    print(count_v)
    print(mean_v)
    return mean_v

需要注意的是,代码插槽内的引用对下游工具不透明,作者需有意识地接受这一区域级别的委托。

关键要点

  • E-- 是一种使用规范、无歧义英语编写的编程语言,确定性编译为Python。
  • 核心创新在于将LLM的使用限制在编译时(可选的规范化阶段和插槽解析阶段),运行时完全确定且可复现。
  • 两阶段管线:LLM负责处理自然语言的歧义性;确定性解析器保证输出的Python代码一致、可调试。
  • 插槽系统({{ ... }})允许在保留整体程序结构的同时,委托LLM填充值或语句块,解析结果缓存至 .emm_cache.json
  • 无插槽的 .emm 文件完全离线运行,无需任何API或LLM。
  • 生成的Python代码属于用户,许可证对输出无约束;LLM由用户自行提供,其条款独立。
  • 程序化API transpile() 是纯函数,支持可选的回调用于插槽解析。
  • 文件扩展名约定为 .emm,CLI支持 --run--show-o 等选项。
  • 源代码使用Apache 2.0许可证,允许商业嵌入。
  • E-- 旨在实现“LLM创造力 + 确定性行为”的最佳平衡:创意阶段借助语言模型,后续行为严格固定。

意义与影响

E-- 探索了一条将自然语言编程与确定性编译相结合的新路径。它不像传统自然语言编程工具那样依赖LLM全程参与,而是将LLM限制在编译时的一个受控阶段,从而保留了传统编程语言的可复现性、可调试性和性能优势。这种方法尤其适用于需要长期维护、安全关键或审计敏感的场景——程序员可以用接近英语的方式编写代码,但最终获得的是与手工编写一致的Python。

E-- 的插槽机制提供了一种精细的委托模式:开发者可以控制程序的主要逻辑结构,只将值计算或局部逻辑的填充交给LLM,避免了LLM“全盘接管”带来的不确定性。缓存机制进一步保证了构建的可复现性,即使LLM版本变化或离线,也能保持结果一致。

从生态角度看,E-- 不试图取代Python,而是作为Python的一种“前端”语言。其生成的Python代码是自包含、无外部依赖的纯代码,可以无缝集成到现有Python项目、CI/CD流水线和部署环境中。这对于团队协作和代码审查更为友好——非技术人员可以阅读或修改 .emm 文件,而技术人员则审查生成的Python。

尽管E--尚处于早期阶段(仅实现了确定性核心和CLI),但其设计理念可能启发更多“半编程、半自然语言”的工具。它接受了“LLM并不完美”的现实,转而通过架构限制LLM的势力范围,让确定性部分成为系统的基石。这种务实思路在未来AI辅助编程的工程实践中具有重要的参考价值。

查看原文 →github.com