Ruby3の先に求められること

まつもとゆきひろ氏(以下、まつもと):遠い未来について考えてみた時に、25年先って本当にわかんない。私もおじいさんになってるか死んでるか、どっちかしてるんで、よくわかんないんですけれども。

開発効率と保守性の向上が求められる点と、それから、大規模分散環境についての要求がもっと高まること、非均質計算環境というものがもっと広がる、って思っています。これについて考えていかなくちゃいけないな、と思ってます。現時点で私が予想できるのは、これが精一杯なんです。

開発効率と保守性の向上という意味では、Javaとか使っていらっしゃる方は、今でもIDEという統合開発環境をお使いになって、そういう開発環境の支援で開発してる方が非常にたくさんいらっしゃると思います。名前のスペルミスとか、この式に対してどんなメソッドが呼べるかみたいなことについては、コンピュータに教えてもらいながら開発してるという人が多いと思いますね。

ただ、Rubyはそういう静的な情報が少ないので、RubyのIDEがあっても、そういう情報を提供するのはなかなか難しいというのが正直なところだと思います。Rubyの静的解析ツールにはRubyならではの難しさがあるので、今までにはないような新しい、動的型言語に対して情報を集める技術が開発される必要があります。

今でもあるのは、例えばRubocopみたいな静的解析をしてスタイルガイドをするようなソフトです。それから、他の言語ですけれども、Success basedというアルゴリズムによって、静的な型推論を行うようなDialyzerというソフトもあります。さっきのJetBrainsのプログラムのように、実行時の情報を集めて、それを型情報として活用する、プロファイル型の解析みたいなものも登場してきています。

こういうものや、これから開発する新しい技術も含めて、未来のソフトウェアの開発は、もっとインタラクティブになっていくんじゃないかな、と思います。ですから、私たちがタイプミスをすると、なんか吹き出しがあって、「もしかしてこれではありませんか?」みたいなことを、もっと積極的に言われるんじゃないかなと思います。

テディベア・プログラミングでソフトウェア開発

あるいは、開発環境に対して、ペア・プログラミングAIみたいなものがあるんじゃないかな、と思ってます。テディベア・プログラミングというものがあって、ソフトウェアを開発する時に、隣にテディベアを置いておくんです。すると、もちろんテディベアはしゃべらないし、助けてくれないんですけれども、なぜか生産効率が上がるという都市伝説じゃないんですけどあって。実際、効果があるんですね。みなさんもぜひ、今度ソフトウェア開発をする時に、隣にテディベアを置いていただけるといいんじゃないかな、と思うんです。

何かというと、「このコード、これでいいと思う?」とか、テディベアと相談するんです。もちろんテディベアは返事をしてくれないんですけれども。ただ、発話して、会話のようなものをする時に、問題がわかるんですって。「あー、やっぱダメだったね。直そう、直そう」みたいな。たとえ返事をしてくれなくても、そういう対話というのは、実に人間の思考を支援してくれるツールなんですね。

そういえば、ちょうど25年前ですけれども、Rubyをつくっている時に、私の一番上の子どもが、生後半年ぐらいでした。すごく夜に寝ない子だったので、ソフトウェア開発で家に帰ってきて、夜中の12時とか1時とかに、子どもを寝かしつけるために、「寝ないなあ」とか言いながら抱っこしてたんです。その時に、「今度デザインするRubyのこの機能なんだけど、どうしたらいいと思う?」(笑)。

(会場笑)

そうすると、いいアイデアが浮かぶんですよね。Rubyのすばらしい機能としてたくさんの方にほめていただいたブロック機能なんですけれども、あのブロックがあの文法になったのは、子どもと相談しながら開発した時に誕生したんです。

たぶん未来は、もうちょっとテディベアが賢くなって、いろいろなリアクションも取ってくれるようになるんじゃないかと思います。さらに言うと、未来のコンパイラはテディベアが付いてくるんじゃないかな、と思うんです。

(会場笑)

25年後にはそういうかわいらしいコンパイラ、あるいは、開発環境が、Rubyにとっても一般的になっていくんじゃないかな、と思ってます。

大規模分散環境についての要求がもっと高まる

さらに、世の中、だんだん分散になってきてるわけですけれども、コンピュータというものはムーアの法則によって、どんどん性能が向上してきました。過去50年ぐらいの間、コンピュータを構成してるLSIの集積度、つまり、1つのチップの上にのってるトランジスタの数は、2年間で2倍というペースで増加してきました。

そうすると2年で2倍、4年で4倍、6年で8倍、8年で16倍というふうに倍々ゲームで増えていくわけなんですけれども、現実世界で、こんな指数関数的に増加するものって、あんまり見かけないですよね。

そうやって、どんどん性能が向上してきて、私が子どもの頃のコンピュータに比べて、今のコンピュータは性能やメモリ容量においても数百万倍とか増加してるわけなんです。

ただ、やっぱり物理的な限界があるので、いつまでも指数関数的増加というのは難しくなる。そう言われてみれば、最近、パソコンのクロックという点では、あんまり伸びなくなってきてますね。一般向けのコンピュータのクロックは、だいたい2ギガちょっと超えたぐらいで頭打ちです。

