Rustと並行プログラミングについて考える

昨日はRustに乗り換える計画について書いた。そんなに書くことないかなと思っていたのだけど、書き始めると意外と指が動いてそこそこの文量を確保することができた。もう今の段階で書けることは書き切った感がある。それでももう一度書いてみることにしてみようと思う。書き始めればなんとか文字を埋めることができるかもしれない。今、オライリーの「プログラミングRust 第2版」を読んでいて、残すところあと2章となった。今日はこの本でおそらく一番難しいところと思われる、並列性と非同期プログラミングの章をなんとか読み切った。記憶が風化しないうちにそれらのことについて書くのが良いのかもしれないけど、さすがに経験不足のため、何も書くことがない。Rustの並行処理のサポートは充実していて、並行プログラミングについて学ぶにも良いプラットフォームになっている。もし、C++で並行プログラミンの経験を十分に積んでいたら、書くことはたくさんあっただろう。何の経験もない自分でも、Rustのマルチスレッドの扱いは、言語の方向性とぴったりと合致して、自然な感じで統合されていることに感動すら覚える。そういう感覚的な、これは良いとか難しいとか感触を確かめることはできたのだが、言語化できるほどは体得できていないので書くことができない。具体的にどういうケースでマルチスレッドを採用したほうがいいとか、非同期処理にしたほうがいいとか、そういうのがない。

並行プログラミングは自分の中でボトルネックとなっている部分でもあると思っている。こいつをなんとかしないとこれ以上先に進めないのではないかとすら思っている。マルチスレッドもごく小さな範囲に閉じ込めて、他のどこにも影響が出ないようにしたような、限られた利用の仕方くらいならなんとか扱えるかもしれない。それだけできれば、現実、なんとかなってしまうようなケースがほとんどという状況にある。もしくは、並行プログラミングなど全く必要ないというケースが大半だ。これで悪循環が生まれる。並行プログラミングができない、したがって、並行プログラミングを扱う開発はできない。しかし、並行プログラミングができなくても達成可能な案件はたくさあるので、そういったものをこなしていけばいい。結果、いつまで立っても経験を積むことはできず、並行プログラミングを身につけることはできないままになる、というサイクルに陥る。この悪循環を断ち切るには、積極的に並行プログラミングを身につけるトレーニングをするしかない。

