2004年06月07日

C++言語の良書

少しコーディングから離れていたりすると、無性にC++のプログラミングがしたくなるときがある。それは、研究のためでも、趣味のためでも構わない。そして、そのようなときに自分を支えてくれる良書がある。今回はそれらのいくつかを紹介する。

プログラミング言語C++第3版
著者はC++の開発者であるBjarne Stroustrupで、C++のバイブル的な解説書。
ISO/IEC 14882:2003
C++の規格書。英語が読めるなら「プログラミング言語C++第3版」よりこちらのほうが良さそう。
Effective C++
C++のプログラミングを行う上で、必要な事柄が載っている。必携。
More Effective C++
Effective C++の続編。より深くC++を扱えるようになるだろう。
Effective STL
Effective C++のSTL版。STLを使うのであれば必読だ。
Modern C++ Design
テンプレートを用いた効果的な設計方法が、この本に書かれている。
オブジェクト指向における再利用のためのデザインパターン
オブジェクト指向プログラミングにおけるデザインパターンのための良書。オブジェクト指向によるソフトウェア設計をするなら必読。

これらの書籍を理解すれば、あとは必要なときにウェブによる検索やオンラインヘルプで十分事足りる。

Posted by Foota at 20:11 | Comments (0)

2001年02月04日

沈黙のJava VM

最近、Internet Explorer(IE)のJava VMが動かないことに気が付いた。Java VMとはJava Virtual Machineの略で、Javaのバイトコードを走らせることができるOSのようなものだ。つまり、これがないとIEでJavaアプレットを起動させることができない。

去年の後半からずっと忙しかったので、IEでのJavaの動作についてはほとんど気にも止めていなかった。しかし、動かないのがはっきりすると、やはり気になる。そこで、まず、ウェブ上で同様の現象が報告されていないか検索してみたのだがヒットしない。次に、最近インストールしたJava 2 SDK v1.3付属のJRE(Java 2 Runtime Environment)が怪しいと思い、削除してみた。しかし、一向に直る気配はない。今度はIEのオプションを考えられる限りいろいろといじってみたが、やはりダメであった。仕方がないので、現在使用しているIE5.5 SP1を削除して、IE5に戻してみたが効果はなし。終いには、Windows 2000 SP1を当て直したりしたが、変化なし。こうなったら根競べとばかりに、レジストリをくまなく見て回り、それらしい個所を調べては修正するという方法もとったが、どうにもならない。

Javaアプレットを動かすだけならば、Java VM Selector for IEでSunのJava Plug-inを使えば何とかなる。しかし、いちいち全画面を再描画するという動作に不満もあり、根本的な解決にもならないので、こりゃ、Windows 2000を再インストールしなけりゃダメかと思ったそのとき、ふと、あることが頭に浮かんだ。去年の8月にインストールした.NET Framework SDK Technology Previewのことである。早速、アンインストールしてみたところ、正常にJavaアプレットが起動した。.NETのC#が使えなくなっても困るので、最新の.NET Framework SDK Beta 1をインストールしてみたが、こちらは問題がなかった。

ふう、まったくやれやれである。

Posted by Foota at 00:00 | Comments (0)

2000年10月27日

ビットカウント

最近非常に忙しい。仕事の締め切りや期日まで何日あるのか、指折り数えながら過ごす日々である。

CやC++で数えると言えば、ビットを数えることが頭に浮かぶ。いわゆるビットカウントである。もう少し説明すると、コンピュータの中では、数字は全部0か1で表現されており、その1の数を数えることである。例えば、10進数の22なら、コンピュータ内で10110と表現され、ビットカウントは3となる。

K&Rより

int bitcount(unsigned x)
{
    int b;

    for (b = 0; x != 0; x >>= 1)
        if (x & 01) b++;

    return b;
}

K&Rの演習問題になっている高速版

int bitcount(unsigned x)
{
    int b;

    for (b = 0; x != 0; x &= x - 1) b++;

    return b;
}

これら以外でも、以前にインターネットなどを通じて知ったいくつものアルゴリズムがあるが、高速化を行うならテーブル参照が良いかもしれない。また、以下のようなアルゴリズムがあることも知った。

for文一つでビットカウント

int bitcount(unsigned x)
{
    int b;

    for (b = x; x >>= 1; b -= x);

    return b;
}

初めてこのアルゴリズムを見たときは、即座には仕組みが理解できなかった。このようなコードを知るのは嬉しいことである。この日記を読まれている方もどんな仕組みで動いているのか考えてみると楽しめるかも。

Posted by Foota at 00:00 | Comments (0)

