以前仕事仲間の間で話題になったのですが、未経験の新人にJavaを教育している会社が多いといいます。2年ほど前の話なので今はどうかわかりませんが、そんなに事情は大きく変わらないのではないでしょうか? 一方で弊社のWebサイトではC言語の記事を多めに掲載しています。今回はこの辺りの話をしてみたいと思います。

未経験者にもいろいろあって、実務は未経験だけれど趣味などでプログラミングを経験している場合もあります。そのような方に対しては、すでに経験しているプログラミング言語から出発したほうが話が早いこともあります。未経験でこの業界に入ってきた方の中には、CもC++もJavaもC#も経験しているケースもあって、それなら一から教育するというよりそれぞれを深掘りするほうが得策というものです。

まだどんなプログラミング言語も習得したとはいえないほど経験が浅い新人は、どんな分野の仕事をするかにもよりますが、組込みや制御をやるのであれば、ハードウェア寄りの知識が不可欠になりますので、JavaではなくC言語を教材にするのが妥当だと考えます。

さて、ここからが本題です。世の中には「C言語は難しい」と決めてかかっている人も多いようですが、本当にそうでしょうか?

実際にはC言語というプログラミング言語自体はそんなに難しくはありません。むしろ簡単な部類だと思います。言語仕様自体がシンプルなので覚えることは少ないですし、初版のC規格(=C89)なら標準ライブラリを全部覚えてもたかが知れています。

難しいのは、C言語を使って低水準(程度が低いということではなくハードウェア寄りの意味)なプログラミングをするのが難しいということだと思います。ただ、それも考えようで、どこかの誰かが作った便利な部品をつなぎ合わせるだけのプログラミングばかりやってきた人にとっては、便利な部品がないので「難しい」ということになるのです。

私はいつもよくいうのですが、どこかの誰かが作った「便利な部品」をつなぎ合わせてアプリケーションを作るだけならC言語を覚える必要はありません。そうではなく、その「便利な部品」を作るどこかの誰かになるための言語がC言語なのです。ですので、Javaやスクリプト言語とはそもそもの用途が異なります。

ちなみに、Javaやスクリプト言語でハードウェアを直接制御するようなプログラムを書こうと思うと、とんでもなく難しいことになります。おそらく不可能といってもよいでしょう。出力ポートに1か0を書き込むだけでも、どこかの誰かが作った「便利な部品」の助けを借りないことには実現できそうにありません。

また、C言語が難しいといわれる理由のひとつに、ガベージコレクションがないのでメモリの解放を自分で行わなければならないというのもあります。確かにそうなのですが、JavaやC#なんかでも、メモリの解放こそガベージコレクションで済みますが、リソースの解放は自分で行わなければなりません。それらの言語は入門の段階から「メモリの解放はしなくてもいい」というところから入っているので、リソース管理がまるでできていないクソコードの温床にもなっているように思います。

もうひとついうと、C言語の主な用途である組込み、それも典型的な組込みといえるマイコンのプログラムでは、そもそもメモリの動的な割り付けや解放を行うこと自体が稀です。メモリを静的に確保しておけば、面倒なメモリ管理を行う必要がありません。

もちろん、データベース管理システムや言語処理系などをプログラミングする際には動的なメモリ管理が必要になってきますので、その場合はがんばるしかないのですが。逆にいえば、自分でメモリ解放のタイミングを制御できない言語では、かえって設計が難しくなる可能性さえあります。

決してC言語は特別難しいというわけではなく、Javaやスクリプト言語のほうが適した分野で単純に実装言語をC言語に置き換えようとすれば難しいというだけだと思います。C言語に適した分野で単純に実装言語をJavaやスクリプト言語に置き換えようとすると、難しいを通り越して不可能になってしまうのですから、用途によって言語は使い分けるべきだというだけの話なのです。

最終的にJavaやスクリプト言語を使うにしても、C言語を使いこなせるかどうかで、そのプログラマーがどこまでやれるかの限界は違ってくると思いますよ。