E– –:一种在英语与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--采用两阶段管线,将不可靠部分与确定性部分严格分离:
- 规范化器(可选,LLM):将自由形式的英语转换为规范的E--。这是唯一处理语言歧义性的阶段。
- 编译器(确定性):将规范的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辅助编程的工程实践中具有重要的参考价值。
