EOLANG y el concepto de la OOP más pura sin tipos, clases ni bucles
¿Qué pasaría si eliminases las clases, la herencia, los métodos estáticos y los tipos de tu lenguaje de programación favorito? Y junto con ellos descartases null, los operadores, el casting de tipos y las estructuras de control como if o for. Suena descabellado, pero eso es exactamente lo que hace EOLANG (o simplemente EO) — un lenguaje experimental creado por el equipo de Objectionery liderado por Yegor Bugayenko.
Los creadores del proyecto están convencidos de que lenguajes populares como Java, C++, Python y C# en realidad no son orientados a objetos en absoluto. Son híbridos donde el código procedural se esconde detrás de las clases y los métodos utilitarios. Incluso Smalltalk o Self, según los autores de EO, no son lo suficientemente puros.
Para solucionar esta situación, los desarrolladores decidieron diseñar un lenguaje desde cero, basándolo en un modelo matemático formal — $\phi$-calculus (phi-cálculo).
¿Qué hay dentro? Solo Objetos y Decoración
EO no tiene clases tradicionales. En su lugar, utiliza los llamados objetos abstractos que cobran vida cuando se les pasan argumentos. Todas las entidades son inmutables por defecto.
No puedes implementar reutilización de código mediante herencia tradicional — simplemente no existe aquí. El único mecanismo de composición es la decoración. Un objeto contiene un atributo especial @ (phi) que apunta a otro objeto. Todas las llamadas no manejadas por el objeto actual se reenvían transparentemente a la entidad envuelta.
Así se ve un simple script de saludo:
[args] > app
stdout > @
"Hello, world!\n"
Aquí app es un objeto abstracto. Decora el objeto stdout, pasándole el argumento "Hello, world!\n". La sintaxis se basa en indentación de dos espacios, algo similar a Python, aunque también está disponible la notación horizontal mediante corchetes: stdout "Hello, world!".
¿Pero cómo escribes bucles sin while o for? En EO, los bucles se construyen como objetos regulares. Echa un vistazo al ejemplo para imprimir una tabla cuadrada:
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
Se ve unfamiliar. El código combina objetos seq (secuencia), while, y expresiones como x.as-number.plus 1. No hay operadores aritméticos + o * — en su lugar, se llaman métodos de los objetos correspondientes.
Punk Arquitectónico: XML y XSLT 2.0 Bajo el Capó
Lo más sorprendente del proyecto no es solo la semántica del lenguaje, sino la arquitectura del compilador.
La mayoría de los compiladores construyen un árbol de sintaxis abstracta (AST) en memoria y lo recorren con visitors en Java o C++. Los desarrolladores de EO tomaron un enfoque diferente. El parser convierte el código en XMIR — una representación intermedia basada en XML.
Luego comienza la magia de XSLT. Todas las transformaciones de sintaxis, verificaciones y traducción al código objetivo se implementan como un conjunto de hojas de estilo XSLT 2.0. El README del proyecto incluso incluye un benchmark que muestra cuántos milisegundos tarda cada archivo .xsl en procesarse durante las construcciones de módulos. Por ejemplo, más del 30% del tiempo se gasta en to-java.xsl.
El pipeline de build está embebido directamente en Apache Maven mediante eo-maven-plugin. Los módulos y las librerías de terceros no se descargan como archivos JAR listos para usar desde Maven Central. En su lugar, la herramienta MjPull obtiene código fuente EO del repositorio Git de Objectionery y los compila junto con tu proyecto.
¿Cómo Probar el Lenguaje Tú Mismo?
Necesitarás Java SE y npm para comenzar. La utilidad CLI se instala con un solo comando:
npm install -g [email protected]
Después de eso, puedes compilar y ejecutar un archivo simple:
eoc --easy link
eoc --easy --alone dataize app
¿Hay Algún Beneficio Práctico en Esto?
Es improbable que alguien escriba servicios en producción con EOLANG ahora mismo. El lenguaje sigue siendo un experimento de investigación. Carece de optimizaciones convencionales, y la cadena de compilación a través de XSLT funciona más lento que las soluciones tradicionales.
Pero EO sirve como un excelente ejercicio mental. Te obliga a reconsiderar los hábitos formados a través de años trabajando con Java, C# o Python. Cuando te despojan de null, la mutabilidad y los tipos, tienes que reaprender cómo diseñar la conectividad de componentes y usar decoradores.
Si estás interesado en la teoría de lenguajes de programación, los modelos formales como el $\phi$-calculus, o las arquitecturas de compiladores inusuales — el repositorio objectionary/eo definitivamente merece tu atención.
Proyectos relacionados