本の虫

著者:江添亮
ブログ: http://cpplover.blogspot.jp/
メール: boostcpp@gmail.com
Twitter: https://twitter.com/EzoeRyou
GitHub: https://github.com/EzoeRyou

アマゾンの江添のほしい物リストを著者に送るとブログ記事のネタになる

筆者にブログのネタになる品物を直接送りたい場合、住所をメールで質問してください。

Wandboxのスポンサーになるべく、めるぽんに肉をおごってきた

WandboxというWebサイトがある。これはコードを与えるとコンパイルメッセージと実行結果を返してくれるサービスを提供している。コードとコンパイルメッセージと実行結果を保存してURLで共有する機能もある。

ここまではよくあるサービスだが、Wandboxが他のサービスと差別化を図っているのは、コンパイラーの種類だ。様々な言語のコンパイラーをサポートしているのみならず、同じコンパイラーでも複数のバージョンを提供している。これにより、あるコードの挙動がコンパイラーのバージョンで異なる場合の特定ができる。

なぜそんなサービスが必要なのか。コードぐらい自分のローカル環境で実行すればいいではないか。リモート環境にしたって、今日びVPSなど月数百円から使うことができる。ブラウザーから入力する程度の短いコードをコンパイルして実行するぐらい低スペックの格安VPSでも足りるではないか。

問題は、バージョンの異なるコンパイラーの混在と切り替えはだるいということだ。

例えばGCCを3-stage bootstrapでビルドするには1,2時間はかかる。しかも、数GBものストレージを消費する。ということは、GCCの過去のバージョンを10種類用意しようと思ったら、数十時間と数十GBが必要になるということだ。

C++コンパイラーはGCCだけではない。Clangもある。Clangの過去のバージョンを10種類用意しようと思ったら、また別に数十時間の数十GBが必要になる。

プログラミング言語はC++だけではない。Javaは? PHPは? Pythonは? Rubyは? これらの言語にはそれぞれ複数の実装があり、実装ごとに複数のバージョンがある。全部ビルドするには何百時間、何百GBも必要になる。

ほんの数行のコード辺のバージョン間の挙動を、たまに確かめたい時に、ローカルにそんな環境を用意するのはやりたくない。Wandboxの価値はここにある。

さて、そんな便利なWandboxだが、最近スポンサーを募集している。ドワンゴもスポンサーになっている。

Wandboxにはとてもお世話になっているので、ぜひともスポンサーになりたいところだ。しかし、私はクレジットカードという匿名性のない上に不必要な第三者に記録される送金手段を使いたいとは思わない。思えば、Wandboxのめるぽんとは久しく会っていない。めるぽんは無頼の肉好きであるので、めるぽんに直接、肉をおごることでスポンサーになることにした。

さて、めるぽんはグルメでいらっしゃるので、粗悪な肉でもてなすことは大変失礼に当たる。銀座にあるような高級ステーキ店ならば、めるぽんの舌も満足することであろう。しかし、店を探すのは難航した。というのも、店がまともな食事を提供するには、終日全面禁煙であることがまず必要となるからだ。ニコチン中毒の客にまともな味がわかるはずがないから、そのような店は味で客を得る努力をしていないはずで、味による市場の淘汰を経ていない。

さて、結論から言うと、筆者による店探しは完全に失敗した。これは私が携帯電話を持っていないために店の予約ができなかったためである。しかたなくめるぽんの行きつけの店に行くことにした。はじめからこうすればよかったのだ。めるぽんは肉が主食であり、普段から肉を食べ慣れているので、どこにでも行きつけのステーキ店の一つや二つはあるはずだ。

目的の店に向かう道すがら、我々はコンパイラーのブートストラップ問題の話をした。

ブートストラップ問題とは、あるプログラミング言語のコンパイラーが同じプログラミング言語で書かれている場合に起こる問題である。あるプログラミング言語で書かれたソフトウェアをコンパイルするにはコンパイラーがいる。コンパイラーもプログラミング言語で書かれたソフトウェアである。コンパイラーをコンパイルするにはどうすればいいのか。

