EOLANG et le concept de POO la plus pure sans types, classes ni boucles
Que se passerait-il si vous supprimiez les classes, l'héritage, les méthodes statiques et les types de votre langage de programmation préféré ? Et avec eux, vous éliminiez null, les opérateurs, le cast de types et les structures de contrôle comme if ou for. Cela semble fou, mais c'est exactement ce à quoi ressemble EOLANG (ou simplement EO) — un langage expérimental créé par l'équipe Objectionary dirigée par Yegor Bugayenko.
Les créateurs du projet sont convaincus que les langages populaires comme Java, C++, Python et C# ne sont pas réellement orientés objet. Ce sont des hybrides où le code procédural se cache derrière des classes et des méthodes utilitaires. Même Smalltalk ou Self, selon les auteurs d'EO, ne sont pas assez purs.
Pour corriger cette situation, les développeurs ont décidé de concevoir un langage from scratch, en le basant sur un modèle mathématique formel — le $\phi$-calculus (phi-calculus).
Qu'y a-t-il à l'intérieur ? Uniquement des objets et de la décoration
EO n'a pas de classes traditionnelles. À la place, il utilise des objets abstraits qui prennent vie lorsqu'on leur passe des arguments. Toutes les entités sont immuables par défaut.
Vous ne pouvez pas implémenter la réutilisation du code via l'héritage traditionnel — il n'existe tout simplement pas ici. Le seul mécanisme de composition est la décoration. Un objet contient un attribut spécial @ (phi) qui pointe vers un autre objet. Tous les appels non gérés par l'objet courant sont transmis de manière transparente à l'entité encapsulée.
Voici à quoi ressemble un simple script de salutation :
[args] > app
stdout > @
"Hello, world!\n"
Ici app est un objet abstrait. Il décore l'objet stdout, en lui passant l'argument "Hello, world!\n". La syntaxe repose sur une indentation de deux espaces, quelque peu similaire à Python, bien qu'une notation horizontale via des crochets soit également disponible : stdout "Hello, world!".
Mais comment écrire des boucles sans while ou for ? Dans EO, les boucles sont construites comme des objets réguliers. Jetez un œil à l'exemple pour imprimer une table de multiplication :
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
Cela semble inhabituel. Le code combine les objets seq (séquence), while, et des expressions comme x.as-number.plus 1. Il n'y a pas d'opérateurs arithmétiques + ou * — à la place, ce sont les méthodes des objets correspondants qui sont appelées.
Architectural Punk : XML et XSLT 2.0 sous le capot
La chose la plus surprenante du projet n'est pas seulement la sémantique du langage, mais l'architecture du compilateur.
La plupart des compilateurs construisent un arbre de syntaxe abstraite (AST) en mémoire et le parcourent avec des visiteurs en Java ou C++. Les développeurs d'EO ont adopté une approche différente. Le parser convertit le code en XMIR — une représentation intermédiaire basée sur XML.
Ensuite, la magie XSLT commence. Toutes les transformations de syntaxe, les vérifications et la traduction vers le code cible sont implémentées comme un ensemble de feuilles de style XSLT 2.0. Le README du projet inclut même un benchmark montrant combien de millisecondes chaque fichier .xsl prend à traiter lors des builds de modules. Par exemple, plus de 30% du temps est passé sur to-java.xsl.
Le pipeline de build est intégré directement dans Apache Maven via eo-maven-plugin. Les modules et les bibliothèques tierces ne sont pas téléchargés sous forme de fichiers JAR prêts à l'emploi depuis Maven Central. Au lieu de cela, l'outil MjPull récupère le code source EO depuis le dépôt Git d'Objectionary et les compile avec votre projet.
Comment essayer le langage vous-même ?
Vous aurez besoin de Java SE et de npm pour commencer. L'utilitaire CLI s'installe avec une seule commande :
npm install -g [email protected]
Après cela, vous pouvez compiler et exécuter un simple fichier :
eoc --easy link
eoc --easy --alone dataize app
Y a-t-il un avantage pratique à tout cela ?
Il est peu probable que quelqu'un écrive des services en production avec EOLANG pour le moment. Le langage reste une expérience de recherche. Il manque d'optimisations conventionnelles, et la chaîne de compilation via XSLT est plus lente que les solutions traditionnelles.
Mais EO sert d'excellent exercice mental. Il vous force à reconsidérer les habitudes formées au fil des années de travail avec Java, C# ou Python. Lorsque vous êtes privé de null, de mutabilité et de types, vous devez réapprendre à concevoir la connectivité des composants et à utiliser les décorateurs.
Si vous êtes intéressé par la théorie des langages de programmation, les modèles formels comme le $\phi$-calculus, ou les architectures de compilateurs inhabituelles — le dépôt objectionary/eo mérite certainement votre attention.
Projets similaires