Maxime Chevalier-Boisvert インタビュー
進行:まつもとゆきひろ委員長
まず、最初に簡単に自己紹介をお願いします。
はじめまして、Maxime Chevalier-Boisvertと申します。
Shopifyでコンパイラエンジニアをしており、Rubyプログラミング言語用のジャストインタイムのコンパイラプロジェクトである、YJITコンパイラのプロジェクトを担当しています。
素晴らしいです。
どうしてプログラミングに出会い、プログラミングを始められたかをお話しください。
プログラミングを最初に始めたのは、10歳のときかと思います。
QBasicの入ったDOS386のコンピューターを持っていましたが、当時英語は読めませんでした。ありとあらゆるヘルプファイルにアクセスしましたが、意味を理解するのはとても難しかったので、あまり学習を進めることができませんでした。
家にインターネットが入ったのは16歳になってからだったと思います。インターネットで多くの学習教材を見つけることができ、それからC++の学習を始めました。
QBASICで始めて、次にC++ですね。最初につくったプログラムを覚えてらっしゃいますか?
10歳のときは、簡単なアニメーションを描いたものでした。ラインとループを並べたりして…
その後、大学でコンピューター科学を専攻なさったんですね。
はい。マギル大学(McGill University)に入って、コンピューターサイエンスを学びました。
高校生の時に(進路を決めるときに)プログラミングを仕事にしようと考えられたのですか?
高校生の時は、将来自分が何をするか確信を持っていませんでした。プログラミングに進むかコンピューター工学に進むかどちらかだと思っていました。
どのようにしてRubyに出会われたのでしょう?
Rubyに最初に出会ったのは、20歳か21歳の時だと思います。フォーラムでウェブサイトを作ろうと考えたのですが、当時はRuby on Railsが最善のフレームワークでした。それがRubyに出会ったきっかけです。
あなたの博士論文は、JITコンパイラがテーマだったとお聞きしています。今取り組まれているYJITに似てますよね。
博士論文でなぜそのテーマを選ばれたのですか?
学部生のときにプログラミングにとても惹かれました。本当に自分はプログラミングが好きなんだ・プログラミングについてより深く知りたいと思い、コンパイラが好きになりましたコンパイラを作ることができればプログラミング言語も作れるからです。
修士論文ではコンパイラ研究グループに入り、MATLABのJITコンパイラをやりました。私のアドバイザーは数値計算の最適化に興味を持っていましたが、私が本当に興味を持ったのはダイナミックタイピングでした。MATLABはJavaScriptやRubyや他の言語同様ダイナミックタイピングを採用していましたから。
そこで博士論文ではダイナミックタイピングの最適化に焦点を当てようと考え、Javascript用のコンパイラを選んだんです。
Shopifyに応募なさった経緯はなんだったのでしょう? JITコンパイラをやるためにShopifyからあなたにアプローチされたんですか?
そうです。
私はクリス・イートンに招かれて、研究や、就職機会について話しました。それでその仕事を引き受けることにし、ShopifyのRubyとRailsのグループに加わることにしました。
そのグループの中では多くの人がRubyVMの最適化に取り組んでいました。
チームの規模はどれぐらいでしたか?
RubyとRailsのインフラチームは大きくて、100名ぐらいいました。
特に直接・間接的にRubyVMを担当していたのは、おそらく10名から12名ぐらいだったかと思います。
数が間違っていないことを願いますが…間違ってたら上司に謝らなければなりません(笑)
大丈夫ですよ(笑)
今は6名がプロジェクトに参画しています。
ありがとうございます。私たちのコアチームも非常に大きくて、Shopifyのチームは私達とほぼ同じ規模です。
このインタビューの視聴者の中には、JITコンパイラをご存知ない方もおられると思うんです。
JITコンパイラがどのように機能し、どのようにVMの性能をアップさせるのか、簡単にご説明ください。
とても複雑なことはわかっています(笑)
わかりました。どこから始めましょうか…
典型的には、大半のダイナミック言語は、インタープリットとされるか少なくともインタープリターを持っています。そしてインタープリターは基本的には一行、一命令ずつコードを実行します。そしてプログラムの命令列に対するループがあり、命令を実行していきます。
JITコンパイラはこれらの指示を受け、それをマシンコードに変換して、命令列に対してループしなくてよいようにしています。
また、インタープリターの中で起きる多くの条件付きチェックを排除することを可能にし、コードの効率化を図り、CPUが高速に実行できるようにします。
JITコンパイラは、インタープリターと比べてどのようなトレードオフがあるか説明してくれますか。
はい。トレードオフは複数あると思います。
その一つは、インタープリターの場合、起動時間が非常に早くなります。
だから、例えば、Google V8のようなJavaScriptエンジンを最適化するとき、インタープリターも残されています。それはレベル0最適化のようなもので、レベル0はインタープリターのままです。
プログラムをマシンコードにコンパイルするには一定の時間がかかります。
起動時間が少し長くかかる可能性があり、これが一つのトレードオフです。
また、コードの複雑さの増加もあります。
このため、JITコンパイラはしばしば複数のレベルの最適化を持ちます。
インタープリターがあり、ベースラインのJITがあり、時には一つか二つのレベルのJITがその上に乗ります。
さらにメモリー使用量の問題もあります。
JITコンパイラーは典型的には生成されたコードに加えて、補助データを保存しており、コードの最適化のための仮定を追跡します。
これにもまたある程度のメモリが必要です。
ありがとうございました。
JITコンパイラーはRubyの性能向上に極めて有望なようですね。
YJITの機能を向上させる計画はありますか?
はい。計画はたくさんあります。
今年やりたいと思っていることの一つはARMバックエンドの追加です。
今現在私たちがサポートしているのはx86-64だけですが、64bitのARMバックエンドを追加して、ARM M1とRaspberry Piなどもサポートしたいと思っています。
同時に、バックエンドのための新しい中間表現を追加して、マシンコードの最適化を行い、より高品質のマシンコードを生成できるようにしたいと思っています。
非常に期待できますね。それ以外に何か計画はありますか。
いつか自分の趣味で、プログラミング言語を作りたいと思っています。
楽しいでしょうね。
ええ。でも怖い仕事だと思いますし、大変でしょうけれど。
プログラミング言語を作ることは極めてわくわくすることです。そして、ひょっとしたら生涯にわたるプロジェクトになるかもしれません。
でも、いつか、ぜひやっていただきたいと思います。
やります。最初は小さく始めますけど。
私も小さく始めました。
あなたのプログラミングへの熱意は相当なものだと思います。だからあなたのツイッターアカウントは@Love2Codeなんですね。
プログラミングに対する愛情や情熱についてお話いただけますか?
もちろんです。
ご存知のように、子供の頃、貧しい家庭で育ちました。
母は生活保護を受けておりシングルマザーでした。
私自身は機械やエレクトロニクスが大好きでしたが、当時、電子部品はとても高価だったんです。
エレクトロニクスをやりたければ新しいパーツを購入する必要がありますので、その趣味は私には高値の花でした。
でも最後には究極の機械であるコンピューターを見つけました。
パーツは必要ありませんから、コードを書くことができれば、限界となるのは自分の想像力だけです。必要なのは時間と集中力であり、コードで作り出すものに限界はありません。
その通りですね。
子供の頃、これは魔法のようだと感じていて、私の想像力で何かできないだろうかって思ったんです。そしてプログラミングでそれが可能となりました。
私も高校生のころ、同じようなことを考えました。
おそらく聴衆の中にも、Maximeさんのようなプログラマーになって、システムのコアのところで仕事がしたいと思っている人がいると思います。後に続く人へのアドバイスをいただけますか。
皆さんが置かれている状況によりますが、プログラミングを学びたいと思ってるなら、まずは独学することをお勧めします。年齢など関係ありません。
プログラミングに対する好奇心があるなら、インターネットで検索して、オンラインのチュートリアルを見つけ、Rubyをダウンロードし、コードを書き始め、それで遊んで実験してください、失敗を恐れずにやり続けてください。やればやるほど腕は上がります。
通常、プログラミングでコンピューターを燃やしてしまうことはない、というのがプログラミングのいいところですよね。電子工作では大きな電流をかけすぎると回路を焼いてしまいますが、プログラミングはそれに比べたら
ずーっと安全ですね。
目の前に聴衆の皆さんがいらっしゃらないので、なかなか何と言っていいか難しいんですが…
自分の情熱に従って行動してください。そして楽しんでください。
では、最後の質問です。
あなたを偉大なプログラマーたらしめているのは何でしょう。
細部に注意を向けることではないでしょうか。
細部への注意ですね。それはどういうことでしょう?
プログラミングはコミュニケーションの一種です。他のコミュニケーション同様、読みやすいコードを書くことはいいことです。
ですからユーザーの立場になって考えてください。
ユーザーがあなたのプログラムを走らせた時、ユーザーの経験はどんなものなのか・ユーザーに明白でないことはないだろうか・ユーザーの経験をどうすればよりよいものにできるか、をユーザーの立場で考えることです。
プログラミングはコミュニケーションのためにありますよね。私も同意見です。
プログラミングが育てば、そのプロジェクトの周囲にコミュニケーションに基づくコミュニティが形成されます。コミュニケーションはとても重要です。
まさにその通りです。プログラミングにはコミュニケーションはとても大事だと思います。
お時間をいただきありがとうございました。
そして、Ruby Prize受賞おめでとうございます。
お話できて嬉しかったです。ありがとうございました。