C++0xをチラ見してみた


 えーと…。何だこれ(笑)。さすがC++(笑)。
 存在意義を維持したまま、ここまで変態化するもんなのか。まあC++は生まれた時からそういう性格か。Zero-overhead principleとか前面に掲げちゃう言語だしな。
 見た目も仕様も色々とキチガイじみてることだけが難点だよなあ(笑)。罠が多くなるのは仕方ないんだろうけど。Cのポインタが難しい、ってのと同質だとは思う。パフォーマンス落とさない為にちょっと分かりにくくなったけど、脳内でアセンブラに置き換えれば別に難解じゃないから構わんだろー、みたいな。Cからの伝統で、どうコンパイルされるかが見えてないと書きにくい言語というか。

 あと、動作が軽いものは、それだけで使われるんだよなあ。PHPなんかもそうだと思うけど。
 クライアントPCあたりは最近パワーあんまり要らないんじゃね的になりつつあったけど、省電力路線のPCも出てきちゃったし、シングルスレッドのパフォーマンス向上も微妙にきつくなってるし。
 ただ、ネイティブでマルチスレッドアプリ書いてると思うけど、もしも「VMの方がうまく勝手に分散してくれるよ」なんてことになるならVM大勝利かもなあ。仮にそうなったら俺どの言語使うんだろ。まあその時に流行ってる奴か(笑)。
 ぶっちゃけ現状だと、Windowsで同じアプリの.NET版とネイティブ版とついでにJava版があったら、俺ならネイティブ版使うしな。これが「普通.NET版だろ」ってなったら、俺にとって言語の乗り換え時になるんだろう。いや、俺だけじゃないだろうけど。

 で、C++0xだが。
 相変わらずの超高級アセンブラマクロ言語なんだけど、より一層の謎言語になっていた。
sort( x.begin(), x.end(), []( const auto& a, const auto& b )->bool { return a.id() < b.id(); } );
みたいな気持ち悪い文が書けそう。こういう気持ち悪いコードは是非書きたい。というか何これ別言語?
 autoはこの書き方でもいいのかなあ。前方参照してそうだけど。でもそれ出来ないとautoの存在意義ねーか。
 つーかむしろ、
for ( auto& c : x ) { c.chomp(); }
こんなコードの方が早く使ってみたい。これでコンパイル通るかは知らんけど。こんなん見ちゃうと、
for ( int i = 0; i < sizeof(x)/sizeof(x[0]); i++ ) { x[i].chomp(); }
とかもう書きたくねー。sizeofをマクロにしろよとかは置いといてですね。たぶんこれコンパイルしたら同じコードになるよなあ。使いたいなあ。
 昔は空気だったのに、やたら派手になって帰ってきたautoも凄いよな。昔と同じ扱いをすると多分怒られるんだろうな。コンパイラに(笑)。

 まあ何か他にも色々面白そうでした。リテラルが自分で定義出来るとか何に使うんだ(笑)。constexprとかコンパイルタイム向けの仕様もだいぶ増えてるのはメタプログラミング向けなんだろうか。普通に使う分にも便利そうだけど。


一発で動く不安感


 とりあえずクライアントとサービスにあたるスレッドを一本ずつ作って、すんげー簡素な一対一片方向通信専用のパイプを自作して、リクエストを
shared_ptr<req_base_class>( new req_derived_sample_class( arg1, arg2... ) )
みたいなのに包んで渡す形で動くところまでは書けた。一見。
 ただ、パイプのempty()やfull()の時、たぶん真面目にWaitForSingleObjectとかすべきなんだろうけど、テストコードは激しくスピンとかSleep()とかしつつポーリングである。まあ、めんどくせーけど次はここ調べるか…。

 んで、通信パイプは単純にshared_ptrの配列をリングバッファとして扱ってるんだが、VC++2005以降の仕様が「volatileの読み書きはメモリバリア考慮してるから平気ですよ、x86ならCPUの方も心配無しさ」とのことで、インデックス変数をvolatileにしただけでメモリバリアもInterlocked関数も一つも書かずに普通に動いてるんだけど、こんなんで大丈夫なんだろうか本当に。shared_ptr受け渡しのリークとかも怖いし。ほとんど一発で動いたから、逆にすげー心配なんだけど(笑)。


無類の地雷原好き


 いやまあ本物の地雷原は全力で大嫌いだけど。

 ついさっき、普通のテキストエディタで書いた自作クラスを丸ごとIDEのエディタにコピペしてコンパイル掛けたら、コンストラクタの行で「C2514だぜーなんたらクラスにコンストラクタが定義されていません。」「コンパイルされたクラスのテンプレートのインスタンス化なんたらの参照を確認してください」「誤った式になっています。」「型指定子がありま略」「構文エ略」その他合計52個出て止まった。よし、100個は行かなかったな。
 どう見てもコンストラクタに問題が見付からないし、前後におかしな構文も全然見当たらない。何だこりゃー。
 コンストラクタをコメントアウトすると、次のbool f()な関数の行で「C2062だぜーboolとか型イラネーから」「あと他にも8個くらいエラーな」とさらに謎展開。

 結局オチは何なのかというと、
正 public:
誤 pubic:
とかそんな感じでした。エラー内容から類推できねー。まあよくある。
 プログラミングって楽しいですね。あとC++も好きなんですよ。いや本当に。


超古代文明


 X1のGRAM(だったっけ?)の開始アドレスか何かがいじれるのを利用してスクロールさせようとして、アドレスのラップする辺りの処理で気が狂ってきて投げ出したこととかも思い出した。
 いや、俺若いからたぶん前世の記憶とかそういう奴だと思いますが。本当に。


640×400


 コードを必死で書いてると、唐突にxscriptとか30行計画とか、ちっとも聞いたことのない単語が頭に浮かんだ。何か古代文明の響きを感じたけど、俺ほんと若いんで全然分からないし。