Bug Collection
Translation Bugs

翻訳バグ
『プログラミング言語 C 第 2 版』

書名 『プログラミング言語 C 第 2 版』
著者 B. W. カーニハン、D. M. リッチー
訳者 石田晴久
発行所 共立出版
発行年 1989 年
原著 B. W. Kernighan & D. M. Ritchie
The C Programming Language, Second Edition
Prentice-Hall, Englewood Cliffs, New Jersey, 1988

言わずと知れた K&R 第 2 版の翻訳である。およそ C 言語を学ぼうとする者はその隅から隅までを熟読玩味しなければならぬ必読の書である。なにしろ著者の一人デニス・リッチーは C の設計者で、UNIX を (ケン・トンプソンとともに) 開発した人。ブライアン・カーニハンもプログラミング言語 awk の作者の一人として知られる。訳者の石田晴久氏も元東京大学教授で、日本に UNIX と C を紹介した人なんである。

訳書の第 2 版も発行から十数年、200 刷以上の驚異的な数字を記録し、さらにその記録を伸ばしつつあるのだが、その中に潜んでいたいくつかのバグは、いまだに訂正されないままだったりする。

なお、訳書からの引用は第 231 刷 (1999年1月発行) によった。その後の刷では訂正されているかもしれない。



C notation

訳書 9 ページに次のような文がある。

文字列の中の \n という記号は、改行 (newline) という文字の C 記号で、印字の場合、端末機を次の行の左端に進めることを示す。

「C 記号」という表現が用いられているが、この文脈では適切なものとは思われない。原文は「C notation」である。実は、同じ「C notation」が、訳書 24 ページでは「C の記法」と訳されている。こちらのほうが適切であろう。


blank

原著の blank の語が、訳書では「空白」と訳されていたり (たとえば 11 ページや 25 ページ)、「ブランク」と訳されていたり (たとえば 64 ページや 192 ページ) して、一貫していない。訳書中では white space という語句に対しても「空白」の訳語をあてているのだから、blank のほうは「ブランク」に統一すべきではないか。


very

次の文は訳書 14 ページにあるものである。

…数が右揃えになっていないために、出力が非常にきれいだとはいえないことである。

変な日本語である。これは、否定文で用いられた very を「非常に」と訳してしまったためである。ここは「あまり」と訳すべきであろう。


letter

訳書 53 ページに、大文字を小文字に変換する関数が例示されている。そして、それに続いて次のような文章がある。

このプログラムは ASCII 文字に対してのみ通用する。ASCII では対応する大文字と小文字は数値として一定の距離にあり、各文字は連続していて、AZ の間には文字しかないからである。これは EBCDIC 文字セットには当てはまらないから、このプログラムはそのような系ではうまくいかない。余計な文字まで変換してしまうのである。

この中には「文字」という語が何回か出てくるが、それらすべてが同じ意味で使われているわけではないことがお分かりだろうか。「EBCDIC 文字セット」とか「余計な文字」という場合の「文字」は character の訳語であり、その意味するところには数字や記号も含まれる。これに対し、「各文字は連続していて」とか「A と Z の間には文字しかない」という場合の「文字」は「アルファベット」の意味で用いられている。原書では letter ないし alphabet である。こちらのほうは「文字」とする代わりに「英字」としたほうが適切であろう。「英字」はしばしば alphabet の訳語として使用される。

ついでに指摘しておくと、「EBCDIC」の活字がクーリエになっているが、これは「ASCII」と同じ書体にすべきであろう。


nbr

訳書 230 ページに free という関数のコード例があるのだが、その中に次のようなコメントが書かれている。

/* 上の nbr へ結合 */
/* 下の nbr へ結合 */

この nbr というのは何か。うっかりしているとコード中で使われている変数か何かの名前だと思って見過ごしてしまうところだが、実際にはそんな名前の変数はどこにも使われていない。それでは本文中に何か説明があるかというと、そういうわけでもない。原書を見てみると、コード例中のコメントにはやはり nbr とあるだけである。仕方がないので、nbr に相当する語はないかと原書の本文を目を皿のようにして読んでいくと、あった。「neighbor」である。ここは「上 (下) の隣接ブロックへ結合」ぐらいに訳してほしいところである。


Greenwich Mean Time

訳書 324 ページの脚注に、「訳注」として、UTC (Coordinated Universal Time) に関する次のような説明がある。

Greenwich mean time (グリニッチ標準時 = GMT) を表わす。UTC は GMT に代わる新名称。

問題は「グリニッチ」である。Greenwich をカタカナで表記する際には「グリニッジ」とするのが普通である。これにはちゃんとした理由があり、英語でも -ch の部分は「ジ」のような有声音 (発音記号で示せば [ʤ]) で発音されるのが普通だからである。


adjacent

本書の「付録 C 変更点の要約」には、C 言語の仕様に関して、第 1 版で定義された旧仕様とこの第 2 版で記述されている新仕様 (ANSI 標準規格) の違いがまとめられている。その中のひとつに次の項目がある (p. 328)。

降接する文字列リテラルは連結される。

「降接」は「隣接」の誤植であろう。


usual arithmetic conversions

同じく「付録 C  変更点の要約」の項目のひとつに、次の文がある (p. 329)。

"普通の算術変換" は、"整数に対しては、unsigned が常に勝つ; 浮動小数については、常に double を使え" から、実質的に "十分な大きさで最小の型に格上げせよ" に変更されている。

この中にある「普通の算術変換」は、「usual arithmetic conversions」の訳語である。しかし、同じ「usual arithmetic conversions」が、241 ページでは「通常の算術変換」と訳されている。「普通」か「通常」かという些細な違いではあるが、これは言語仕様における基本概念のひとつを指す用語なのだから、どちらか一方に統一すべきところである。


compiler's license

同じく「付録 C 変更点の要約」に、次なる項目がある (p. 329)。

数学的な結合演算子を計算上も結合的なものとして扱うコンパイラのライセンスは取り消される。

言語仕様の新旧の違いを述べているのに、ライセンスの話は場違いな気もするし、それまでのコンパイラにはライセンスが与えられていたのかという疑問もある。また、「結合演算子」という用語も初出である (たぶん)。原文は次の通りである。

A compiler's license to treat mathematically associative operators as computationally associative is revoked.

ここで述べられているのは、演算子の結合性 (associativity of operators) についてである。例として、次の式を考えてみよう。

a * b * c

この式は、演算子の結合性により、次のように解釈される。

(a * b) * c

これを、「演算子 * は左結合性をもつ」とか「左結合である」とかいう。しかし一方、数学的には、これは次のように解釈しても結果は同じである。

a * (b * c)

このような数学的に可換な式を、C 言語の旧仕様ではコンパイラが適当に並べ替えて解釈することが許されていた。新仕様ではこれが許されなくなったのである。問題の文章はこのことを言っているのであり、したがって、「ライセンス」というのは比喩であると言えば言えるかもしれない。しかし、以上のことを訳文から読み取るのは難しい。



1999/07/22 公開
2006/03/21 更新
面独斎 (Mendoxi)
mendoxi@cam.hi-ho.ne.jp