C♯体験記 若しくは富豪的プログラミングの勧め

tima_thethird@hotmail.com
 

はじめに

 初めて私の文章を読む人にははじめまして、そうでないひとにはこんにちは、 この文章も4年目、だんだん気が抜けています(※1)

 この文章は、私が「C♯駄目だ駄目だ言ってるけど結局どうなのよ」(※2)と思って 先入観を捨ててビルゲイツの軍門に降ってみた体験記です。


(※1)実際、3年目のフォーマットを流用してみたりするし。
(※2)使ってみないで批評するのは知性の敗北に他ならない。
 

C♯とは何ぞや

 C♯とはC言語の進化版であるC++のさらに進化版らしいです(※1)。 近頃では学生向けに激安でVisualStudioが買えるようになったり、Microsoftの中の人が大学に布教に来てたりしてます(※2)

 実際使ってみて、どこが利点かと考えると、簡単に言えばJavaをパクってWindowsでも普通のスピードで動くようにしたところでしょう。 あと、豊富なライブラリを(人海戦術で)揃えたというのも大きいと。

 Javaをパクっただけあって、ガベージコレクタ標準搭載、メモリ管理は放置して良いらしいです。が、 言われているほどメモリ管理を放置して良い訳ではなくて、なんかある規則においては明示的に解放しなきゃいけないとか、例外もあります。

 速度面ではJustInTime-Compiler(JIT)が頑張っているのか、公称ですがC++で書いたコードの9割程度の性能は出てるらしいです。最適化に時間がかけられないのがJITの欠点ですが、 多く呼び出すことになる関数では高度な最適化がかかるらしいです。

 そのほかにも色々欠点たっぷり(※3)ですが、 実際、速度を追求しない、生でWin32APIを叩かない限り(※4)においては十分かもしれません。


(※1)+を4つ組み合わせて♯だってさ。#(ナンバー)とは違うので明示的に「しゃーぷ」。
(※2)良だった。結構単位は厳し目だったらしい。寝てたけど。
(※3)C#2.0,Cωでは結構改善されているらしいんですが、正式版まだー?
(※4)Win32APIを叩くと一気に必死になる。この性質のため、多分MIDIプログラミングやドライバ記述には全く使えない気がする。
 

次世代言語と富豪的プログラミング

 プログラミング言語の世界では古いC,C++に変わる次世代言語の開発が進んでいます。 例としてJavaやC♯,最近ではD言語なんてのも出てきました。全部発展途上ですけど(※1)

 これらの次世代言語の特徴として以下が挙げられます(※2)

 ここで「富豪的プログラミング」について説明しなければならないような気がします。富豪的プログラミングとは 「速度やメモリ効率を追求することはやめて、ともかく開発しやすくバグが出ないようにシンプルに書く」というプログラミングの手法のことです。 昔はCPUやメモリなんか限られていましたが、いまや1G2Gあたりまえ。時代も変わりましたねぇ。ということで、 メモリの確保や解放、ソートなどの面倒なことはは自分でやらずに処理系組み込みに任せるとかいう、 「実用的な速度が出ればそれでよし、それよりはバグが少ないほうがよっぽど良い」というパラダイムであります。

 つまるところ、次世代言語は富豪的プログラミングに向いていると言えます。 そこで、実際モノを作ってみた結果、まあ元々分かっていたことですが、C♯は富豪的プログラミングに向いている言語だと感じたわけでありました。


(※1)最近は既にこれらの言語でOSが書けるという話ですが、現実的にOS用途はC,C++しか選択肢は無いと思われます。
(※2)これらの機能はC++のライブラリとしても実現されているが、STLやBoostみたいに変な手続きが要らず、処理系標準搭載なのは結構大きいかと。
 

DirectXとC♯

 さて、そんなC♯になぜか(※1)DirectXを使うための環境である「Managed DirectX」が入っています。 こいつはC♯のメモリ管理機構や言語仕様を使ってDirectXをC++で書くよりは楽に書こうという物です。

 資料が少ないので、せいぜいサンプル程度しか当てになりませんが、C++と大体互換と言うか、似たようなものなのでC++の資料見ながらやるといいと思います。 補完が普通に効くので、適当にそれっぽいクラスをカンで見つけることが出来て良いです。メソッドに注釈がついてることもあり、 補完周りは非常に利点と言えるかも。MSDNと格闘することも結構減らせました。

 しかし、多分C++でDirectXを書いたことが無い人がいきなりC♯でDirectXを書くってのはあまりおいしくないと。 書籍やWeb上の資料が少なく、頼みの綱のMSDNですら日本語版の整備はかなり遅れています。 サンプルを読んで自分で戦える人には良いですが、そうで無い人にはかなりきついですかね。 まあ、高校級の英語と戦える人なら何かと大丈夫かと思いますんで、そのくらいは英語を使ってあげましょう。

 で、自分がC♯で何をやったかと言うと、自分なりに適当にまとめたDirectXの2Dゲーム用ライブラリを作りました。カンで2日で。 適当ってのが重要で、完成度なんか気にしていたら実用になりません(※2)。 その割にはバグ少なめで普通に動いていますね。自分が書いた某ライブラリの サウンド機構よりはよっぽどバグや対応フォーマットが少なくなりました(※3)。 結局、機能はシンプルに、それでいて(自分がゲームを製作する上で)必要十分という簡単なライブラリになりました。 これはこれで使いやすいなぁ(自画自賛)。 最終的にゲーム用ライブラリは音が鳴らせて描画ができて入力が出来れば結構事足りるってことが分かりました。 機能が足りなくなったら勝手に増やせばいいし(開発者特権)。

 結局、C♯でDirectXを使うと、自然と富豪的プログラミングになってしまいました。色々実装が面倒だったからってのもあるけど(何)。


(※1)あれだけパクっておいて、「Write once, run anywhere.」ってのはどっか行ったらしいです。まあJavaにもないけど。
(※2)結構完成度を追求すると身動きが取れなくなる状況に陥るかも。いや金取るなら必要だろうけど。
(※3)生WAVのみ。富豪的プログラミングにはOgg対応なんて不要。まあアレはアレで実際使われているようですが。
 

おわりに

 結論としては、M$製だから全然駄目駄目だろうと先入観で思っていたC♯も実は普通の次世代を見据えたプログラミング言語だったということです。文字列処理とかは楽で、速度は十分出ているし。 メモリ量や速度を気にしなくて済む富豪的プログラミングには向いているのではないでしょうか。 逆に、速度やメモリ量がシビアになってしまうなら 従来どおりC、C++を使わざるを得ない気がします。まあそうそう困ることも無いと思いますけど。

 なんかこんなに書いてるとM$狂信者とか思われてるかもしれませんがそんなことは決してないことを言っておきます。むしろ結構嫌いだし。 まあでも、「触りもしないで語るな」ってのと「良いものは認めろ」というスタンスは重要と思いました。 ということで、今後D言語など他の「次世代言語」も触ってみる予定です。 あと、C♯で作ったもので諸事情により「どうしても会誌に書くことが出来なかったもの」が1件あるわけですが、まあそれは間に合えば調布祭本番限定の展示ってことで。

トップへ戻る