Rustを触っている

先週Rustを触っていた。まだ手に馴染んでいないので少し不自由さを感じるが、慣れるまでの辛抱だろう。実際は去年くらいに一度インストールしてチュートリアル程度は済ませていたのだが、説明を見て言われた通りのコードを書く以上のことはしていなかった。なので、少し柔軟体操程度のことをしてみるか、とProject Eulerの問題をいくつか解いてみた。これは触ってみただけのひどく個人的な感想にすぎず、Rustの紹介を気合を入れてしている訳ではない。

ああ言った問題を解くことのメリットは、動き出しが早くなること、それなりに考えてコードを書かないといけないので基本的な部分が素早く身につくことだろう。デメリットは、少なくとも私はその場で書き捨てのコードを書くことに終始してしまうので、中規模以上のコードをどう書くべきかの知識経験が貯まらないことだ。個人的にはどちらかというとその言語"らしさ"は中規模以上のプログラムや汎用的なライブラリがどう書かれるかという所に比較的色濃く出ると思っているので(短いコードにも凝縮されることは有り得るが、高級言語がどのような抽象化機構を備えているかなどはライブラリや大規模コードで強く現れるものではないだろうか)、そこそこのところで見切りをつけて別のことを始めるのが良いかもしれない。例えばその言語の有名ライブラリの実装を見るとか、自分で何か大きめのものを書くとか。もちろん、ProjectEuler用のライブラリを作っても良いのだろうけれど。

C++は安全に高速に使う方法が用意、というか模索されてある程度固まってはいるが、それでも少しのミスが致命的になり得るし、そもそも危険な書き方も許容するので、慣れていないと危険だったり途轍もなく遅かったりするコードを書いてしまうことがある。慣れていないと、というのは「プログラミングに慣れていないと」ではなく「C++に慣れていないと」である(いや他の言語でもそういうことは多いが)。その上、これまでの知見を反映した現代的なC++コードの書き方が解説されている書籍は少なく、あっても中上級者向け書籍という位置付けになっている。初心者向けの書籍は基本的な言語機能の解説だけでもひどく分厚くなってしまうので、あまり"C++らしい"書き方を教えてはくれない。また、「Cの拡張」という今や正しいとは言い難い認識が広まっているため、Cの経験がある人が奇妙なコードを書きながらC++に文句を言っているケースをよく見る。C++は熟練者に優しく、初心者を殺しにかかっているのだ。そんなスタンスでなぜこんなに広く用いられているのかが謎だが、(熟練者が書くと)素晴らしいという情報がカーゴカルト的に広まっているのかもしれない。カッコ内の情報は届いていないか、単に長い間たった一つの言語で似たり寄ったりなコードを書いていただけで新しいプログラミングパラダイムを勉強したりはしてこなかった人々が自分を熟練者だと思い込んで自覚なしに爆死しているのだろう。

Rustはその点、後方互換性のようなものは存在せず、最近の知見を取り入れて言語全体を綺麗に設計してあるので、C++のように膨大な言語仕様に押しつぶされることがない(これからどうなるかは知らないが)。また、全体がミスが起きにくくなるように設計されている。なので、素直に書くだけでC++では熟練者しかできないようなモダンなコードが出来上がる……いや、これは嘘かもしれない。が、本当に素直に書いてもひどく間違った方向には進み難そうだ。

これはごく個人的な感想になってしまうが、C++であまりうまくいかなかった、と私が認識しているものの大半がRustにはなく、私の考え方を転換してくれた多くの素晴らしい機能がRustでは全体の設計と調和した形で前面に押し出されている。例えば例外は標準ライブラリ内部では用いられているが、私は例外を適切にハンドルしているC++コードをそう多くは知らない(私自身、例外を完璧に適切な形でハンドルできる自信はあまりない)。私がエラー処理をするならstd::optionalやEitherを用いたいところだが、Rustはまさにそうなっている。

何かの問題がある時、個人の資質や努力で解決を図ってはならない。システムで解決できるならそのようにするべきだ。この観点から言うと、CやC++はあまり良い言語ではないだろう。「プログラマが何かをしようとしている時、何か意図があるのだろうから、コンパイラはそれを止めてはならない」。これは熟練者が奇妙なことをする時に黙っていてくれる分にはいいが、熟練者もミスや見落としをすることはあるし、そもそもはっきり言ってC++の熟練者はほとんどいない。そう思うと、初心者には学習コストが酷くかかるC++を書かせるのでなく、Rustを覚えさせた方が良いのだろう。私はRustは唯一、C++の代替を勤められる言語だと思う。あ、いやD言語はそう悪くなかった。なぜ流行らなかったんだろう。

唯一の欠点は、Rustのメリットを初心者が納得できるかというところだが……まあ、こればかりは熱弁を振るってなんとか引き込むしかないのかもしれない。