>_ DevTrendszh

语言

首页

语言

板块

前端 后端 移动端 DevOps AI / ML 游戏开发 区块链 嵌入式 安全
Java

EOLANG:最纯粹的面向对象编程概念——无类型、无类、无循环

如果你从自己喜爱的编程语言中移除类、继承、静态方法和类型呢?再把 null、运算符、类型转换以及 iffor 等控制结构也一并丢弃。这听起来很疯狂,但 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!"

但没有 whilefor 如何写循环呢?在 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 仓库绝对值得关注。

相关项目