少しコーディングから離れていたりすると、無性にC++のプログラミングがしたくなるときがある。それは、研究のためでも、趣味のためでも構わない。そして、そのようなときに自分を支えてくれる良書がある。今回はそれらのいくつかを紹介する。
これらの書籍を理解すれば、あとは必要なときにウェブによる検索やオンラインヘルプで十分事足りる。
最近、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をインストールしてみたが、こちらは問題がなかった。
ふう、まったくやれやれである。
最近非常に忙しい。仕事の締め切りや期日まで何日あるのか、指折り数えながら過ごす日々である。
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; } |
初めてこのアルゴリズムを見たときは、即座には仕組みが理解できなかった。このようなコードを知るのは嬉しいことである。この日記を読まれている方もどんな仕組みで動いているのか考えてみると楽しめるかも。
前回の随想録がC#で今回がFortranである。順序が逆のような気もするが気にしないでほしい(笑)。
Fortranは非常に古いコンピュータ言語である。まあ、古いといってもコンピュータができるよりも前にあるわけではなので、たかが知れてはいるが。それでも、今年2000年になって発表があったC#に比べると、40年以上も前から存在した。正確にはIBMが1956年ごろ開発したらしい。そして、1966年にFortran66という規格ができ、標準化された。その後、Fortran77、Fortran90、Fortran2000と着実に進化していくことになる。
しかし、現在Fortranが占める割合はそれほど大きくはない。それは、時代が進むにしたがって、よりよいコンピュータ言語が台頭してきたからである。BASIC、C/C++、Javaなど。何を以ってより良いとするかは難しいところだが、今あげた言語はそれなりに時代に合った言語だったのだろう。
それでも、Fortran(特にFortran77)はまだまだ現役である。中でも、計算科学の分野ではかなりの強い勢力を占める。過去の膨大なライブラリなどの資産はもちろんのこと、エイリアスが使用できないなど、速度効率のための最適化がやりやすい言語仕様なのである。そして、計算科学ではこの速度効率が最も重要なファクターを占めるのである。
というわけで、私は今日もFortranをいじっている。
最近、C#に興味がある。
C#とはマイクロソフトが提案するC++ライクのオブジェクト指向言語である。これはサンのJavaに対抗して開発された言語でもある。C#の#は++を二段に重ねたものだとか、+と+が重なったものだとか、C++の一段上という意味での#だとかいろいろ聞くが、どれが本当の由来なのかはよく知らない。
サンの開発したJavaは確かにオブジェクト指向言語としてなかなか良いものである。私もJavaが発表された直後に「これはいい!」と思いJDKをすぐにダウンロードしていろいろと遊んでみた。当時は発表された直後とあってJavaと言っても周りの人はほとんど関心を示さなかったのだが、しばらくしたら、こぞって取り上げ始めたのは皆さんがご承知の通りであろう。
しかし、サンがJavaを自分の手から離して標準化団体に完全に渡してしまうことを拒んでいる今の状況は良い状態とはいえない。それが商売敵であるマイクロソフトに好き勝手やらせないためだとしてもである。一方、マイクロソフトは標準化団体にC#を策定してもらおうと動いているようである。
やはり、コンピュータ言語自体は一私企業が握っているものよりも、ちゃんとした標準化団体が管理しているものの方がいい。だからと言って、JavaがC#に取って代わられてしまうのかといえばそれはわからないが。そう言えば、近いうちに情報処理技術者試験で用いられる言語にJavaが追加されるそうだ。これから見ても、急速に普及しているのがよくわかる。
私としては、企業などの思惑に左右されず、扱いやすくてパワフルなコンピュータ言語を使用していきたい。何だかんだ言っても、現状では、C++からはしばらく離れられそうにない。
今年は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; }
こういうソースコードと出会った日は、なんだか嬉しくなる。
C#言語の規格
ISO/IEC 23270:2003
http://www.iso.org/iso/en/CatalogueDetailPage.CatalogueDetail?CSNUMBER=36768&ICS1=35&ICS2=60&ICS3=
ECMA-334
http://www.ecma-international.org/publications/standards/Ecma-334.htm
C#言語仕様 JIS原案作成委員会
Posted by: Foota at 2004年06月19日 16:17http://www.itscj.ipsj.or.jp/jis/csharp/