C言語を学んだほうがいいと言われ続けている3つの理由
大部分のプログラマにとってC言語は殆ど縁の無い言語ではないでしょうか。しかし「C言語を知っておくといい」という謎の呪文を聞いたことがあるプログラマは多いんじゃないかな?「C言語を知っておくといい。ただし仕事で使うことはないだろう」・・・意味不明ですが時々聞きますよね。
実は私もそんな呪文を唱えたい気持ちをぐっと堪えて過ごしている身です。C言語を学んだほうがいいと言われる所以をC/C++プログラマ視点で書いてみます。
新しい言語やフレームワークを前向きに学べる
例えばHTTPサーバを実装しようと思ったとしましょう。
HTTPサーバとはGETとかPOSTといったリクエストを受けて、HTML形式の文字列を返すサーバプログラムです。万が一血迷ってこれをC言語で実装しようとしたら最低でも下記の知識が必要です。
ソケットプログラミング(socket,bind,listen等)
文字列処理
メモリ管理
並列処理(fork,pthread,mutex等)
ディレクトリ操作
シグナル
などなど・・・信じられないほど膨大な知識を要求されます。最小限の動作だとしても1000行以上のコードになるでしょう。C言語は低レベルな言語なので1から10まで実装してあげないといけないのです。
require "webrick" Thread.start{ WEBrick::HTTPServer.new(DocumentRoot:".",Port:8888,BindAddress:"127.0.0.1").start }
たったこれだけです。なんと4行です。もちろんこれは実用レベルではありませんが、このコードだけでカレントディレクトリを公開できます。さらにすごいことに、webrickはRubyの標準ライブラリに組み込まれています。つまりRubyをインストールしたら最初っから入っているわけです。こんな高機能なライブラリがゴロゴロしているんです。何気なく普段使っているライブラリも、C言語で書いたら数千行になるって考えると高級言語に思わず感謝してしまいます。
感謝することの何がいいかって、ポジティブな気持ちで技術に取り組めることです。 「この糞仕様言語が!」と思いながらよりも「こんな機能があるんだ。すごい!」という気持ちで学んだほうが学習効率がいいですよね。
バグの経験値でレベルアップ
アプリケーションはさまざまなトラブルを引き起こします。アプリケーションが突然終了、フリーズ、明らかに様子が変等・・・
こういった場合の原因は色々ありますが、C/C++で一例を挙げると
メモリリーク
リソース開放忘れ
スレッド間のデータ不整合
NULL参照
割り込みの競合
スタック破壊
などなど実に様々です。スタック破壊などは極悪の極みで「二度とこんなデバッグやりたくねえ・・・」と思うこと間違いありません。
スレッドセーフの問題はどの言語でも問題になりますが、高級言語でこのくらい低レベル(ハードに近い)なバグはあるのでしょうか?私はあまり見かけません。おそらくスマートポインタ、ガベージコレクション、ライブラリ、フレームワーク等によって隠蔽されているおかげなのでしょう。
このような低レベルなバグのデバッグは大変ですが、プログラマとしては経験しておくべきかもしれません。
・実装時に慎重になりバグが減る
・裏でどんな処理が動いているか想像できるから、実行コストを意識したプログラムを書ける
・コンピューターの仕組みに詳しくなる
このような効果があるのではないでしょうか。
ちなみにやたらバグ修正していますが、私は他人の尻拭い(バグ対応)をすることが多いだけで自分の書いたプログラムがバグだらけなわけじゃないです!あしからず。