EOLANG:最纯粹的面向对象编程概念——无类型、无类、无循环
如果你从自己喜爱的编程语言中移除类、继承、静态方法和类型呢?再把 null、运算符、类型转换以及 if 或 for 等控制结构也一并丢弃。这听起来很疯狂,但 EOLANG(简称 EO)正是这样做的——这是一种由 Yegor Bugayenko 领导的 Objectionary 团队创建的实验性语言。
该项目的开发者坚信,Java、C++、Python 和 C# 等流行语言实际上根本不是面向对象的。它们是混合体,过程式代码隐藏在类和工具方法背后。甚至 Smalltalk 或 Self,在 EO 作者看来也不够纯粹。
为了解决这一问题,开发者们决定从头设计一种语言,基于形式化数学模型——φ-calculus(phi-calculus)。
里面有什么?只有对象和装饰
EO 没有传统的类。它使用所谓的抽象对象,这些对象在接收参数时才被激活。所有实体默认是不可变的。
你无法通过传统继承实现代码复用——继承在这里根本不存在。唯一的组合机制是装饰。一个对象包含一个特殊属性 @(phi),指向另一个对象。所有当前对象无法处理的调用都会透明地转发给被包装的实体。
下面是一个简单的问候脚本示例:
[args] > app
stdout > @
"Hello, world!\n"
这里的 app 是一个抽象对象。它装饰了对象 stdout,并向其传递参数 "Hello, world!\n"。语法依赖两个空格的缩进,有点像 Python,不过也可以使用括号横向表示:stdout "Hello, world!"。
但没有 while 或 for 如何写循环呢?在 EO 中,循环是作为普通对象构建的。看看打印乘法表的示例:
malloc.empty > [args] > app
seq * > [x] >>
x.put 2
while
x.as-number.lt 6 > [i] >>
seq * > [i] >>
stdout
"%d x %1$d = %d\n".printf
*
x
x.as-number.times x
x.put
x.as-number.plus 1
true
看起来很陌生。代码组合了对象 seq(序列)、while 以及类似 x.as-number.plus 1 的表达式。这里没有算术运算符 + 或 *——而是调用相应对象的方法。
架构朋克:XML 和 XSLT 2.0 在底层
这个项目最令人惊讶的不仅是语言的语义,还有编译器的架构。
大多数编译器在内存中构建抽象语法树(AST),然后用 Java 或 C++ 中的访问器遍历它。EO 开发者采用了不同的方法。解析器将代码转换为 XMIR——一种基于 XML 的中间表示。
然后 XSLT 魔法开始了。所有语法转换、检查和目标代码翻译都通过一套 XSLT 2.0 样式表实现。项目 README 甚至包含了一个基准测试,显示每个 .xsl 文件在模块构建过程中需要多少毫秒处理。例如,超过 30% 的时间花在 to-java.xsl 上。
构建管道直接嵌入到 Apache Maven 中,通过 eo-maven-plugin 实现。模块和第三方库不是从 Maven Central 下载现成的 JAR 文件。而是 MjPull 工具从 Objectionary 的 Git 仓库拉取 EO 源代码,与你的项目一起编译。
如何自己尝试这门语言?
你需要 Java SE 和 npm 才能开始。使用一条命令安装 CLI 工具:
npm install -g [email protected]
之后,你可以编译并运行一个简单的文件:
eoc --easy link
eoc --easy --alone dataize app
这有什么实际用处吗?
现在几乎不可能有人用 EOLANG 写生产服务。这门语言仍然是一个研究实验。它缺乏常规优化,通过 XSLT 的编译链比传统方案性能更差。
但 EO 是一个极好的思维练习。它迫使你重新审视通过多年使用 Java、C# 或 Python 形成的习惯。当你被剥离了 null、可变性和类型,你必须重新学习如何设计组件连接和使用装饰器。
如果你对编程语言理论、φ-calculus 等形式化模型或不同寻常的编译器架构感兴趣——那么 objectionary/eo 仓库绝对值得关注。
相关项目