答えとしては、まずコンパイラーを別の言語で実装するかハンドアセンブルするなどして作成する。そのコンパイラーを使ってコンパイラーをコンパイルする。後は、コンパイラーが前のバージョンのコンパイラーでも正しくコンパイルできることを保証すればよい。

GCCは歴史が長く、かつ多くの環境で標準のCコンパイラーでもあることから、ブートストラップへの対応は極めて優秀だ。かなり昔のバージョンのGCCでも最新のGCCがコンパイルできる。GCCの標準的なコンパイルは、3ステージブートストラップと呼ばれている。まず、システムのC++コンパイラーを使ってGCCをコンパイルするための最小限のC++コンパイラーと周辺ツールをコンパイルする。出来上がったC++コンパイラーで1ステージGCCをコンパイルする。1ステージGCCで2ステージGCCをコンパイルする。2ステージGCCで3ステージGCCをコンパイルする。2ステージと3ステージのGCCをテストして挙動に差がないことを確認する。テストが通れば、3ステージGCCは最低限のテストは通過したコンパイラーということになる。

他の言語はどうか。まず、ブートストラップ問題のない言語がある。あるプログラミング言語のコンパイラーが同じ言語で書かれていない場合、例えばCやC++などで書かれている場合、これは簡単だ。なぜならばGCCは極めて安定したコンパイラーであるので、ある程度最近の安定バージョンのGCCでコンパイルすればよい。

ブートストラップ問題を抱えている歴史の浅いプログラミング言語は問題だ。歴史の浅い、まだ発展段階のプログラミング言語の実装はとても急速に変わる。そのため、古いバージョンのコンパイラーは最新のコンパイラーでコンパイルできないという自体に陥る。そのためソースコードからのビルドが難しく、Wandboxではあまりにも古いバージョンのコンパイラーを提供できない。

このような話をしていると、我々は目的のステーキ店についた。空いていてタバコの害もなく高級な肉を出す店だった。

肉を食べながら、我々の話は、いかにしてめるぽんはプログラミングを学んだかという話題に移った。

人がプログラミングを学ぶ方法は様々だ。プログラミングの教育法はまだ学問として完全に固まっておらず、したがって多くのプログラマーは独学で学んでいる。筆者は幼い時にコンピューターがない環境で育ったので、参考書を読んで言語の文法と意味を脳内で理解するという作業のみしていた。さて、後にコンピューターを手に入れて、コードを書き、そのコードが想定通りに動いた時、筆者は目標を失った。なるほど、私の理解は正しかった。私はC言語の文法とその意味を理解している。ソフトウェアを書くことができる。しかし、今の自分の技術力で完成することがわかりきっているコードなど書いて楽しいのだろうか。そこに学びは何もないし、やりがいもない。自分ができるかどうかもまだわからないことに挑戦してこそ、やりがいというものは生じるものだ。そこで私はC++の規格書を読み始めた。そして今に至る。

めるぽんの経歴を知らない読者には、めるぽんがどうやってプログラミングを学んだかということに対して興味を抱かないだろう。この業界は実力主義で、ほとんどのプログラマーは独学でプログラミングを学んでいる。この業界では中卒と博士が机を並べて仕事をすることだって珍しくない。めるぽんがコンピューターサイエンスの学位や博士号を持っていないのにプログラミングができるというのは不思議でも何でもない。そう思うことだろう。我々は義務教育を不登校気味だった中卒がバリバリコードを書き、コンピューターサイエンスの学位を得た者がFizzBuzzすら書けないという話はいくらでも聞いてきた。しかし、めるぽんのような例は聞いただろうか。

めるぽんは高校時代、アマチュア・レスリングで優秀な成績を収めた。高校卒業と同時に自衛隊に入った。自衛隊では体育学校にいた。自衛隊は数年でやめた。自衛隊をやめた数年後には、すでにフリーランスのプログラマーとなっていた。

いったいめるぽんはどうやってプログラミングを学んだというのか。

めるぽんは高校時代、アマチュア・レスリングで優秀な成績を収めた。つまり、めるぽんは高校生まで相当な量の運動をしていたはずで、ガチガチの体育会系の人間だったはずだ。もちろん文武両道な人間はいくらでもいる。しかし、問題はその後だ。

