この記事は完全なるポエムです。
ここ数年Crystal信者になっています。Crystalは強い制約を持つことで高いパフォーマンスを実現してきた言語です。それに対して、RubyはCrystalには不可能な動的な性質に強みを持つ言語です。Crystal信者から最近のRubyの動きを見ていると「そのあたりはCrystalの人たちが長年掘ってきた領域で、Rubyの本当の強みはそんなところにはないのでは…」という気持ちになることがあります。この感覚があまり共有されず、もどかしい気持ちがあります。
私自身はRubyとCrystalぐらいしか理解していないため、自分の考えていることに自信が持てず、ぼんやりと過ごしていました。しかし、お気持ちは書き残しておかないと参照できなくなるため、気を強く持ってポエムをしたためることにしました。
Rubyもオブジェクト指向が十分でない
私がRubyに対して感じてる不完全さは、多くの操作に可逆性がないことです。変数を定義することはできますが、それをきれいに削除することは難しい。モジュールの include はありますが、de-include はありません。remove_method、remove_const、undef_method、UnboundMethod、define_methodのような仕組みは一応ありますが、ある構造からメソッドや振る舞いを取り出し、別のオブジェクト構造へ安全に差し替えるための、一貫した可逆的なモデルがあるわけではない、ように見えます。
Rubyは動的な言語とされており、実行時にいろいろな変更を容認します。しかしその自由は、「あとから追加する」方向に強く働いていて、追加したものを取り外したり、構造を分解して別の形に組み替えたり、その変更を元に戻したりする自由は、あまり体系化されていないように見えます。
Rubyは動的言語の性質が足りていないのではないでしょうか?
理想を言えば、機械学習のように、入力データと期待される出力を与えたうえで、実行時にメタレベルで「どのようにオブジェクト構造を最適化するか」を探索的に決めていけるようなRuby実装があったら面白いのではないかと思っています。その基盤として、自分自身のオブジェクトを観察し、変形し、再構成できるような仕組みは必要なのではないか、と想像しています。(しかし、そういったことが果たして本当に可能なのか私にはわかりません)
ただそういったものが実現しても、現実には「学習・コンパイルによるオブジェクト構造の生成」と「実行」の二段階に分かれてしまうもしれませんね。それではつまらないという気がします。
Rubyに期待していること
私はCrystalに熱中していて、Rubyから少し遠ざかっています。そういう人は何人かいます。その様子を見て、もっとRubyもCrystalみたいなことができるようにしていきたい、と思う人がいても不思議ではありません。
しかし、実際に求められていることはその逆です。Crystalには構造的にどうしてもできない制約があります。CrystalはRubyに強い制約をつけることで、高速さと省メモリを実現した言語です。私はCrystal信者なのでCrystalのようなことをやらせたらCrystalの方が得意だと思います。それでは何も面白くないのです。Rubyにしかできないことが見たいのです。
Rubyは(Crystalと比較すると)産業用プログラミング言語であるため、身動きが取れない面もあると思います。実行時にオブジェクトの構造を自由自在に変容できる言語は、危なくて産業界には歓迎されないでしょう。しかし、主流の言語の中でRubyが最も動的な言語みたいにあつかわれる状況は奇妙だと思いませんか? Rubyよりも動的な言語の世界に、大きなフロンティアが残っている気がしてなりません。
さらに動的な世界へ、プログラミングの世界そのものを拡張する挑戦をいつか見たいと願っています。