新・闘わないプログラマ No.145

Cで作る


いま仕事で、あるシステム(「Xシステム」とでも呼んでおきます)を全面的に作り直そうか、と計画しています。
そのXシステムは、他のいくつかのシステムの運用管理を支援するためのシステムで、基本的には夜間にバッチ処理で統計情報やら障害情報を取得して、運用管理者に分かりやすい形で提供する、というのがその主な機能です。
そもそもこのXシステムは、使い捨てのつもりで入社2年目の若手が作ったものが原型で、そのあと何故か捨てられずに、管理対象システムを増やしながら、機能拡張もしながら、ずっと使い続けられていたものだったりします。
余談ですが、この手の「まあ、これは一時的に作った使い捨てのプログラムだから、厳密な例外処理なんかは省いて、とりあえず動くように作っちゃえ」プログラムは、どういうわけか使い捨てられずに、そのままシステムの重要な場所で使い続けられていたりする、というのは結構ありがちです。
かくいう私が作った「使い捨てプログラム」も随所で…。
某「なんだよ、このプログラム。○○って入力があると、××になっちゃうぞ。ちゃんと例外処理を入れろよ」
私「だからあ。そのプログラムは自分が使うためだけに適当に作ったやつだって言ったじゃん。それを勝手に使っておいて、文句言うなよなあ」

で、このXシステム、全部Visual Basicで書かれていて、しかも、作った本人からして使い捨てのつもりだったので、常用するには随所に不具合があって、しかも作った人間はすでに退職してしまっているので、いまさら修正をしていってもいつまでまともに使えるかわからない…ということで、「もう、この際だから作り直しちゃえ」ということになったわけです。
と言っても、開発費が出ないことには作り直すわけにも行かなわけなのですけど、都合のいいことに、このシステムを使う新規案件が発生して、しかもその案件のお客さんはかなり裕福。
「いいよ、いいよ、どさくさで混ぜちゃえ」という某筋からのありがたいお言葉。結局Xシステムの再構築の開発費をこっそり混ぜてしまうことに…。

で、言語はどうしようか、といろいろ考えてみました。
Visual Basicで作り直そうか、Perlでお手軽に作っちゃおうか、いやいやそれなら、勉強もかねてRubyで作ってみるのもいいなあ。でも、これ以上管理対象システムが増えちゃったら、いまでさえ時間がかかりすぎて困っているのに、これらの言語だと処理が早くならないしなあ、などなど。
で、結局、Cで作ることにしました。安直といえば安直なのですけど。C++にしちゃってもよかったのですが、私自身、どうもC++が好きになれなくて、という個人的なシュミの問題も入れちゃっていたりして。
で、担当のプログラマに「Cで作ることにしたから」と言ったら、「えー、いまさらCですかあ?」と言われてしまいました。「あんな古臭くて、汚い言語で作るの、やですよお」とも。

そりゃあまあ、Cは新しくも無いし、きれいでないところも結構あるし、でもでも、○○(←言語の名前、語弊があるといけないので伏せておきます :-))だって、△△だって…。
まあ、私も何年かCでプログラミングをやってきて、また知らない人の教えてきて、やっぱりこの言語って、過去のしがらみを引きずっているからなあ、と思うところはいろいろあるわけです。「なんでそんな汚い仕様になっちゃったの?」なんて部分が随所にあったりするわけで。
で、私がどうしてもC++を好きになれない理由が、このCの汚い部分をほとんど引き継いだ(例外もありますけど)上に機能拡張しているところだったりするわけです。いや、もちろん、「C++の拡張された機能のうち便利なものだけを、ありがたく使わせれもらえばいいんじゃない?」というのは、それはそうなのですが…。
それならそれで、C99と呼ばれているCの新しい規格ってのも興味があることはあります(「プログラミング言語Cの新機能」のページで分かりやすくまとめられています…私もまだ読んでいる最中ですが)が、これはどうなんでしょうね。流行るのかなあ。

さてさて、プログラミング関係の掲示板などを眺めていると、この「Cの仕様の汚さ」からくる不理解・誤解に基づいた質問や議論が結構多いです。一例を挙げれば「0とNULLと'\0'はどう違うか」。これ、本当によく質問されますし、それに答える人もよく理解していない人が多かったりして、議論が発散しがちです。
そもそも、整数型の定数「0」を、どこも指していないことが保証されているポインター値(null pointer)として使う、というあたりのCの文法上の汚さが、そもそもの元凶なわけですけど。

    int n = 0, *p;

    p = 0;     /* おっけー、「p = NULL」と同じ */
    p = 1;     /* だめだめ、文法違反だよー */
    p = n;     /* nにゼロが入っていたって、これは文法違反 */

まあ、これの正しい認識は、「C言語FAQ」「5章 ヌルポインター」を読めば得られるかと思います。
この「C言語FAQ」、Cでプログラミングをする人にとっては必読だと思うのですけど、職場で周りを見渡しても、読んでいる人の少ないこと。私は、事あるごとに、皆に薦めてまわっています。

さてさて、そろそろオチをつけないといけないのですが…って、別に毎度オチが必要なわけではないのですが。そもそも、書いた本人はオチのつもりで書いたのに、「てめー、このやろ。この間のやつ、オチがねーじゃねーかよー」と言われて落ち込むこともたびたび。
などと、言い訳をしていると、頭のすみに「Cで『子供を』作る」という、あまりにも下らない言葉がよぎって…いやまあ、いくら何でもそういうオチは……ねぇ。

[前へ] [次へ]

[Home] [戻る]


mailto:lepton@amy.hi-ho.ne.jp