並行プログラミングのトレーニングが必要なことは分かった。では、具体的にどういうことをすれば良いのだろうか。プログラミングにおいて、わかりやすく、効果も期待できるトレーニング方法は、実際にプログラミングをすることだろう。さらに、実験的なプログラムではなく、ちゃんとした実用性のあるプログラムであればなお良い。実用性のあるプログラムというのはなかなか難しいかもしれない。そんなに大したものを考えなくても良い。他人が使って便利だと思うものでなくても、自身の日々のタスクを効率化してくれるような、小さなものをたくさん作ってみるところから始めるのがいいだろう。実用性というものの解釈を広げて、作って楽しいものとか、遊んで楽しいもの、要はゲームをつくればいい。ゲームには並列化するような要素がたくさんあるのではないだろうかと思う。これまでは、ゲームを作るときに並列化するかどうかなど検討もしなかった。そこを意識的に、どうやったらこれを並行処理させることができるだろうと、考えていくことにする。おそらく、無駄に複雑化して間違った設計になってしまうこともあるだろうけど、そうやっていかないと、最初から可能性を捨ててしまうといつまで立っても並行処理を行うかどうかの判断力もつかないし、プログラミングもできないままになる。例えば、小規模なミニゲームなんかでは、伝統的なシングルスレッドのプログラミングモデルで十分達成可能なことがほとんどだ。並行処理でなければどうしても達成できないことなどあまりないので、意識してやらないと永久に打順は回ってこない。

 そういことで、これからしばらく、おそらく来年は並行プログラミングを身につけることを目標にやっていこうと思う。言語はC++からRustに移行することを念頭に置きながらやっていくことになる。これは並行して進めていく計画なので、一種の並行処理といえなくもない。C++の標準ライブラリには並行処理のサポートが含まれている。比較対象として療法を同時にやっていくのも悪くなさそうだ。目標はRustに移行することなので、Rustを基準にしながら、C++のプログラミングも並行していく、これもまた並行処理と言えなくもない。こうしてみると、現実でも、人間の脳も並行に何かを行うができるようになっていて、割と自然に効率良くできるようになっているようにも思える。こじつけだけど。比較対象はC++に限定する必要もないだろう。現代的なプログラミング言語やそのライブラリには何らかの形で並行プログラミングをサポートするツールが提供されている。それらに広く手を出してみることでも、成果は得られそうだ。例えばGo言語にはgoroutineというのが言語に備わっている。以前Goをやっていたときは、その存在を無視していた。もうGoに対する関心は薄れてしまったのだけど、改めてそこに着目して、並行処理に特化して学んでみるのも悪くない。

 あと、並行プログラミングのアルゴリズムを学ぶ必要もありそうだ。 アルゴリズムはライブラリが提供するものとして、軽視されがちなところがあるけど、基本的なアルゴリズムを学ぶことによるコーディングスキル上昇値はかなり高い。逆に、重要だけどしばらくは学ばなくても良さそうだと思うのは、OSに近い低レイヤの部分だろう。Linuxカーネルがどうやってスレッドを管理しているかとかは、興味はもちろんあるけど、しばらくは保留しておく。言語とライブラリによって提供される、表面にまずダイブして、徐々に下に潜っていく、トップダウンのアプローチが良さそうだ。

最初は並行プログラミングについて書こうと思っていたわけはなかったのだけど、書き始めたら結構指が動いたので、今回はそのまま続けてしまった。その結果、だいたい今後の方針が固まってきた。来年は並行プログラミングの1年になるようにしよう。

Rustに移行することを考える

昨日はなんとか文字数を稼いで、それっぽい投稿に仕上げることができた、たぶん。今日は何を書こうか良いアイデアがない。それで、今Rustの本を読んでいるのでそのことについて書こうかと思う。まだ本を読んでいるような学習中の段階で、実際に何か開発した経験があるわけでもないので、思い込みや勘違いも含まれるだろうけど、それもいいだろう。

今読んでいる本は、オライリーの「プログラミングRust 第2版」というものだ。第1版は数年前に読んでいる。その時からRustにメインでしようする言語を乗り換えることの可能性を考えていた。長いことC++を使ってきたけど、C++が完璧な言語だと思ったことなどなく、いろんな欠陥を抱えているということは認識していた。それでも、近年の標準仕様のアップグレードによって、良い方向に向かってきているようにも感じていた。仕様が膨れ上がっていって習得するのが大変になってきているという問題はこの際考えないでおこう。もし十分に学習と訓練ができて、正しいプログラミングが習得できるならば、C++は悪い選択肢ではないと思っていた。

しかし、この本ではC++、それにCが抱えている重大な欠点を明らかにしている。それはCとC++だけの問題ではなく多くの言語に当てはまることなのだろう。他の言語では問題にならなくても、CとC++だけは、現実でシステムプログラミングで使用される特別な言語であるから、そのような欠点は無視できないということだ。システムプログラミングと呼ばれる領域で開発をしたことがないので、この本を読むまでそういった視点でC++を眺めたことはなかった。この本が指摘しているCとC++の欠点は、説得力があり、納得できるものだった。それは何なのかと一言でいうと安全性ということになる。CとC++では、どうしても解決できない本質的な問題を抱えている。それを解決するためには、抜本的に言語を見直して、CとC++のシステムプログラミングに適した性質を引き継いだ上で、さらにまだどの言語でも採用されたことのないような、革新的なアプローチが必要となる。Rustはそれをやってのけている。