2000年08月25日

Fortran

前回の随想録がC#で今回がFortranである。順序が逆のような気もするが気にしないでほしい(笑)。

Fortranは非常に古いコンピュータ言語である。まあ、古いといってもコンピュータができるよりも前にあるわけではなので、たかが知れてはいるが。それでも、今年2000年になって発表があったC#に比べると、40年以上も前から存在した。正確にはIBMが1956年ごろ開発したらしい。そして、1966年にFortran66という規格ができ、標準化された。その後、Fortran77、Fortran90、Fortran2000と着実に進化していくことになる。

しかし、現在Fortranが占める割合はそれほど大きくはない。それは、時代が進むにしたがって、よりよいコンピュータ言語が台頭してきたからである。BASIC、C/C++、Javaなど。何を以ってより良いとするかは難しいところだが、今あげた言語はそれなりに時代に合った言語だったのだろう。

それでも、Fortran(特にFortran77)はまだまだ現役である。中でも、計算科学の分野ではかなりの強い勢力を占める。過去の膨大なライブラリなどの資産はもちろんのこと、エイリアスが使用できないなど、速度効率のための最適化がやりやすい言語仕様なのである。そして、計算科学ではこの速度効率が最も重要なファクターを占めるのである。

というわけで、私は今日もFortranをいじっている。

Posted by Foota at 00:00 | Comments (0)

2000年08月16日

C#

最近、C#に興味がある。

C#とはマイクロソフトが提案するC++ライクのオブジェクト指向言語である。これはサンのJavaに対抗して開発された言語でもある。C#の#は++を二段に重ねたものだとか、+と+が重なったものだとか、C++の一段上という意味での#だとかいろいろ聞くが、どれが本当の由来なのかはよく知らない。

サンの開発したJavaは確かにオブジェクト指向言語としてなかなか良いものである。私もJavaが発表された直後に「これはいい!」と思いJDKをすぐにダウンロードしていろいろと遊んでみた。当時は発表された直後とあってJavaと言っても周りの人はほとんど関心を示さなかったのだが、しばらくしたら、こぞって取り上げ始めたのは皆さんがご承知の通りであろう。

しかし、サンがJavaを自分の手から離して標準化団体に完全に渡してしまうことを拒んでいる今の状況は良い状態とはいえない。それが商売敵であるマイクロソフトに好き勝手やらせないためだとしてもである。一方、マイクロソフトは標準化団体にC#を策定してもらおうと動いているようである。

やはり、コンピュータ言語自体は一私企業が握っているものよりも、ちゃんとした標準化団体が管理しているものの方がいい。だからと言って、JavaがC#に取って代わられてしまうのかといえばそれはわからないが。そう言えば、近いうちに情報処理技術者試験で用いられる言語にJavaが追加されるそうだ。これから見ても、急速に普及しているのがよくわかる。

私としては、企業などの思惑に左右されず、扱いやすくてパワフルなコンピュータ言語を使用していきたい。何だかんだ言っても、現状では、C++からはしばらく離れられそうにない。

Posted by Foota at 00:00 | Comments (1)

2000年02月29日

400年に一度の閏年

今年は400年に一度の閏年であり、そして今日は400年に一度の閏日である。今日のニュースでもそのために起こったコンピュータの誤作動を大きく報じている。もしかしたら、4で割り切れる年は閏年に決まっているでしょ? という方もいるかもしれないがそれは間違いである。

以下のCのソースコードを見て欲しい。一目瞭然であるが、4で割り切れ、かつ、100で割り切れないか、400で割り切れる年が閏年である。このとき、4で割り切れ、100で割り切れない年を閏年としてしまったり、西暦を二桁で扱ったために1900年として計算が行われたりすると、プログラムは誤作動を起こすのである。

year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)

これも一種の2000年問題だが、閏年に関しては、閏年ではないのに閏年だと誤認する2100年問題の方が、トラブルは大きい気がする。もっとも100年後のお話であるけれど(笑)。

話はちょっと外れるが、以前、以下に示す日付から曜日を求めるプログラムを見て感動したことがある。因みにこれは、C言語のFAQにも載っている、坂本智彦さんという方が書かれたものだ。

dayofweek(y, m, d)      /* 0 = Sunday */
int y, m, d;            /* 1 <= m <= 12, y > 1752 or so */
{
    static int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
    y -= m < 3;
    return (y + y/4 - y/100 + y/400 + t[m-1] + d) % 7;
}

こういうソースコードと出会った日は、なんだか嬉しくなる。

Posted by Foota at 00:00 | Comments (0)