めるぽんは高校卒業と同時に自衛隊に入った。自衛隊では体育学校にいた。自衛隊の体育学校というところは、運動中毒の人間だけが生きていける特殊な世界だ。世の中には運動中毒の人間がいる。「自衛隊に入ったら毎日、一日中、好きなだけ走ることができて、しかも給料が出る。最高だ」などと発言する人間のいる世界である。そして、この発言をした自衛隊員は何百kmも走るウルトラマラソン大会の走者で、実際に、文字通り一日中走っている。

運動こそ人生。仕事は一日中体を鍛える訓練。そんな環境でプログラミングの勉強ができるだろうか。

めるぽんは中学生の一時期、怪我をして柔道の練習ができなくなったことがあるそうだ。そんなめるぽんに、中学校の教師は、ではコンピューターをやれ、といってPC88だか98とプログラミング雑誌を渡したそうだ。当時はN88BASICの世界で、コンピューターを使うということはBASICでプログラミングをするということであった。当時のコンピューターは単純だった。電源を入れるとBASICインタプリターのプロンプトが表示される。BASICで書く。実行される。それだけだ。当時のめるぽんは、意味もわからないままに雑誌に記載されたBASICコードを入力し、当然入力間違いによりシンタックスエラーを起こし、その「シンタックスエラー」というものが何を意味するのかもわからないままにコンピューターを使おうとしていたそうだ。そして、わからないことがあると中学校の教師に質問に行った。

めるぽん「その教師、図画工作の教師で、他にも当時CADを使った授業とかがあって」
筆者「その教師、当時としてはおかしくないか?」
めるぽん「そういえばおかしい気がしてきた。なんであんな教師がいたんだろう」

さて、高校生になっためるぽんは、家の中で偶然にもBASICの教科書を発見する。なぜそんなものが家にあったのかはわからない。これによってめるぽんは、これまで意味もわからずに写経していたBASICのコードの意味を理解することとなる。

高校を卒業後、自衛隊に入り、その体育会系の空気とあまりの運動中毒に、自分には合わない場所だと判断してやめて、ゲーム会社に一年半ほど雇われた後、フリーランスになった。

肉がやってきた。めるぽんは肉が主食であるが、サラダも注文しておいたので、多大な説得の末、多少の野菜を食べさせることにも成功した。なぜめるぽんは肉を食べるのか。

めるぽん「肉と野菜のどちらを食べるかという選択が与えられた場合、これは当然肉を選ぶに決まっている」
筆者「なるほど、そして肉を食べた後は、野菜を食べるわけだな」
めるぽん「いや、肉を食べる」
筆者「寿司ではトロに満足した後は光物がほしくなるように、肉に満足したら野菜を食べたくなるものでは」
めるぽん「肉を選ぶという選択肢は依然として残っている。選択肢にある以上、肉を選ぶのは当然だ」

肉を食べ終えた後、我々の話題はバージョン番号に移った。

バージョン番号はソフトウェアの開発者が勝手気ままにつけるものである。今ではSemantic Versioningなどと叫ばれているが、本当にバージョン番号には何らの規則性もなく、したがってソートできない。Wandboxでは、バージョンの新しい順にコンパイラーを表示しているが、これは手動で順番をハードコードしているのだという。

自動でソートをしたかったが、数値や文字列による比較を拒否するバージョン文字列が多すぎて、例外ルールだらけになるので、結局手でやるのと手間が変わらない。

バージョン番号の付け方にも謎のルールがある。例えば、PyPyはマイナー番号の偶数と奇数で、Python 3.0対応版とPython 2.7対応版を分けているらしい。他にも、リリース版にもかかわらずバージョン文字列にrcと書いてあるものもある。

肉を食べ終えた我々は店を後にした。久しぶりに本物の肉を食べた実感がある。。

ドワンゴ広告

ドワンゴはWandboxのスポンサーになった。Wandboxはドワンゴの社員がコンパイラーのバグと思われるものを見つけた場合に、バージョンごとの挙動の違いを調べるのに役立っている。

ドワンゴは本物のC++プログラマーを募集しています。

採用情報|株式会社ドワンゴ

CC BY-ND 4.0: Creative Commons — Attribution-NoDerivatives 4.0 International — CC BY-ND 4.0