EOLANG e o Conceito da OOP Mais Pura Sem Tipos, Classes ou Loops
E se você removesse classes, herança, métodos estáticos e tipos da sua linguagem favorita? E junto com eles descartasse null, operadores, casting de tipos e estruturas de controle como if ou for. Parece loucura, mas é exatamente isso que EOLANG (ou simplesmente EO) propõe — uma linguagem experimental criada pela equipe Objectionary liderada por Yegor Bugayenko.
Os criadores do projeto estão convencido de que linguagens populares como Java, C++, Python e C# não são realmente orientadas a objetos. São híbridos onde código procedural se esconde atrás de classes e métodos utilitários. Nem mesmo Smalltalk ou Self, segundo os autores do EO, são puros o suficiente.
Para corrigir essa situação, os desenvolvedores decidiram criar uma linguagem do zero, baseando-a em um modelo matemático formal — $\phi$-calculus (phi-calculus).
O Que Tem Dentro? Apenas Objetos e Decoração
EO não tem classes tradicionais. Em vez disso, usa os chamados objetos abstratos que ganham vida quando argumentos são passados a eles. Todas as entidades são imutáveis por padrão.
Você não pode implementar reutilização de código através de herança tradicional — ela simplesmente não existe aqui. O único mecanismo de composição é a decoração. Um objeto contém um atributo especial @ (phi) que aponta para outro objeto. Todas as chamadas não tratadas pelo objeto atual são transparentemente encaminhadas para a entidade encapsulada.
Aqui está como fica um simples script de saudação:
[args] > app
stdout > @
"Hello, world!\n"
Aqui app é um objeto abstrato. Ele decora o objeto stdout, passando a ele o argumento "Hello, world!\n". A sintaxe depende de indentação com dois espaços, um pouco reminiscente de Python, embora notação horizontal via colchetes também esteja disponível: stdout "Hello, world!".
Mas como você escreve loops sem while ou for? Em EO, loops são construídos como objetos regulares. Observe o exemplo para imprimir uma tabela quadrada:
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
Parece desconhecido. O código combina objetos seq (sequência), while, e expressões como x.as-number.plus 1. Não há operadores aritméticos + ou * — em vez disso, métodos dos objetos correspondentes são chamados.
Architectural Punk: XML e XSLT 2.0 Por Trás dos Panos
A coisa mais surpreendente sobre o projeto não é apenas a semântica da linguagem, mas a arquitetura do compilador.
A maioria dos compiladores constrói uma árvore sintática abstrata (AST) na memória e a atravessa com visitors em Java ou C++. Os desenvolvedores do EO adotaram uma abordagem diferente. O parser converte o código em XMIR — uma representação intermediária baseada em XML.
Então a magia do XSLT começa. Todas as transformações de sintaxe, verificações e tradução para código-alvo são implementadas como um conjunto de stylesheets XSLT 2.0. O README do projeto até inclui um benchmark mostrando quantos milissegundos cada arquivo .xsl leva para processar durante builds de módulos. Por exemplo, mais de 30% do tempo é gasto em to-java.xsl.
O pipeline de build é integrado diretamente no Apache Maven via eo-maven-plugin. Módulos e bibliotecas de terceiros não são baixados como arquivos JAR prontos do Maven Central. Em vez disso, a ferramenta MjPull puxa código fonte EO do repositório Git da Objectionary e os compila junto com o seu projeto.
Como Experimentar a Linguagem Você Mesmo?
Você vai precisar de Java SE e npm para começar. O utilitário CLI é instalado com um único comando:
npm install -g [email protected]
Depois disso, você pode compilar e executar um arquivo simples:
eoc --easy link
eoc --easy --alone dataize app
Existe Algum Benefício Prático Nisso?
É improvável que alguém escreva serviços em produção em EOLANG agora. A linguagem permanece um experimento de pesquisa. Falta otimizações convencionais, e a cadeia de compilação através de XSLT é mais lenta que soluções tradicionais.
Mas EO serve como um excelente exercício mental. Ele força você a reconsiderar hábitos formados através de anos trabalhando com Java, C# ou Python. Quando você é despido de null, mutabilidade e tipos, você tem que reaprender como projetar conectividade de componentes e usar decoradores.
Se você está interessado em teoria de linguagens de programação, modelos formais como $\phi$-calculus, ou arquiteturas de compiladores incomuns — o repositório objectionary/eo definitivamente merece sua atenção.
Projetos relacionados