混沌の廃墟にて -96-

初めの第一歩

1989-12-23 (最終更新: 1996-07-20)

[↑一覧] [新着] [ホームページ]


プログラム開発の極意は何だろう。新人プログラマーを教育する場合に、これ は重大な問題である。ある程度プロフェッショナルだと思っているプログラマー は、自分なりの極意を体得しているのではないだろうか。

実際、プログラミングに重要なエッセンスが何かあり、ポイントさえ把握すれ ば短時間で新人を教育できる、という手順があればよいが。コーダーに徹すると 言うなら術もあるかもしれないが、私はこれは不可能だと思っている。

設計論のあたりから、プログラミング・センスの重要度がぐんと増加するよう な気がするのだ。そして、センスを身につけるための教育は難しい。歴史に残る 作曲家を育てることが難しいのと同じようなものかもしれない。このような職業 には、生まれつきの素質や、子供の頃の環境要因などが大きく影響するのではな いか。(*1)

別の観点から考えると、初心者向けのよい教科書があるということは重要だ。 最近特にC言語の入門書が目につく。雑誌にもC言語の入門講座がいくつかある。 気になることもある。初心者向けの本の中に、用語の扱いが雑なものがたまにあ るのだ。

入門書は、何かを学ぶ目的でその本をまず買って読む人がいることを想定する べきだと思う。たとえば、その内容は鵜呑みにされるかもしれない。間違ったこ とが書かれていても、間違いか本当か判断できないのが初心者。もっとも、ひど い間違いがあると、そこで挫折するかもしれないし、混乱して他の本に乗り換え るかもしれない。

私はC言語フォーラムで、特に雑誌に連載されている入門者向けの講座で目に ついた誤り(と私には思われるもの)を指摘したことが数回ある。これにはほと んど反響がない。私なら、得体の知れない人が BBS に書いたたわごとよりは、や っぱり雑誌の入門講座を信頼するかもしれない。C言語入門者のみなさん、大丈 夫ですか?

今一番気になっているのが、C MAGAZINE で連載中の入門講座である。私の見た 範囲では、この入門講座の用語の扱いはかなり雑である。例えば、'89 12 月号で は、文と式の区別がかなり混乱しているし、if 文の括弧の中に書かれるような式 を「条件式」と呼んだりしている(C言語では通常 ?: という三項演算子による 式のことを条件式と呼ぶ)。また、'90 1 月号では、「!=」のことを否定演算子 と呼んでいる。

'90 1 月号には「統合規則」「一般変数」という私の知らない用語が出てくる ので、この入門講座は初心者の私には難しすぎると思ったのだ。という話はさて おき、極めつけは、'89 12 月号で「関係演算子」と「等値演算子」について、

>     ところで、関係演算子と等値演算子は同じような働きをするのにふたつに
>   分かれているのはどうしてなのか不思議に思われるかもしれません。これは
>   ふたつの演算子の優先順位が違うため、別々の名前がつけられているのです。

    (C MAGAZINE、日本ソフトバンク発行、'89 12, p.114
    「C言語入門講座、はじめて学ぶCプログラミング」高木聡/山崎伸行著)

と書いてあるのに、1月号を読むと「等値演算子」として説明されるべき演算 子は、関係演算子の単なる一種として扱われているのである。

これでは等値演算子は関係演算子の一種なのか、別の演算子なのか、区別する ことが難しい。このような指摘は、揚げ足取りだといわれるかもしれない。しか し、初心者に対する講座である。こんなに簡単に揚げ足を取られるように書くべ きではないと思う(*2)。

話はここで終わるはずだったのだが、何となくK&R 2nd. をながめていると、何 と「!=」を関係演算子であると書いた所があって驚いた。K&R にまで言われたら、 もう私の手には負えない。誰かC言語に詳しい方がいらっしゃいましたら、どう か「!=」は関係演算子なのかそうでないのか教えてください。

しかし、これが関係演算子と呼ばれようが呼ばれまいが、質の高いCプログラ ムを書くためには何の役にもたたない。論点は、初心者が入門講座を読んだ時に、 余計な混乱を与えないことである。誤解なきよう。

    *
全く関係ない話だが、同じく C MAGAZINE '90 1 月号の「C言語雑学講座」に、 for ループをコンパイルした時のコードについて書いてある。単純に展開すると 次のようになると言うのだが。(p.123 List. 12)
    式 1
L1:
    式 2
    jt L3
    jmp L4
L2:
    式 3
    jmp L1
L3:
    文
    jmp L2
L4:
jt は真の時にジャンプと解釈してください。これについて、著者がジャンプが あちこちに飛んで見苦しいと評しているのは同感だ。ただ、私なら for ループを 単純に展開しろと言われれば、jf (偽の時にジャンプ)を使って次のようにする のだが、この発想の違いはどこに由来するのだろうか。コンパイラを作る時の要 素として、暗に必要な条件があってのことかもしれないと思っている(*3)。
    式 1
L1:
    式 2
    jf L2
    文
    式 3
    jmp L1
L2:

補足

(*1) どこで生まれたらどうだ、という話ではない。向き、不向きがあるだろうと いうことである。すぐに差別論に持っていこうとする人もいるようなので、念の ため。

(*2) 実際に連載してみると、人のことなど言っている場合ではない、というのが よくわかるものだ。

(*3) forループのコードに関して、この後、コンパイラの設計上、やはり雑誌に 書かれた処理の方が自然ではないか、という意見が出て議論になった。確かにそ れは一理あるのである。


    COMPUTING AT CHAOS RUINS -96-
    1989-12-23, NIFTY-Serve FPROG mes(5)-005
    FPROG SYSOP / SDI00344   フィンローダ
    (C) Phinloda 1989, 1996