変数の型は無い方が良いのか?

「変数に型は無い」はメリットか?
http://developers.slashdot.jp/story/13/03/01/0228235/

./ネタが続いて申し訳ないけど、非常に論争になるこの話題が./に載っていた。

自分は、変数に型があるべき派。

確かに、小規模なプログラムならば、変数に型があるのは煩わしいのはわかる。

でも、型をしっかり管理した方がエラーが事前に見つけやすいと自分は思う。

特に、業務案件でこれは大切。
書いているそばから型がおかしいと言われれば、直すわけだし。
一度完成したプログラムを修正したら、芋づる式に、影響範囲が分かって、修正漏れが無い。

いや、逆に、型が無い言語は、ちょっとした修正も、プログラム側が勝手に推論して、
恐らく正しいと思える動きをしてくれるから楽だろうという意見もわからなくはない。

でも、それって、言語の型の推論機能が優秀なだけで
たまたま動いているんだよね?
優秀というか、たまたま、自分が望んだ通りに動いただけだよね?
と思っちゃう。

そういえば、某Webサービスからデータを取り出すときに、
WSDLを喰わせて、それを元に最終的にDBに格納する処理を、C#とPHPで書いたけど、
そのWebサービスのとあるデータが数値型から文字列型に変わったことがあった。

C#は、WSDLを喰わせなおしただけで、
コンパイルエラーが出て、その場所を重点的にチェックすれば良かったけど、
PHPだと、プログラムの仕様書から、影響範囲を調べるだけでも一苦労。
みたいなことも。

なので、自分は断然、型有り派です。

まぁ、プライベートでコード書くときには、
アセンブラレベルで書くことがあったり、
Cのライブラリを作ってC#から使うとかしたりもするので、
データがどうなっているかが分からないと
気持ち悪いという気持ちもあるのかも知れない。

CPUを効率よく使うプログラムの使い方(2000年頃の書き方)

今から10年以上まえのこと。
当時、自分はとあるゲームのプログラムを作っていました。

当時のWindowsゲームのプログラムは、
まぁ、いろいろな方法があったのですが、
画面に対してそれなりに動きのあるプログラムとか、
内部での演算が色々生じるプログラムの場合には、
2パターンほどの書き方に分かれます。

1つは、タイマーイベントを定期的に飛ばして、
タイマーイベント内で演算処理とか描画処理をする方法。
CPUがひ弱なPCではCPU占有率がうなぎ登りですが、
そこそこのスペックのPCなら、CPU占有率は逆に落ちてくれます。
ただ、タイマーイベントは優先順位が低いので、
スムーズな処理が出来ないというのが難点です。
※マルチメディアタイマーを使えば、タイムラグが少なく(と言っても10msec程度のラグはある)、処理が行えるけれど、
 今度は、色々と制限が出てくる。

自分がとったのは別の方法で、
通常、自分のプログラムにOSからイベントが飛んでこなかったら、
イベントが来るまで休ませるプログラムを書きますが、
あえて、別スレッドを立てて、そのスレッドでゲームのプログラムぶん回し、
そのスレッド内で他のプログラムへのイベントなどが発生したことを検知したら、
そちらのプログラムにCPUをお裾分けする方式。

この方式は、当時の音楽再生ソフトとかでも多用されていた方法で、CPUの処理能力が十分あれば、
自分が必要としているタイミングがmsec以下のタイミングで制御できる画期的な方法です。
※CPU能力が少なくても、それなりに動きます。

が!

デバッガーから
「CPU100%になるプログラムは製品としておかしい!」
という、ある意味至極もっともなご意見を頂いたわけです。

いや、それで正しいんだよと、説明しようにも、
そこそこPCに詳しいデバッガーさんが理解できなかった時点で
お客様への理解もされないだろうなと言うことで、
前者の方式になるようにプログラムの組み直しをしました。

で!何が言いたいかというと、
あれやれ!これやれ!と指示を受けて作業する仕事と、
今これに集中しないと!で偶にインタラプトされる仕事と、
仕事にも色々あるなぁということです。

効率は後者の方が良いけれど、自分の処理能力が追いつかないと、
インタラプトされたことに気がつかず怖いなーと

ImTiredException


int main() {
 int hitpoint = 100;
 while(hitpoint) {
  try{
   dowork();
   hitpoint--;
   if (hitpoint == 0) {
    throw new ImTiredException();
    Sleep(24*60*60*1000);
   }
  } catch (Exception e) {
   hitpoint--;//もっと疲れろ //こう書くと何故か動く
  }
 }
}

いや、何となく。

PHPの引数の順番は統一感なさ過ぎ

PHPにはimplodeという微妙な命令がある。
string implode ( string $glue , array $pieces )

いや、内容自体は全然普通で、
$piecesの中身を、$glueで連結した文字列を返す命令だ。
implode(',', array('abc','def','ghi')); //"abc,def,ghi"という文字列

何が微妙なのかというと、この命令の引数は、
逆にしてもちゃんと動作する。
string implode (array $pieces, string $glue)

一応、マニュアルにもそのことは書いてあるから、
知っている人も多いと思う。

ところで、PHPには連想配列のキーが存在するかを調べるための命令という物がある。
その名はarray_key_exists
bool array_key_exists ( mixed $key , array $search )
これもこれで、便利でよく使う命令ではあるんだけど、

これを、連想配列ではなく、オブジェクトに対して似たような事をする命令、
つまり、オブジェクトのプロパティーが存在するかを調べるための命令という物がある。
その名もproperty_exists

この命令の定義はこう:
bool property_exists ( mixed $class , string $property )

もうね・・・この、引数の統一感のなさが、
PHPのバグを生み出す要因の一つだと思う。

C#でZipファイルを扱う方法

そうそう、電子書籍の自分用Viewerを作るついでに、
WPFでZIPを使う方法を調べた。

ライセンス的に、DotNetZipを使うのが楽(Ms-PLライセンスらしい)みたいなのでまず、これを落としてくる。
http://dotnetzip.codeplex.com/
【続きを読む】

IOCCCが5年ぶりに開催

IOCCCが5年ぶりに開催されるらしい
ニュース:http://news.mynavi.jp/news/2011/11/17/033/
公式:http://www.ioccc.org/

そういえば、昔、当Blogでも記事にしたけど、
読みにくいC言語のプログラムを書く事を目的としている大会で
日本語では「国際邪悪なCコードコンテスト」と呼ばれている大会。

というわけで、難読なHelloWorldをC++で書いてみた。
【続きを読む】

|