One minute
コンパイラと私
ここでは、私がどのようにして「コンパイラ」というものを認識し、そして夢中になったのかについて書いていこうと思う。
私が初めてプログラミングを体験したのは小学6年生のころだった。C言語を使って Hello World
を画面(ターミナル、そのころは Windows を使っていたからコマンドプロンプトだった)に表示するという、いたって典型的な入門だった。正直あまり面白くなかったし、そもそもキーボードが打てない、ファイルをどこに保存したのかわからない、というレベルだった。
そんなレベルの私がなぜC言語を始めたかというと、もともと簡単な電子工作をしており、次はロボットを動かしたかったからである。C言語以外の言語を知らなかった私は、親に「猫でもわかるC言語プログラミング」を買ってもらい、どうにか Hello World をコンパイルできる程度の環境を構築したというわけだ。
それ以降の小学6年生の記憶はかなり曖昧だが、たしかある程度C言語を使えるようになり、Win32 APIでウィンドウを表示するサンプルが動いて喜んでいたと思う。同時に、「なぜこの英語の文章(=プログラム)がウィンドウを表示したりできるんだ?」といった純粋な疑問も持っていた。「コンパイラ」という単語はうっすらと認識していたが、どちらかと言えば「コンパイルして実行」のような連続した語として記憶していたため、まだコンパイラというソフトウェア自体にはあまり興味を示していなかったと思う。
中学1年生になると、すっかりロボットを動かすという目標を忘れ、GUIプログラミングを楽しんでいた。 (物理的にも処理速度的にも)重たいパソコン上で Visual Studio を動かし、C言語を書いていた。F5を押せばプログラムは動いた。そこにコンパイラはなく、その存在は統合開発環境が隠蔽していた。 そのうちに HSP (Hot Soup Processor) を知り、簡単に GUI プログラミングができると興奮し、かなりの数のくだらないソフトウェアを作ったと思う。画面キャプチャ、ただファイルをゴミ箱に送るだけのソフト、画面端で常駐する電卓、円周率を計算するやつ…..
そう、HSP で円周率を計算し始めたことで気づいた。HSP は遅い。C言語は速かったのに。
そのころになってようやく、世の中にはコンパイル型言語とインタプリタ型言語というものがあると知った。いや、知ったというよりは実感したと言うべきだろうか。とにかく、コンパイラというものに惹かれ始めたのは中学1年生のかなり後半だったと思う。ここから、私とコンパイラとの関係が始まったのだと思う。
最初のうちは、Ruby の VM に興味を持っていた。なぜ Ruby なのかはよく覚えていないが、おそらく英語が読めない私にとって、日本語の資料が落ちていたのは魅力的だったのだろう。YARV の内部構造を説明するサイト(たぶんこのあたり)に釘付けだった。この文章を書きながらリンク先を眺めていたが、今見ても面白い。第3回:命令ディスパッチの話は、当時は理解こそできなかったものの、こんなことができるのか!すごい!と興味津々だった。これが中学2年生の初めの話。
インタプリタやコンパイラのことを認識した以上、何らかの言語を作りたくなるのは避けられない。 (実は HSP で電卓を作っていた頃に、小さな言語のようなものは作っていたが、BASIC よりもしょぼい文法で、AST すら知らなかったためぐちゃぐちゃのコードだったと記憶している。もう手元にはコードが残っていない。そのコードが入っている80GB HDDは分解して、ディスクを手裏剣のように投げて遊んでいた。) 今手元に残っている言語処理系で、一番古いものは Lit だ。いつのまにか C++ を覚えたようで、C++ で書いてあるし、なんとご丁寧にGitHubに置いてある。 まったく思い出せないが、どうにかgitやGitHubの使い方を覚えたようである。最初のコミットは中学2年生の夏休み頃となっている。 Lit は Ruby っぽい言語で、なんと JIT コンパイルできる。初期は手動でアセンブラ(と言っても命令に対応する16進数をハードコードしているだけだが)のようなものを書いており、それを使って JIT していたようだ。結局 LLVM を導入してしまったようだが。そもそもどのような経緯でLLVMを知ったのかも思い出せない。
中学3年生になると、ほとんど理解できていなかったと思われるが、Python や Clang を読んでいたような気がする。また、中学生が終わろうとしているときに、CMake があまりにも嫌いで C++ ごと捨ててしまった。同時に Rust を本格的に使い始めた。
そろそろこの文章を書くのも疲れてきた。ここからは簡潔にまとめよう。
高校生になると、本当に色々なことがあった。入門したての Rust でいきなり C言語のコンパイラを作ったり (8ccには本当にお世話になりました) 。 ブラウザを作ったり。JavaScript処理系を作ったり。JVMを作ったり。.NET VMを作ったり。型システムにも少しだけ詳しくなった。受験が嫌でコンパイラ基盤を作ったりもした。そうそう、プログラミング言語処理系が好きな人の集まりというSlackワークスペースも開いた。受験期なのに地下鉄でLLVMのソースコードリーディングをしていた。
そして大学生になった。流行り病のことは完全に予想外だった。一年間完全にオンラインだったこともあり、家でずっとコンパイラのことを考えていられる生活ができたのは良かったかもしれない。これからもコンパイラのことを考え続けるだろう。
しかし、ひとつだけわからないのは、私はコンパイラの何が好きなのかということだ。ただ漠然と、好き、という感情があるだけで、それ以上何もない。 今後しばらくは、コンパイラの何に惹かれているのかを考えることになりそうだ。