EOLANG и концепция чистейшего ООП без типов, классов и циклов
Что если убрать из вашего любимого языка программирования классы, наследование, статические методы и типы? А вместе с ними выбросить null, операторы, приведение типов и управляющие конструкции вроде if или for. Звучит дико, но именно так выглядит EOLANG (или просто EO) — экспериментальный язык, созданный командой Objectionary под руководством Егора Бугаенко.
Создатели проекта уверены, что популярные языки вроде Java, C++, Python и C# на самом деле никакие не объектно-ориентированные. Это гибриды, где процедурный код спрятался за классами и утилитарными методами. Даже Smalltalk или Self, по мнению авторов EO, недостаточно чисты.
Чтобы исправить ситуацию, разработчики решили спроектировать язык с нуля, оперевшись на формальную математическую модель — $\phi$-исчисление (phi-calculus).
Что внутри? Только объекты и декорация
В EO нет привычных классов. Вместо них применяются так называемые абстрактные объекты, которые оживают при передаче аргументов. Все сущности по умолчанию неизменяемы.
Реализовать повторное использование кода через обычное наследование не получится — его тут просто нет. Единственный механизм композиции — декорация. Объект содержит специальный атрибут @ (фи), указывающий на другой объект. Все вызовы, которые не обрабатываются текущим объектом, прозрачно перенаправляются обёрнутой сущности.
Вот как выглядит простой скрипт, печатающий приветствие:
[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. Модули и сторонние библиотеки не качаются в виде готовых JAR-файлов из Maven Central. Вместо этого инструмент MjPull тянет исходники на EO из Git-репозитория Objectionary и компилирует их вместе с вашим проектом.
Как пощупать язык самостоятельно?
Для работы понадобятся Java SE и npm. Утилита CLI устанавливается одной командой:
npm install -g eolang@0.36.0
После этого можно скомпилировать и запустить простой файл:
eoc --easy link
eoc --easy --alone dataize app
Есть ли у этого практическая польза?
Писать продакшен-сервисы на EOLANG прямо сейчас вряд ли кто-то станет. Язык остаётся исследовательским экспериментом. В нём нет привычных оптимизаций, а цепочка компиляции через XSLT работает медленнее традиционных решений.
Зато EO служит классным тренажёром для ума. Он заставляет пересмотреть привычки, сформированные годами работы с Java, C# или Python. Когда у вас забирают null, мутабельность и типы, приходится заново учиться проектировать связность компонентов и использовать декораторы.
Если вам интересны теория языков программирования, формальные модели вроде $\phi$-исчисления или необычные архитектуры компиляторов — репозиторий objectionary/eo точно заслуживает внимания.
