ホーム > 読んだ > 国外

エキスパートCプログラミング
――知られざるCの深層

書誌

tagC
text唯野
authorPeter van der Linden
editor梅原系(訳)
publisherアスキー出版局
year1996
price3,107+tax
isbn7561-1639-6

目次

1感想
2抄録

履歴

2001.7.5読了
2001.7.6公開
2002.11.29修正

感想

文字通り C の上級書で、オブジェクトファイルやスタックの構造といった低レベルな話題にまで言及した本。実はもっと以前より購入済でパラパラと読んではいたのだが、じっくり読み通す時間がなく、すっかり後回しにしてしまっていた一冊である。それだけに「読みたくて読めないときがある以上、読めるときに読んでおく」ということの重要性を痛感しながら読んだ本でもあった。なぜなら、そうでないと「読まねばならないのに読んでない」本ばかり増えるという自明の結果を招くだけだからである。

内容に関しては割と定評のある本であるし、仮に問題があったとしても「自分から見当ぐらいはつく」という人がそもそもの想定する読者となる本なので、いずれにしても問題とはならない。あえていえば 11 章の C++ 入門はあくまでも概要レベルなので期待し過ぎてはいけないという程度である。それよりも類書の扱わないような話題にまで踏み込む一方で、様々な雑学的話題までふんだんに盛り込まれており、特に肩肘を張らない出来となっているのがすばらしいと思う。(個人的には「プログラミングのタオ」</a> が爆笑ものである。)また、そもそも C が高級言語というより高級アセンブラであるということも、本書で紹介されている C の成り立ちであるとか内情を読むことで自然に納得できるだろう。もっと、この手の本が増えてくれればコンピュータの専門書への敷居も低くなるのにな――と思った。

抄録

23

if(3 == i) などというように定数を先に書いておくと代入との書き間違いを避けることができる。(その時点でコンパイルエラーにできる。)

28

#include <stdio.h>
#include <time.h>

int main()
{
    time_t biggest = 0x7FFFFFFF;

    // ctime は現地時刻を gmtime は世界標準時を返す
    // そして asctime で文字列化している
    printf("biggest = %s\n", asctime(gmtime(&biggest)));
    return 0;
}

31-35

Multics プロジェクトの失敗に幻滅した Ken Thompson と同僚の Dennis Ritchie は 1969 年、PDP-7 に軽くて軽快な OS を搭載させる。これは全てアセンブラで書かれ、Brian Kernighan によって UNIX と名付けられた。(これが 1970 年のことなので、UNIX 時間は 1970 年 1 月 1 日から始まる。)しかし、メンテナンス性を得るために高級言語での OS の記述をしたかった Thompson は BCPL のサブセットである B という新しい言語(インタプリタ)を作成する。B は配列参照を「ポインタ + オフセット」とするような C との共通点も持っていたが型がなかった。Dennis Ritchie は PDP-11 上で型などをサポートする高性能な B を作り、これが C になった。

そのため C にはコンパイラ作者にとってみて都合のよい仕様がいくつもある。例えば、配列の添字が 0 から始まる、式中の配列がポインタに減退する、浮動少数点演算が常に倍精度になる、register キーワードがあるなど――である。そして、入出力やプリプロセッサはコンパイラに含まれない。(ちなみに最初のポータブル I/O ライブラリは、1972 年に Mike Lesk によって作成されたもので、これが最終的な標準 I/O ライブラリになった。)

32

コンパイラにとって重要な指標となるのは実行時の性能(生成したコードの速さ)とコンパイル時の性能(コンパイル時間の速さ)のふたつに大きく分けられる。そして、通常は前者に重きが置かれる。

36-37/224

Bourne シェルを開発した Steve Bourne はプリプロセッサを使って C を Algol-68 風に使おうとした。しかし、sh が有名になると当然ながらやっかいなメンテナンスの問題を引き起こした。(おまけに sh は独自のヒープ管理機能を使っていた。しかし、BSD 4.3 でも、この形式は残っている !)これが International Obfuscated C Code Competition (IOCCC : 不明瞭な C プログラムの国際大会、1984-)の誕生するきっかけになった。

// C を Algol 風にするプリプロセッサ
#define STRING char*
#define IF if(
#define THEN ){
#define ELSE }else{
#define FI ;}
#define WHILE while(
#define DO ){
#define OD ;}
#define INT int
#define BEGIN {
#define END }

// 例えばこんな感じ
INT compare(s1, s2);
    STRING s1;
    STRING s2;
    BEGIN
        WHILE *s1++ == *s2
        DO IF *s2++ == 0
            THEN return(0);
            FI
        OD
        return(*--s1 - *s2);
    END

// C だとこういうこと
int compare(s1, s2)
    char *s1, *s2;
{
    while(*s1++ == *s2) {
        if(*s2++ == 0) return(0);
    }
    return(*--s1 - *s2);
}

全文を読まれる場合はログインしてください


Up