Pentium 4の頃は4ギガのものもありましたけれども、Core i9でも、3.何ギガとか4ギガいくものが、オーバークロックしたらいくかなぐらいのレベルです。もちろんPentium 4の4ギガよりもCore i7の2.5ギガのほうがたぶん速いですけれども。そうは言っても、1コアにおける性能の限界は、昔みたいな倍々ゲームで伸びるみたいなことが、もうなくなってきています。

そうするとCPUメーカーの人たちはどうしてるかというと、1つのチップの上にコアをたくさん積むことによって、同じ性能のチップを1つの代わりに2つ積んだら理論値は2倍、4つ積んだら理論値は4倍ということになるので、そうやって増えたトランジスタをコアの数に振り向けて、理論上の性能を向上させようというふうになってきて、マルチコアを活用しようみたいなことが増えてきました。

さらに、コンピュータそのものの値段が安くなったので、1台のコンピュータにマルチコアを積むだけではなくて、システム全体を複数のコンピュータで構築することによって、性能を向上しようみたいな流れも出てきました。

1つのマルチノードでも1つのデータセンターだけだと、例えば「そのデータセンターのルータが落ちました、全部サービスが止まりました」というのは恐ろしいので、複数のデータセンターに分割してフォールトトレラントを実現しようみたいなことも。本当にやってる人はほとんどいないですけれども、でも今後、スケーラビリティが話題になってくるにつながって、そういう選択肢も現実的になってくるかもしれません。

その時に気になるのが、コンカレンシーという概念ですね。言い方を変えると分散処理。1つのコンピュータだけではなくて、複数のコア、複数のコンピュータ、複数のデータセンターにバラまかれた処理が、全体として1つのシステムを構築します。そして、その構築した複数のソフトウェアからなるシステムが、協調しながら1つの処理を行うことが求められる。そういうことを実現するようなスケーラブルなアーキテクチャが求められています。

現在のWorld Wide Webって、すごくプリミティブなわりにはけっこういい線いってて、いいんですけれども、万能ではないわけですよね。25年先のコンピュータアーキテクチャを考えた時に、量子コンピューティングみたいな、現在からいくとまるで予想できないようなアーキテクチャはまったく無視して、現在のアーキテクチャの延長線上に25年後のコンピュータがあるとすると、今、「なんとかas a Service」みたいに言われてるものの近く、その中でも、とくにFunction as a Serviceと言われてるものが、現代では一番近いものではないかなと、私は予想します。もちろん、外れる可能性のほうが高いんですけれども。

Function as a Serviceは、Amazon Lambdaみたいなものをイメージすればいいんじゃないかな、と思います。

そういう未来が来た時に、今のGuildではないと思いますけれども、Guildのその先のものが、大規模分散の、マルチノードやマルチデータセンターからなるシステムを管理する。あたかも1つのコンピュータであるかのように管理するというプログラムを書くことができて、そのプログラムのロジックをRubyで書けると、いい未来なんじゃないかなと思ってます。

さらに広がる非均質計算環境

非均質な計算環境というものですけれども、我々はコンピュータを考える時に、同じコンピュータが複数並んでるシステムを考えるわけです。マルチコアでも、同じCPUが4つあるいは8つあると考えがちなのです。

例えばARMのBigLITTLEというアーキテクチャは、「8コアあります、そのうちのコア4つは、高性能なコアです、残りの4つは、性能は低いけれども電力消費の少ないコアです」と。ARMはモバイルに使われることが多いので、携帯電話とかだと、無限に電気を消費されても困るわけですよね。

そこで、あまり忙しくない時には、性能は低いけれど消費電力の少ないコアで動いて、忙しくなってきたら大きなコアに仕事を移して、そっちで実行する。つまり、同じコンピュータではなく、複数の種類のコンピュータが混ざってて、それが役割ごとに分担しながら働くみたいなことが非均質計算環境です。ヘテロジニアスですね。

GPGPUもそんな感じですよね。General-Purpose GPU。もともとグラフィックスやCGのレンダリングとかに使われてるGPUを、汎用目的に使おうという試みですね。ですから、機械学習とかデータサイエンスの領域で、GPUを計算に使うということは、だいぶ前からけっこう流行ってるわけです。

だから、1つのコンピュータで、コアは難しいロジックを実行しますが、単純なロジックについては「GPUとかにオフロードして、そっちで計算させます」みたいなことが起きています。これもまた、複数のコンピュータから構成された1つのシステムが協調されながら動く、という基本は変わらないわけですね。

あるいは、FPGAみたいなものもありますね。Field-Programmable Gate Arrayです。プログラム可能なハードウェアですよね。こういうものを使って、難しいロジックの部分をハードウェアで実装してオフロードするみたいなことです。これもまた、均質ではない複数の計算環境によって構成されるシステムが、協調して1つのシステムとして動く。

この時に重要になってくるのが、それをどういうふうにして抽象化するかということです。実際、私は、現時点で答えがでてないんですけれども。ただ、大規模分散みたいなものを簡単なRubyコードで書くことによって、ものすごく大きなことがシンプルに、安全にできるという未来がきてほしいなと思います。

そのためには、開発しなければならないRubyのコアやライブラリの部分とかは、たくさんあると思いますし、これこそが未来ではないのかなと思います。また、それが、ただ単にシンプルなだけではなくて、楽しくできると、Rubyをつくった甲斐があったんじゃないかな、と思います。