Rustの安全性は無償で手に入るわけではない。安全性を担保するために、厳しい制約をプログラマーに課している。 そのため、がんじがらめのルールの中で仕事をしないといけない。それって楽しいのだろうか。楽しくないかもしれない。でも、C++で書いていたときだってそれは同じことだった。奇妙なルールやあまり簡単ではないテクニックや注意を身につけるために、膨大なトレーニングを必要とする。もうかなり長いことC++を使ってきていると思っているのだけど、全く終わりが見えない。Rustのがんじがらめのルールは、C++でプログラマーが自主的に身に付けて、正しくプログラミングすることを期待していた部分を、言語の方で強制してしまうためのものとも言える。C++は、自分で自分を強制的に安全なルールに従うようにするのに対し、Rustは、言語がプログラマーを強制してしまう、という違いではなかろうか。どっちのアプローチが優れているかは分からない。少なくとも、システムプログラミングにおける安全性という面では、Rustの方に軍配が上がるように思える。

Rustは安全だというのが、C++を捨ててRustに乗り換えることを検討するようになった理由なのかというと、ちょっと違う気もする。先に、C++は一向に終わりが見えないといった。もしかしたらRustはそうではないのかもしれないという淡い期待があるからだ。プログラミングの旅には終わりはないだろうとは思う。しかし、使用する言語にすら全く終わりが見えないってどうなのだろうと考えてみたくもなる。Rustには厳しいルールがあるが、それは一度習得してしまえば、そして経験を積めば、自然とプログラミングできるようになるのではないだろうか。C++で正しいプログラミングをするために、終わりのないトレーニングで身に付けたことというのは、もしかして、Rustによって強制されるルールの範疇ではないのだろうか。Rustでは、無知あるいは不注意を原因とした、正しくないプログラミングが排除されるため、積極的に言語の終わりのないトレーニングを要求される状態から解放されるのではないだろうか。その夢のような境地立てるかどうかを試してみたい。 

 どのような、一見簡単と言われる言語であっても、何かの目的を達成しようとすると、その目的に相応の難しさというのはつきまとう。しかし、それはプログラミングで解決しようとしている問題に備わっている難しさであって、言語によるものなのかどうかというのは別問題になる。また、ある問題はこちらの言語の方が簡単で、別の問題はあちらの言語の方が簡単ということは普通にあることだろう。Rustの場合、専門はシステムプログラミングということになる。システムプログラミングに特化して設計された言語であるなら、その領域でC++より優れたパフォーマンスを発揮するというのは、ありうることだ。システムプログラミングではRustはC++より簡単ということになるのだろうか。そもそもシステムプログラミングが簡単なものではないので、簡単と表現するのは適切ではないだろうけど。

自分の場合、今、最も関心のあるのはシステムプログラミングではない。OSを作りたいとか(夢には見るけど)、クリティカルなリアルタイムのシステムを作りたいとかはない。アプリケーションのプログラミングの方をやりたい。もっというとゲームプログラミングだ。ゲームエンジンを開発したいわけでもなく、ゲームそのものをプログラミングしたい。それでもRustは良い選択肢となるのかどうか、分からない。Rustは汎用プログラミング言語としても優れているのだろうか。その辺がよく分からない。まだ決断はできてないけど、来年はおそらくRustに移行する方向で活動をしていくことになるのではないかと思っている。C++を完全に捨てるわけでもない。最新の仕様にも興味があるので追いかけたりはするだろうし、巧妙なプログラミングテクニックなんかを身につけるのも楽しいものだ。しかし、空間も時間は無限ではない。興味のあるものすべてを集めていったらいっぱいになってしまう。本当に必要なものを見極めていかないといけない。

Hello, ブロガー!

ポエム風なブログを書くことにした。

