プログラミングの低レベルと高レベル

プログラミングにはレベルの低い・高いがある。ここでいうレベルとはCPUとかストレージデバイスといった生のハードウェアに近いかという意味である。レベルが低いほど生のハードウェアを意識しなければならない。カーネルは低レベルなソフトウェアの代表である。高尚かどうかと混同されることを嫌ってか、低レイヤ・高レイヤという言い方も良くする。私はあえて混同させたくてレベルという単語を使用している。

私は元々低レベルのプログラミングの方が計算機を操ってる感があって好きだった。しかし、しばらく離れてJavaとかPythonとか高レベルなことをやっていたが、ふと低レベルのところを再び触りたくなったので、

  • ハッカーのたのしみ
  • Binary Hacks
  • Cプログラミング高速化研究班

等を読み返しながら勉強している。低レベルはちょこちょこっとチューニングするだけで演算が高速化していき、ハッカー感が得られるので楽しい。

業種にもよるのだろうが、高レベルなソフトウェアより低レベルなソフトウェアの方が偉いという風潮がある。UIよりもビジネスロジックの方が、業務アプリよりミドルウェアの方が、ユーザーランドで動くソフトウェアよりカーネルランドで動くソフトウェアの方が、作るのが難しいと考えている人たちがいる。

私はこの風潮が嫌いだ。なので、あえて「レベル」と呼んでいる。別に低レベルの方が難しいなんてことはない。低レベルな方が同じ程度の結果を実現するのが面倒なだけである。難しさでいうと、生の機械が抽象化されていないので、私には簡単に思える。

低レベルなプログラミングは割に合わない。高レベルな方が同じ手間で得られる成果が大きいので、その分仕事でやるには有利だ。仕事でやるなら、Javaで作れるものを、Cで作るなんて馬鹿げていると思っている。

ただ、Cで作るべき場所というのも当然ある。手間をかけるべき箇所は手間をかけるべきだ。

さて、Cで面倒臭いことをするのに慣れてしまっている人というのが非常に厄介だと思っている*1。ソフトウェアの開発手法も、Cオンリーの頃と比べて研究が進んでいて、こういう手順でやれば上手くというプラクティスが世の中では普及している。しかし、彼らは20年前で感覚が止まっているのだ。世間では常識的な手法が受け入れられない。

主観だが、Cプログラマはコードが汚い。Cしかなかった頃のプログラミングは基本的に我流だ。オープンソースもなかったし、開発手法も体系化されていなかった。個人で工夫して自分のやり方を身につけてきたようだ。だから、できない人は全くできない(何もやらない)人になっているし、できる人は我流のコードを書き散らかしている。綺麗な人は綺麗だが、汚い人はとことん汚い。私もCは我流だから、人のことは言えないが……。オープンソースだってLinuxは綺麗だが、Sambaは非常に汚い。

また、Javaなどの世界では一般的な手法が受け入れられない。「モダンCプログラミング」という本を昔読んだが、こういう本が書かれる背景はよく理解できる。ある人のtweetを引用する。

日立の方が遥かに良かった。なぜ辞めたんだろうか。もっとまともな開発を思い浮かべてた。たぶん、コードコンプリートとかで勉強もせずにただ自己流なんだろうな。。。つらい

ハードウェアの方が偉いと思っている愚かな人いるじゃないですか?偏狭なCプログラマはそういう人と同じに見えるのだ。私はそうはなりたくないのだ。

ハードウェアと同様に、低レベルなソフトウェアは、原理的に生産性が低いのだから金になりずらい。それでもやる場合はかなり工夫が必要だと思っている。そのために、近代的なソフトウェアの開発の手法をかなり勉強しているつもりだ。全く陽の目を見ないけど……思うようにするには色々足りない。

まとまりのない文章になったが言いたいことは、低レベルは面白いが価値を生み出しづらいので取り組む場合は相当の工夫がいるということ。

Cプログラム高速化研究班 コードを高速化する20の実験と達人の技

Cプログラム高速化研究班 コードを高速化する20の実験と達人の技

*1:周囲にいないのでわからないが、多分コボラーの方がもっと厄介だろう。