憂鬱な午後のひととき


9月29日_
明後日はx86/x64最適化勉強会2. 発表者の方, 準備と場所と日時の確認お忘れなく.
9月27日_
『漢方小説』(中島たい子)
31歳の独身女性が自分の部屋の玄関でユニクロのジャージ姿で倒れてるところから始まる. ゆるい表紙と相まってつぼにはまった.
9月25日_
鼻水は大分治まったけど頭痛が酷くて結局殆ど寝ていた.
9月23日_
風邪ひいて鼻水が止まらない. 来週のx86/x64最適化勉強会2の準備でもしておこう. 募集から開催まで結構間があったので忘れてる人も多そうだ. 大丈夫かな.
9月22日_
数論暗号勉強会参加.
Sonyの作本さんのCRYPTO2011の論文紹介 Public-Key Identification Schemes Based on Multivariate Quadratic Polynomialsがすごい面白かった. シンプルで効果的なアイデア. 素晴らしい.
9月16日_
JANT オーガナイズド・セッション「数論アルゴリズムとその応用」研究集会参加.
今回はプログラム幹事+初座長でなかなかいろいろあって疲れた. でもまあ無事終わってよかった.
午後は久しぶりに友達に会って食事. みんな忙しそうだけど元気でなにより.
9月14日_
ProfileにVTuneでJITコードをプロファイルする方法も追加しておいた.
「ProgramFiles(x86)」なんて名前の環境変数を作ろうと言ったやつ, 一体何を考えてるのか. batファイルのif-then-elseの中で使うとifの区切りの(とバッティングするという非常に情けないパーサ.
そしてそんなまぬけな環境変数名を使うという提案がそのまま製品の仕様になってるマイクロソフトも理解できない.
9月13日_
gprofなんて使ってないで, みんなCodeAnalyst使おうキャンペーン. Profileのページを書いた. XbyakなどのJIT生成コードをプロファイル表示させる方法の解説ページは, 今のところ他にないと思う.
9月12日_
せっかくなのでラボユースでやってるsinya8282さんのJIT版正規表現ライブラリRegenをWindowsに対応させてみた.
9月11日_
最近の疲れのたまりっぷりは異常. 週末全然動けない.
9月10日_

『地球ドラマチック』(NHK) 「"永遠の命"は実現できるか!?

人間の耳の形に細胞を増殖させてねずみの背中に移植する実験. 普通にちょこまか動いてるだけに, 見た目がかなりグロテスク. 全然関係ないけどたまたまちょっと前に読んだ『Re-born はじまりの』収録の「コワリョーフの鼻」(中島京子). 『鼻』(ゴーゴリ)のように"鼻"がそのへんを歩いてるという荒唐無稽な話が, 現実味があると思っただけでかなりシュール.

他人の臓器から細胞だけを取り去った残りの骨組み(みたいなもの?)に自分の細胞を培養して, 自分に移植する. 心臓だけフラスコの中で鼓動しているシーン. 最初はCGか何かかと思った.

9月9日_
ISECの後半だけ参加. 笠原先生のご発表は体調が悪いらしくてキャンセル. お大事に. 早く体調が戻られますよう.
富士通研の方たちによる格子版の完全準同型暗号はまだまだ当分実用的でないという発表.
9月8日_
昨日ラボユースでやってるConstellationさんのivのソース見てて気が付いたのだけど, gccって次のコードがエラーにならないんやね.
#include <stdio.h>
#include <array>

std::array<int, 5> a = { {
    3, 1, 4, 1, 9
} };

int main()
{
    for (std::array<int, 3>::const_iterator i = a.begin(), ie = a.end(); i != ie; ++i) {
        printf("%d\n", *i);
    }
}
実害はないみたいだけど気持ち悪い(上記コードは5回ループする). VCだとサイズの異なるarrayのiteratorは違う型でエラー.
9月7日_

andがキーワードか否かを判別したかった話(解決編)

decimalbloatさんがやってくださいました. さすが.

#if not +0
  #error "use -fno-operator-names"
#endif

notが!なら!+0で1. notがキーワードでなければ定義されていないマクロは0になるというルールにより0+0で0. うまいな.

9月6日_

andがキーワードか否かを判別したかった話

C++ではandやorなどは実はキーワードで, たとえばdie()をメッセージを表示して終了する関数として

    std::ifstream ifs("a.txt");
    ifs or die("can't open");

なんてかけたりする. でも普通は使わない. ただXbyakではx86のニーモニックにandやorやxorがあるので関数名がバッティングしてしまう.

と言いつつVCではiso646.hをincludeしない限り, これらの名前は変数や関数に使える(規格違反だけど嬉しい). gccでは標準だと規格に従っていて, その機能を無効にしたい人向けに-fno-operator-namesというオプションが用意されている. だからそれを指定すればよいだけの話. なんだが, うっかり忘れたときのエラーが分かりにくい. たとえば

#include <stdio.h>

int and(int a, int b)
{
    return a & b;
}

int main()
{
    printf("%d\n", and(3, 5));
}

t.cpp:3:5: error: expected unqualified-id before 'and' token
t.cpp: In function 'int main()':
t.cpp:10:20: error: expected identifier before '(' token

だ. できればもう少し分かりやすいエラーにしたい. 具体的にはC++11なら

static_assert(!なんとか::value, "use -fno-operator-names");

のように書いて, -fno-operator-namesが指定されてなければメッセージを出すようにしたい.

さて, 最初andとかは内部的に

#define and &&

みたいに書かれていてマクロの2回置換でandがdefineされているかどうかを見ればよいだろうと思った. けどandはC++ではキーワードでマクロではなかったのでその手は使えなかった(つまりその意味でVCのiso646.hの実装は規格に反してる. まあどうでもいいけど).

で, 結構頭を悩まして次のような方法を思いついた(自分で考えたい人は見ないように).

/* 定義 */
template<class T>
struct X { enum { value = 1 }; };

template<>
struct X<void (*)(int)> { enum { value = 0 }; };

/* 使い方 */
#ifdef __GXX_EXPERIMENTAL_CXX0X__ /* C++11のとき */
static_assert(!X<void (*)(int bitand)>::value, "use -fno-operator-names");
#else /* そうじゃないとき */
struct StaticAssert {
    // use -fno-operator-names options if the following code is error
    int use_fno_operator_names_option[X<void (*)(int bitand)>::value ? -1 : 0];
};
#endif

実はbitandも&の意味を与えるキーワードなのだ. だから規格準拠ならint bitandはint&とint参照の引数になり(この使い方は本来の意味と異なるけどありなのか?), bitandがキーワードで無かったら, 単なる仮引数となる. よって関数の型の違いでディスパッチできる.

/* エラー */
% g++ detect.cpp -std=c++0x -Wall
detect.cpp:6:1: error: static assertion failed: "use -fno-operator-names"

/* エラーでない */
% g++ detect.cpp -std=c++0x -Wall -fno-operator-names

本当はプリプロセッサの段階で判別したかったのだけど, それは無理だよねぇ?


御意見は光成滋生<herumi@nifty.com>までお願いします