去年は1年間日記を継続して書き続けることができた。まさか1日も空けずにできるとは思わなかった。それはそれで、また続けていくつもり。ちょうど1年経過して、今日は12月1日と区切りも良いので、新しいことを何かやってみることにする。

 題材はプログラミングにする。というか、それしか書くことがない。プログラミングのポエムになる。技術的な話題ではなく、何かしら思うことを書いていく。特に目的はない。プログラミングのことについて文章を書こうとすると、つい作業ログや備忘録のようなのものになってしまう傾向がある。今回はそういうのを意識的に避けていく。何かの活動は行うとして、それに対して感じたことなんかを書くようにしていきたい。

まずは、今年の残り12月は、毎日継続することだけを目標にしよう。かと言って、数行程度のものではなく、ある程度の文字数で埋めたい。一方で、こんなことにあまり時間をかけたくないというのもある。1日の終わり頃にさくっと書き殴るぐらいのクオリティでいい。頭に浮かんだことをとにかく文字に書き出すといった習慣を定着させてしまいたい。一度身に付けてしまえば、そんなに負担にならないだろう。まずは最初が肝心だ。そういうことを書きながらこの投稿も文字数を稼いでいる。こんな感じで進めていきたい。

とにかく文字数を稼ぐというのは良い案なのだろうか。なんかコードの行数でプログラムの規模を測るようで無意味な基準にも思える。これだけ文字を書いたのだから、それなりの文章力が身についているはずだ、ということにはならないだろう。しかし、文書を書くトレーニングを受けたことのない身としては、とにかく書くというのはそんなに悪くないことのように思える。ここでやりたいのは、情報を伝えるということではなく、この場を借りて自分が何を考えていたのか整理したい、あわよくば文章を書く能力をアップさせたいといったことだ。目的はない、といったけど、そういう下心がないわけでもない。

もうちょっと文字数を稼ぎたい。しかし、徐々に書くことがなくなってきている。こういうときはどうするのが良いのだろう。これから先もこういうことはありそうだ。ここで止まってしまうと、モニターとキーボードの前でぼーっとして、時間だけ経過してなかなか進まないという状態になる。物書きになるつもりは全くないが、生業にしている人もおそらくそういうのを乗り越えていかないのではないだろうか。ソフトウェアのドキュメントなんかは、先に書くべきことが決まっているので、良いドキュメントを書くのは大変だが、あまりこう何を書けばいいのだろうというような状態にはあまりならない。ポエムとなると、何を書いてもいいというのが逆に制約になってしまう。

ブログは何度か挑戦したことがある。どれも長くは続かなかった。今回は続くという保証もない。しかし、今回はちょっと違うことがある。こんなに無意味で長い文章を書いてはこなかったということだ。投稿を文字で埋めると、こんだけ書いたんだ、という間違った充足感を得ることができる。これは次の投稿への景気づけになるし、続けていけば段々とブログ自体に愛着も湧いてくる。ここで目的がないといったことに意味がある。目的がないので間違った方向に進んでもそれは間違いではない。ただ、結果として価値のある情報を持たいない長い文章を考えるスキルと、思い浮かんだことを即座にキーボードを通して吐き出すことのできる、条件反射的なスキルが身につく。

それって何か意味あるの、という疑問もある。狙いとしては、ここで止まってしまうのではなく、価値のある情報を文章で表現できる能力につなげていきたい。これは今書きながら思いついたことで、別にそれが目的でこのブログを始めたわけではない。ただ、こういう感じでだらだらと長い文章をかけるようになれば、真面目に、役に立つ記事を投稿したいとなったとき、自分が抱えている情報をすぐさま公開できるようになっていくのではないだろうか。それはまた別に訓練が必要になる。なんでもいいから書くというのと、余計なものを書かず、的確に文章を構成して、それなりに見栄えのするような文章にするというのは、また違った技術になるかもしれない。

結構書いたのでだいぶ満足した。ここまで無意味な投稿を続ける気はない。題材はプログラミングなので、これからはもう少し内容のあるものになるかもしれない。