C言語は冗長なんだけど、なんか好き
- さっそくですが、松本さんが好きなプログラミング言語を教えてください。
今はC言語をよく使うんですけど、C言語そのものが好きなのか、手に馴染んでいるから好きなのか、もはやわからない状況になっていますね。この状況を一般的に好きって言うでしょうけど。
ただ、僕にはそれほど言語へのこだわりがないんです。そもそも昔からプログラミング言語を網羅的に学習するのが苦手で。まず作りたいものがあって、次にどの言語がベストかを考えるようにしていました。
- そうすると、C言語に初めて触れたのはいつだったんですか?
今、僕は36歳で、大学に入ってから書いているので15年ぐらい前ですね。
当時はWindows95が発売され、自宅でもようやくPCが買えるようになった時代でした。ただ、それから数年経って、購入したPCだとスペック的に満足いくものがなかったので、自作していたんです。そうすると買ったPCが余るんですよ。
だからサーバー代わりにしていたんですけど、いじろうとするとミドルウェアやソフトウェアがC言語で書かれていたので、自然と触れるようになりました。
ただ、けっこう不満に思うことも多かったです。RubyやPerlであれば3〜4行くらいでできるのに、C言語だと何十行も書かなきゃいけなくて(笑)。
- なんでこんなに冗長なんだろう、と。
大学を卒業して社会人になる中でちょっとずつ見方も変わっていくんですけど、最初はそういう気持ちが大きかったです。ただ、シンプルでわかりやすかったんで、学ぶことで悩むことはありませんでした。
C言語に対する意識が変わった2つの瞬間
- 具体的にどういった見え方の変化があったのでしょうか?
大学卒業後にクラウドレンタルサーバーのホスティングをしている会社に入社したんですけど、ミドルウェアを拡張するためにC言語で書く機会が多くて。そのときにライブラリや関数が豊富にあって、組み合わせることで簡単にコードを書けることに気づいたんです。他のスクリプト言語と変わらないというか、うまくやれば短い行数で書くこともできるので、C言語は面倒だという印象からガラリと考えが変わりました。
しかもレベルの高い領域になると、人によっては内容をいじれないこともあって。それができると尊敬の眼差しを向けられるので、頑張ってできるようになりたいというモチベーションが湧いてきました。
あとはmruby(※組み込みシステム向けの軽量なRuby言語処理系)を使い出したときにも見え方が変わりました。mrubyってC言語で書かれたソフトウェアをRubyのコードでコントロールする、いわゆる組み込みスクリプト言語と呼ばれている使い方ができるんですね。mrubyのルールに従ってRubyを書いたり、mrubyに用意されている関数を使うと、イチからC言語で書かなくても動くわけです。
そうすると、自分が作りたいソフトウェアのコードが簡単に書けるし、C言語で面倒なことはRubyに出して書いてしまえば楽になります。自分が言語に対するこだわりがあまりないことも相まって、mrubyはある種のC言語のフレームワークかのように扱えるんじゃないかと感じるようにありました。
- 言語の特性としてフレームワークや世界観が広がっていくところに魅力や驚き、発見を感じるということでしょうか?
そうですね。昔はC言語があってRubyやPerlがありました。そのプログラミング言語の世界でソフトウェアを書いたり、ものを作ったりする感覚だったんです。
でも今は、さまざまなプログラミング言語を繋げてトータルでソフトウェアを作るためのフレームワーク、いろんな領域を繋げるためのツールなんだと考えるようになりましたね。
- このC言語への興味がC++やマクロ、Cを拡張した言語に向くより、C言語を突き詰めていく方向に向かったのはなぜだったのでしょうか?
C++にも興味はあったんですけど、ミドルウェアやシステムプログラミングをやる中で、僕の興味がOSやミドルウェアをコントロールしたいとか、どんなふうに実装したら高速で動くのかといったコンピュータサイエンスの領域に向いていったのが大きいですね。
OSに興味があるんだったらアセンブリ言語にいくんじゃないかみたいな話はよくされました。でも、それは道のりが長すぎて……。
- 松本さんがC言語に愛着を持つのはどんなところでしょうか?
OSの機能を直接コントロールできながらも、プログラミングらしさがあるのがすごくいいなと思っています。例えば、あるスレッドが動いている間に他のスレッドを作れないようにして、そのうえで権限を細かく変更できたり、スレッドの挙動を制御したりとか。自分が勉強したこととC言語の技術が重なった気がしました。
また、スレッドにどういうメモリの割り当てをするかによっても方法がいろいろあって。メモリリークを考慮しつつ一時的にメモリを確保するだけでいいなら、スタックで確保するだけで性能を高めることができます。
そうやってメモリの細かい制御やスレッド単位で権限や挙動を変えられたりできるのはC言語ならではかなと。もちろん、他のプログラミング言語はそういうことをするためのものではないというのもあるんですけど。
ただ、細かいことをやろうとするとC言語でやらないとやりにくいというところがあって。やや冗長なところはあるんですけど、自分の目的に対して一番扱いやすいんです。
- そうやってC言語にハマったことが、mod_mrubyやngx_mrubyの開発につながっているのでしょうか。
おっしゃるとおりです。自分はApache拡張モジュールを書けるようになったけど、当時務めていた会社でそれができる人が他にいるかというと話は別で。それならば、もっと扱いやすい抽象化レイヤーを作って、PerlやRubyで書けるようにできれば解決できるのではないかと考えるようになったんです。
そのタイミングで、Matz(まつもとゆきひろ)さんがmrubyをリリースしたこともあって、一気に開発のモチベーションが高まりました。加えて、わからないことをTweetするとMatzさんが相談に乗ってくれたのも大きかったですね。当時は面識がない間柄だったからにも関わらず、親身になってくれたことで自分の理想を形にすることができました。
言語にこだわりはなかったけど、Rustはヤバいと思った
- 近年はRustなど新たなプログラミング言語もたくさん出てきていますが、そういったものに対してはどのような印象を持っているのでしょうか。
これまでプログラミング言語にこだわりはないとずっと言ってきたのですが、Rustはヤバいと思いましたね。C言語でネックだったのは、コンパイルが通っても正しく動作するとは限らないことでした。コードは書けるけど、レースコンディションやメモリ安全性のデバックにものすごく時間がかかる、みたいな。どの段階でバグが起きるか予想できないのでテストにも書きづらいですし。
そういったマルチスレッドやメモリ管理の問題が、Rustの世界では言語仕様の段階で解決されているんです。C言語でコンパイルが通ってもソフトウェアが動く保証はないですが、Rustはそういったことがほとんどない。さらに、C言語と互換性が高く、C言語のようにスレッドやOSの機能を直接細かいところまで操作できる仕様も魅了でした。だからこそ言語使用としては複雑なので勉強する必要がありますが、学習コストに見合ったスキルを手に入れられると思います。そこそこ複雑なマルチスレッドかつ非同期処理のサーバプログラムを書いた時にコンパイルさえ通れば一発で動作して性能も非常に高く、メモリリークも起きていないことを体験したときには、これはすごいと感動しました。
- 今後、松本さんが仮想領域でプログラミングする時はRustを使う予定なのでしょうか。
そうですね。実は C言語で作った資産をRustに移行できるんです。だから、今までC言語を使わないと組めなかったものも、Rustで対応できるんじゃないかなと思っています。
先人のまねをすることが松本流の上達術
- 松本さん自身、多くの知識や技術の習得をされてきたと思います。最後に、新しいプログラム言語を学ぶ初心者にアドバイスをお願いできますでしょうか。
これは自分の中でバイアスがあるので、誰でもうまく成長するかはわからないのですが、自分が確実に成長できた方法は模倣することでした。
GitHubやLinuxのカーネルのソースもそうですけど、有名プログラマーやいろんな人が書いたソースコードが集まってるんですね。
- それを検索してまねする、と。
そうですね。先人たちが苦労して書いてくれたソースコードを参考にすることで成長できました。だから、書いて公開してくれてる人には敬意を持っています。
だから、まねしたものを自分が書いたかのようにするのは絶対にしてはいけないなと思います。誰のどこをまねしたか、それをいろんなところに書いておけば、コードを公開している人たちのモチベーションにもなる。
多くのプログラマーはまねしてほしくないとは思ってないと思うんですよ。むしろ、自分のソースコードをまねして使ってもらって、そこに感謝のコメントを書いているだけでも公開している人は救われます。
一方、まねをする人も悪いことをしてるわけじゃなくて、いいソースコードを参考にして書いたことを明示すると、オープンソースのいいサイクルが回ると思うんですよ。僕自身、いろんな発信をすることで繋がった人たちもたくさんいますし、まねをしているうちにどんどん自分らしいコードが書けるようになりましたから。
まずはコードをまねして、できればコードを書いた人に伝わるように感謝を残すことが、プログラミングを学ぶうえで大事だと思います。