EOLANG i koncepcja najczystszego OOP bez typów, klas czy pętli
Co by było, gdybyś usunął klasy, dziedziczenie, metody statyczne i typy z swojego ulubionego języka programowania? A wraz z nimi odrzucił null, operatory, rzutowanie typów i struktury sterujące jak if czy for. Brzmi szalony, ale dokładnie tak wygląda EOLANG (lub po prostu EO) — eksperymentalny język stworzony przez zespół Objectionary prowadzony przez Yegora Bugayenko.
Twórcy projektu są przekonani, że popularne języki jak Java, C++, Python czy C# wcale nie są obiektowe. To hybrydy, gdzie proceduralny kod ukrywa się za klasami i metodami pomocniczymi. Nawet Smalltalk czy Self, zdaniem autorów EO, nie są wystarczająco czyste.
Aby rozwiązać ten problem, deweloperzy postanowili zaprojektować język od zera, opierając go na formalnym modelu matematycznym — $\phi$-calculus (phi-calculus).
Co jest w środku? Tylko obiekty i dekorowanie
EO nie ma tradycyjnych klas. Zamiast tego używa tak zwanych abstrakcyjnych obiektów, które ożywają, gdy przekazywane są im argumenty. Wszystkie encje są domyślnie niezmienne.
Nie można zaimplementować ponownego użycia kodu poprzez tradycyjne dziedziczenie — po prostu tutaj nie istnieje. Jedynym mechanizmem kompozycji jest dekorowanie. Obiekt zawiera specjalny atrybut @ (phi), który wskazuje na inny obiekt. Wszystkie wywołania nieobsługiwane przez bieżący obiekt są przekazywane do opakowanej encji.
Oto jak wygląda prosty skrypt powitalny:
[args] > app
stdout > @
"Hello, world!\n"
Tutaj app to abstrakcyjny obiekt. Dekoruje obiekt stdout, przekazując mu argument "Hello, world!\n". Składnia opiera się na wcięciu dwóch spacji, trochę przypominającym Pythona, choć dostępna jest też notacja pozioma w nawiasach: stdout "Hello, world!".
Ale jak pisać pętle bez while czy for? W EO pętle są konstruowane jako zwykłe obiekty. Spójrz na przykład drukowania tabliczki mnożenia:
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
Wygląda to nieznajomo. Kod łączy obiekty seq (sekwencja), while oraz wyrażenia jak x.as-number.plus 1. Nie ma operatorów arytmetycznych + czy * — zamiast tego wywoływane są metody odpowiednich obiektów.
Architektoniczny punk: XML i XSLT 2.0 pod maską
Najbardziej zaskakująca rzecz w projekcie to nie tylko semantyka języka, ale architektura kompilatora.
Większość kompilatorów buduje drzewo składni abstrakcyjnej (AST) w pamięci i przemierza je za pomocą visitorów w Javie lub C++. Twórcy EO wybrali inne podejście. Parser konwertuje kod do XMIR — pośredniej reprezentacji opartej na XML.
Następnie zaczyna się magia XSLT. Wszystkie transformacje składni, sprawdzenia i tłumaczenie na kod docelowy są implementowane jako zestaw arkuszy stylów XSLT 2.0. W pliku README projektu znajduje się nawet benchmark pokazujący, ile milisekund zajmuje przetworzenie każdego pliku .xsl podczas budowania modułów. Na przykład ponad 30% czasu jest poświęcane na to-java.xsl.
Potok budowania jest osadzony bezpośrednio w Apache Maven poprzez eo-maven-plugin. Moduły i biblioteki stron trzecich nie są pobierane jako gotowe pliki JAR z Maven Central. Zamiast tego narzędzie MjPull pobiera kod źródłowy EO z repozytorium Git Objectionary i kompiluje je razem z twoim projektem.
Jak wypróbować język samodzielnie?
Będziesz potrzebować Java SE i npm, żeby zacząć. Narzędzie CLI instaluje się jednym poleceniem:
npm install -g [email protected]
Po tym możesz skompilować i uruchomić prosty plik:
eoc --easy link
eoc --easy --alone dataize app
Czy jest z tego jakaś praktyczna korzyść?
Jest mało prawdopodobne, że ktoś będzie teraz pisał produkcyjne serwisy w EOLANG. Język pozostaje eksperymentem badawczym. Brakuje mu konwencjonalnych optymalizacji, a łańcuch kompilacji przez XSLT działa wolniej niż tradycyjne rozwiązania.
Ale EO służy jako doskonałe ćwiczenie umysłowe. Zmusza cię do przemyślenia na nowo nawyków wykształconych przez lata pracy z Javą, C# czy Pythonem. Gdy pozbawiony jesteś null, mutacji i typów, musisz na nowo nauczyć się projektować łączność komponentów i używać dekoratorów.
Jeśli interesuje cię teoria języków programowania, formalne modele jak $\phi$-calculus czy nietypowe architektury kompilatorów — repozytorium objectionary/eo zdecydowanie zasługuje na twoją uwagę.
Powiązane projekty