2012-08-20

ここ数ヶ月のC++11コンパイラー事情

ここ数ヶ月のC++11のコンパイラー事情はどうなっているのか。これが、あまり大規模な変化はない。もちろん、細かいバグ修正などはあるにしても、大胆な機能実装はない。これは、gccもclangも、C++11のある程度の機能を実装し終えたからである。まだ細かい部分でいくつか規格との齟齬があるものの、大方はいますぐ使えるようになっている。

現在のところ最も規格準拠度に厳格な姿勢を見せているClangでは、コア言語で実装していない機能はわずかに二つ。AttributesとInheriting Constructorsである。

Clang - C++98 and C++11 Status

Inheriting Constructorsは、見た目以上に実装が難しく、また規格の文面も曖昧で、非常に難儀しているそうだ。また、実装したいと思う開発者もいない。

Attributesは、規格や実装にさしたる問題はなけれども、特に需要もないので、なかなか実装されない。すでにすべてのC++コンパイラーでは、同等機能が提供されているし、わざわざユーザーは既存のコードを書きなおしたりしない。

C++では、インラインアセンブリのためのキーワードと文法もあったが、あまりにも人間にとって文法が汚かったので、誰も使ってない。どのコンパイラーも、インラインアセンブリには独自の、人間にとって書きやすく読みやすい文法を用意している。

GCCではどうかというと、少し事情が異なる。

C++0x/C++11 Support in GCC - GNU Project - Free Software Foundation (FSF)

なんと、Attributesの実装作業が始まっている。まあ、実装したからといって、従来の__attribute__のかわりに使われるとも限らないのだが。

Inheriting Constructorsは、gccでも打ち捨てられている。

gccで興味深いのは、*thisへのrvalueリファレンスが、いまだに実装されていないことだ。もっとも、この名前は誤解を招く。C++11では、*thisへのlvalueリファレンスの明示的な指定もできるのだ。実装されない理由はよく分からない。難しいのか、はた実装したい人間がいないのか、はた需要がないのか。gccはすでに、これ以外のrvalueリファレンスを実装しているのだが。

名前だけしか聞こえないEDGなどは、表には出てこないのでさっぱりわからない。まあ、表に出てこない情報は存在しないも同じだから、どうでもいい。

一方、表にやたらとでしゃばってきて、やたらとC++を喧伝している某コンパイラーは、実はC++コンパイラーですらないので、わざわざ記すに及ばない。

No comments: