組込み系プログラマの終末

プログラミング、デバイスドライバ、資格、試験、等などなど

C言語を学んだほうがいいと言われ続けている3つの理由

大部分のプログラマにとってC言語は殆ど縁の無い言語ではないでしょうか。しかし「C言語を知っておくといい」という謎の呪文を聞いたことがあるプログラマは多いんじゃないかな?「C言語を知っておくといい。ただし仕事で使うことはないだろう」・・・意味不明ですが時々聞きますよね。
実は私もそんな呪文を唱えたい気持ちをぐっと堪えて過ごしている身です。C言語を学んだほうがいいと言われる所以をC/C++プログラマ視点で書いてみます。

新しい言語やフレームワークを前向きに学べる

例えばHTTPサーバを実装しようと思ったとしましょう。
HTTPサーバとはGETとかPOSTといったリクエストを受けて、HTML形式の文字列を返すサーバプログラムです。万が一血迷ってこれをC言語で実装しようとしたら最低でも下記の知識が必要です。

ソケットプログラミング(socket,bind,listen等)
文字列処理
メモリ管理
並列処理(fork,pthread,mutex等)
ディレクトリ操作
シグナル

などなど・・・信じられないほど膨大な知識を要求されます。最小限の動作だとしても1000行以上のコードになるでしょう。C言語は低レベルな言語なので1から10まで実装してあげないといけないのです。


ではこれをスクリプト言語Rubyで書くと・・・

require "webrick"
Thread.start{ 
   WEBrick::HTTPServer.new(DocumentRoot:".",Port:8888,BindAddress:"127.0.0.1").start
} 

たったこれだけです。なんと4行です。もちろんこれは実用レベルではありませんが、このコードだけでカレントディレクトリを公開できます。さらにすごいことに、webrickRubyの標準ライブラリに組み込まれています。つまりRubyをインストールしたら最初っから入っているわけです。こんな高機能なライブラリがゴロゴロしているんです。何気なく普段使っているライブラリも、C言語で書いたら数千行になるって考えると高級言語に思わず感謝してしまいます。
感謝することの何がいいかって、ポジティブな気持ちで技術に取り組めることです。 「この糞仕様言語が!」と思いながらよりも「こんな機能があるんだ。すごい!」という気持ちで学んだほうが学習効率がいいですよね。

バグの経験値でレベルアップ

アプリケーションはさまざまなトラブルを引き起こします。アプリケーションが突然終了、フリーズ、明らかに様子が変等・・・
こういった場合の原因は色々ありますが、C/C++で一例を挙げると

メモリリーク
リソース開放忘れ
スレッド間のデータ不整合
NULL参照
割り込みの競合
スタック破壊

などなど実に様々です。スタック破壊などは極悪の極みで「二度とこんなデバッグやりたくねえ・・・」と思うこと間違いありません。
スレッドセーフの問題はどの言語でも問題になりますが、高級言語でこのくらい低レベル(ハードに近い)なバグはあるのでしょうか?私はあまり見かけません。おそらくスマートポインタ、ガベージコレクション、ライブラリ、フレームワーク等によって隠蔽されているおかげなのでしょう。

このような低レベルなバグのデバッグは大変ですが、プログラマとしては経験しておくべきかもしれません。

・実装時に慎重になりバグが減る
・裏でどんな処理が動いているか想像できるから、実行コストを意識したプログラムを書ける
・コンピューターの仕組みに詳しくなる

このような効果があるのではないでしょうか。

ちなみにやたらバグ修正していますが、私は他人の尻拭い(バグ対応)をすることが多いだけで自分の書いたプログラムがバグだらけなわけじゃないです!あしからず。

アプリケーションの高速化

C言語は高速です。スクリプト言語の数十倍〜数百倍で高速動作します。高速動作するということはとても大きな意味があります。サーバアプリケーションの場合同時に多数の人がアクセスするから、処理時間が遅いと全てのクライアントを待たせることになります。スクリプト言語で処理時間がボトルネックになってしまった場合、そのボトルネック部分だけC言語で書くことで効率改善できるかもしれません。
問題が起きた時の最終手段としてC言語置換ができる、このことに価値を見いだせるならC言語を学ぶ意味は大きいです。

まとめ

C言語を使用する機会は限られています。しかしC言語のような低レベルな言語を学ぶことで、他言語習得コストが下がったり、実装スキルがあがったり、アプリケーションの高速化ができたりと意味はあると思います。是非一度触ってみて欲しいです。