Open3

Ergというプログラミング言語

yukiyuki

年末年始で Erg というプログラミング言語にコントリビュートしていたので、ついでに Erg という言語についていろいろメモを残しておく。

yukiyuki

Erg は現在 Rust で実装されている。これは一時的なもので、将来的にはセルフホストが目指されている(どこかの doc に書かれていたのであとでリンクを貼っておく)。

https://github.com/erg-lang/erg

Erg 自体は静的型付き言語。将来のプランとしては独自の VM を用意してその上で走らせるみたいなものがあるみたいだけど、現状は Python 上で走らせている。裏で Python コード生成が走り、その Python コードが実行されるイメージ。PyCodeGenerator というその名の通りの機能をもつコードがあることや、そもそも Playground で生成される Python コードをチェックできることからもわかる。

まだ実用にはちょっと遠く、文法機能にそれなりにバグがありそうだし、そもそもコンパイラ内部の実装も結構荒削り感がある。テストをもうちょっと充実させたいとかもある。ただ、言語のすごさより個人の資質に言及するのはよくないかもしれないが、数年かけておそらくお一人で作られたもののようで、すごすぎる。

yukiyuki

結構ガチガチに型付けするので、甘めのコードは書けない感じがする。Light Rust と謳われていたけど、型システムに関しては Heavy Rust かもしれない…。というのも、型だけでこれだけの種類がある。なんと(!)依存型がある。

個人的に好きだったポイントは、ちゃんと不変・可変で型がわかれることと、副作用をもつ関数と持たない関数が厳格に分けられていそうなところ。「!」マークがこれらの切り替えを意味する(Rust とは違ってマクロじゃないよ)。たとえば File というクラスを宣言すると不変だが、File! という型になると可変を意味する。関数も同様に、「some_process()」と書くと副作用のない関数を意味するが、「some_process!()」と書くと副作用をもつことを意味する(通常の関数とは区別して、「プロシージャ」と呼んでいそう)。副作用をもつ関数を副作用のない関数内にて呼び出すことはできないみたいで、副作用の管理まできっちりやりきる思想があるのは個人的には好きなところ。

文法は Python それ自体よりもはや Haskell というか ML 系に近い。作者の方がちらっといっていたけどどうやらパーサーは結構大変なことになっているらしい。まだ実装していないので大変さがわかっていないけど。