型、クラス、ループのない最も純粋なOOPのコンセプト:EOLANG
好きなプログラミング言語からクラス、継承、静的メソッド、型をすべて取り除いたらどうなるでしょうか?さらにnull、演算子、型キャスト、ifやforのような制御構造も捨ててしまったら。狂気の沙汰のように聞こえますが、それがまさにEOLANG(または単にEO)の姿です——Yegor Bugayenko率いるObjectionaryチームによって作成された実験的な言語です。
プロジェクトの創設者は、Java、C++、Python、C#のような一般的な言語は実際にはオブジェクト指向ではないと確信しています。これらはクラスやユーティリティメソッドの裏に手続き型コードを隠したハイブリッドです。EOの作者によれば、SmalltalkやSelfさえ十分に純粋ではないとのことです。
この状況を打開するため、開発者は数式的な数学モデル——$\phi$-calculus(phi-calculus)に基づいてゼロから言語を設計することにしました。
中身は?オブジェクトとデコレーションのみ
EOには従来のクラスはありません。代わりに、引数が渡されたときに живуюになるいわゆる抽象オブジェクトを使用します。すべてのエンティティはデフォルトで不変です。
従来の継承によるコード再利用はできません——ここでは単に存在しません。唯一の合成メカニズムはデコレーションです。オブジェクトには別のオブジェクトを指す特別な属性@(phi)が含まれています。現在のオブジェクトが処理しないすべての呼び出しは、包まれたエンティティに透過的に転送されます。
シンプルなグリーティングスクリプトの例です:
[args] > app
stdout > @
"Hello, world!\n"
ここでappは抽象オブジェクトです。引数"Hello, world!\n"を渡しながらオブジェクトstdoutをデコレートします。構文は2スペースのインデントに依存しており、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、式を組み合わせています。算術演算子+や*はなく、代わりに対応するオブジェクトのメソッドが呼び出されます。
アーキテクチャル・パンク:内部はXMLとXSLT 2.0
プロジェクトで最も驚くべきことは、言語のセマンティクスだけでなく、コンパイラの構造です。
ほとんどのコンパイラはメモリ内に抽象構文木(AST)を構築し、JavaやC++の訪問者でトラバースします。EO開発者は異なるアプローチを取りました。パーサはXMLベースの中間表現であるXMIRにコードを変換します。
そしてXSLTのマジックが始まります。すべての構文変換、チェック、ターゲットコードへの変換は、XSLT 2.0スタイルシートのセットとして実装されています。プロジェクトのREADMEには、モジュールビルド中に各.xslファイルの処理に何ミリ秒かかるかを示すベンチマークさえ含まれています。例えば、時間の30%以上がto-java.xslの処理に費やされています。
ビルドパイプラインは直接Apache Mavenに埋め込まれており、eo-maven-pluginを経由します。モジュールとサードパーティライブラリはMaven Centralから готовые JARファイルとしてダウンロードされません。代わりに、MjPullツールはObjectionaryのGitリポジトリからEOソースコードを取得し、あなたのプロジェクトと一緒にコンパイルします。
自分で言語を試すには?
始めるにはJava SEとnpmが必要です。CLIユーティリティは次のコマンドでインストールできます:
npm install -g [email protected]
その後、シンプルなファイルをコンパイルして実行できます:
eoc --easy link
eoc --easy --alone dataize app
これに実用的な利点はありますか?
現時点でEOLANGで本番サービスを書く人はまずいないでしょう。この言語は研究実験のままです。従来の最適化がなく、XSLTを通じたコンパイルチェーンは従来のソリューションより低速です。
しかし、EOは優れた頭の体操になります。Java、C#、Pythonでの長年の作業形成的習慣を reconsiderationすることを強制されます。クラス、null、可変性、型取り上げられると、コンポーネントの接続性を設計し、デコレータを使用する方法を再学習する必要があります。
プログラミング言語理論、$\phi$-calculusのような形式モデル、または異例のコンパイラ構造に興味があれば、objectionary/eoリポジトリは確かに注目に値します。
関連プロジェクト