<<2013-042013-06>>

2013-5-26[日] c++03コンパイラの機能実装の比較

昔 ow や dmc のc++の(文法)実装状態をチェックしてる表をみたことあったなあ、と探してみれば、すぐみつかる.

http://cmeerw.org/prog/freecpp/

最終更新が2006で、それ以前のコンパイラの比較だけれど、チェックプログラムのソースが公開されていたので、ow 含むそれらよりも新しい(ヴァージョンの)コンパイラで試してみた。

もとより網羅されてるわけでないし今時のc++11世代のコンパイラの比較としては不十分だけど(SFINAEのチェックもなさげ)、owやdmcが以前よりよくなっているかを見る分には、と。

dmc 8.56ow 1.94.7.1 tdmclang3.1 (+mingw462)vc8vc9vc11bcc 5.5.1
1digraphpassfail[c]passpassfail[c]fail[c]fail[c]fail[c]
2alternative tokenspasspasspasspassfail[c]fail[c]fail[c]fail[c]
3new style castspasspasspassfail[c] / 実質passpasspasspasspass
4boolpasspasspasspasspasspasspasspass
5bool conditionpasspasspasspasspasspasspasspass
6mutablepasspasspasspasspasspasspasspass
7explicitpasspasspasspasspasspasspasspass
8typenamepasspasspasspasspasspasspasspass
9covariant returnpasspasspasspasspasspasspasspass
10arrow operator returnpasspasspasspasspasspasspassfail[c]
11overload enumpasspasspasspassfail[c]fail[c]fail[c]pass
12nested class fwd declpasspasspasspasspasspasspasspass
13friend namespace classpasspasspasspasspasspasspasspass
14class name injectionpasspasspasspasspasspasspassfail[c]
15friend name injectionfail[e]passpasspasspasspasspassfail[e]
16static const intpasspasspasspasspasspasspasspass
17delete constpasspasspasspasspasspasspasspass
18return voidpasspasspasspasspasspasspasspass
19new scopingpasspasspasspasspasspasspasspass
20if stmt condpasspasspasspasspasspasspasspass
21switch stmt condpasspasspasspasspasspasspasspass
22while stmt condpasspasspasspasspasspasspassfail[c]
23for stmt condpasspasspasspassfail[c]fail[c]fail[c]fail[c]
24defarg scopefail[c]fail[c]passpasspasspasspassfail[c]
25namespace enumpasspasspasspasspasspasspasspass
26namespace templatepasspasspasspasspasspasspasspass
27namespace template funcpasspasspasspasspasspasspasspass
28using namespace templatepasspasspasspasspasspasspasspass
29template non typepasspasspasspasspasspasspasspass
30explicit template instantiationpasspasspasspasspasspasspasspass
31template default allpasspasspasspasspasspasspasspass
32template default dependent argpasspasspasspasspasspasspasspass
33template template argpassfail[c]passpasspasspasspasspass
34template function explicitpasspasspasspasspasspasspasspass
35new template specializationpasspasspasspasspasspasspasspass
36partial template specializationpasspasspasspasspasspasspasspass
37partial ordering class templatespasspasspasspasspasspasspasspass
38member template classpassfail[c]passpasspasspasspasspass
39member template functionpassfail[c]passpasspasspasspasspass
40bad allocfail[e]passpasspasspasspasspasspass
41bad typeidfail[e]passpasspasspasspasspasspass
42throwing destructorpasspasspasspass (c++11fail[e])passpasspasspass
43koenig lookuppassfail[c]passpasspasspasspasspass
44two phase lookuppasspasspasspassfail[e]fail[e]fail[e]fail[e]
45empty base optpasspasspasspasspasspasspassfail[e]
46return value optpasspasspasspasspasspasspassfail[e]
47static assertionspassfail[c]passpassfail[c]fail[c]passfail[c]
48right angle bracketsfail[e]passpasspasspasspasspassfail[e]
49func predefinedpasspasspasspassfail[c]fail[c]fail[c]fail[c]
50hex float literalpassfail[c]passpassfail[c]fail[c]fail[c]fail[c]
51long longpasspasspasspasspasspasspassfail[c]
52restrictfail[c]fail[c]fail[c]fail[c]fail[c]fail[c]fail[c]fail[c]
53variable arraypassfail[c]passpassfail[c]fail[c]fail[c]fail[c]
54dynamic sizeofpassfail[c]passpassfail[c]fail[c]fail[c]fail[c]
55empty macro argumentpasspasspasspasspasspasspasspass
56enum trailing commapasspasspasspasspasspasspasspass
57flexible array memberpasspasspasspasspasspasspasspass
58compound literalfail[c]fail[c]passpassfail[c]fail[c]fail[c]fail[c]


補足

  • いずれもwin用32bit版コンパイラ. win8でコンパイル&実行.
  • fallにつけてる[c]はコンパイル出来なかった場合、[e]は実行結果で0以外を返した場合、を表してる.
  • 4.7.1tdm は mingw 4.7.1 tdm版.
  • clang v3.1 はllvm公式のmingw用バイナリを、本家 mingw g++4.6.2 の環境に上書きしたもの。
  • 元表にあるow1.6やdmc8.4.5は試していない(インストールしてない)ので元表をみてください.
  • vc8は元表にもあるけれど return void の結果が違ってる.
  • 47,48のみ必要ならば c++11 をコンパイルするオプションをつけている.(他はつけていない. 実はclangの不具合回避)


結果に fail があるチェックについて

  • 1 digraph: 交代記号( '{' が'<:'等) が使えるか.
  • 2 alternative tokens: and や and_eq のような記号の交代予約語が使えるか. ※ iso646.h(ciso646) で同様のものが#define定義されてる
  • 3 new style casts: const_cast<T>(t)のようなc++からのキャストが使えるか。clang が fail になっているのは本題とは別の virtual void A::f(); の実体が定義されていないことによるものでソースを実体定義に修正すれば問題なくパス。(このエラーは clangの挙動でも問題無いと思うけど、他のコンパイラがコンパイルできていることが興味深いかも)
  • 10 arrow operator return: メンバーのoperator->()の返型がT*,T,T&でない場合にコンパイルできるか.
  • 11 overload enum: enum型を基本整数型とは別型として関数オーバーロードできるか?
  • 14 class name injection: クラス名インジェクションが機能してるか ※このソースだと B() : ns::A() {} でなく B::B() : A() {} になっているところ.
  • 15 friend name injection: friend名インジェクションが機能してるか ※class内friend 定義したものはクラス外(非friend)で定義されたものよりも名前検索の順位が低く、またそのことは引数のマッチよりも優先される...ってことかな。
  • 22 while stmt cond: while の条件式でローカル変数を定義できるか
  • 23 for stmt cond: for の条件式(2文目)でローカル変数を定義できるか
  • 24 defarg scope: デフォルト引数スコープの扱いに関するテスト. ow はメンバー関数のデフォルト引数は関数宣言側ならOKだが定義側だとNGのようで、また、関数内での外部関数宣言ではデフォルト引数が使えない模様。bcc5.5.1 はデフォルト引数の問題でなく static const 変数の扱いが定数でないためのfailで、static const int c=3;の代わりに struct B に先立ち enum {c=3}; を定義すれば ok.
  • 34 template template arg: template<template<class T> class T1> のような template template 引数を使えるか
  • 38 member template class: クラス・メンバーとしてclass テンプレートが使えるか. ※ow1.9 はクラス定義内では使えるが、クラス定義外でtemplateを2回使う記述はNG.
  • 39 member template function: クラス・メンバーとして関数 テンプレートが使えるか. ※ow1.9 はクラス定義内では使えるが、クラス定義外でtemplateを2回使う記述はNG.
  • 40 bad alloc: new が メモリー不足の時に bad alloc を投げるか. ※ dm 標準では行えてないが stlport のようにライブラリ実装で対処可能.
  • 41 bad typeid: Typeidの引数が不正だった場合 bad_typeid を投げるか.
  • 42 throwing destructor: デストラクタ中に例外を投げることができるか. ※ clang++ 3.1 では通常は問題ないが -std=c++11 をつけでコンパイルすると実行時にハングした.
  • 43 koenig lookup: koenig lookup(ADL) が機能してるか. (関数呼出で、その引数の型が定義されている namespace から関数名をみつけられるか)
  • 44 two phase lookup:スコープ違いで同名のある関数の呼出が正しく行われるか
  • 45 empty base opt: 継承元class(struct)にメンバー変数が無い時0バイトにオプティマイズするか
  • 46 return value opt: クラス変数を返す時、コピーを発生させないようオプティマイズするか (VCはオプティマイズ指定しないとコピーになる)
  • 47 static assertions:[c++11]: static_assert があるか
  • 48 right angle brackets:[c++11]: templateで閉じカッコ2つを 空白を入れずくっつけて >> と記述して大丈夫か
  • 49 func predefined:[c99, c++11]: 関数名文字列 __func__ が使えるか
  • 50 hex float literal:[c99, c++11]: 16進数浮動小数点表記が使えるか
  • 51 long long:[c99, c++11]: long long を使えるか ※ bcc5.5.1は __int64 ならある
  • 52 restrict:[c99]: restrict 指定が使えるか. ※ c++11には入らなかった機能.
  • 53 variable array:[c99]: 動的ローカル配列が使えるか. ※ c++14に入るかもらしい(?)
  • 54 dynamic sizeof:[c99]: 動的ローカル配列に対するsizeofが機能するか ※ c++14には入らない.(c++のsizeofはあくまでコンパイル時に決定できるモノのみ)
  • 55 empty macro argument:[c99]: 空のマクロ引数を許容するか ※ bcc はこのソースでは大丈夫だが、引数が1つの場合 NG
  • 58 compound literal:[c99, c++11]: (struct A){1, 2} のような構造体リテラル表記できるか.

bcc 5.5.1 を表に加えるんじゃなかった...面倒増えてしまった(いや本当はpassしてるのもひと通りみたほうがよいくらいだけど)
vc が overload enum、two phase lookup あたりを修正しないのは、互換性がらみなんでせうかね? (既存の巨大ソースだと意図せず依存してそうな場合もありえそうだし).




2013-5-21[火] open watcom v2

年始くらいに某2chスレで 年末に2.0でるかも(ソースはニューズグループ)、とか書かれていて、けれど、watcom のサイトのデイリービルドみてもちっとも進んでなさそうで、ほんとかしら、と首をかしげてたのですが、今日、検索しててみかけました。

https://github.com/open-watcom

どうやら open watcom v2 を非公式にフォークしてたらしい。 リポジトリ覗くと、24時間以内の更新とかあって、そこそこ活動してそうな雰囲気。 といってもスタッフ的にお二人の名が書かれていたのでこじんまりとしたものなんだろうけど。

v2 ってことは Version 2 todo list の内容を目指しているのでしょうかね。どうなんだろ。watcom c++ の実装自体は c で書かれていて結構大変そうにも思いますが... まあちょっと楽しみです。




2013-5-20[月] stlport 5.2.1 for dmc,Open Watcom

今更ながら(現実逃避がてら) stlport 5.2.1 を Open Watcom 1.9 や dmc 8.56 に対応してみてた。ow のほうはそれなりになった気もするが dm のほうはリンカのこともあっていまいちかも。(何か根本的に見逃しているような気もする)

前回 stlport いじってたのが3年前……時間立つのは速いなあ。5.2.1がrelease最新版のままで開発自体は進んでなくもないけれど、vcでさえ面倒臭そうだったのと、watcom への対応を思うと古いコンパイラへの対応が残っているほうが無難そうに思えて結局5.2.1。(追記: 最近の開発版のほうはどうもunix系でc++11対応のg++のみなのかも. vcはおろかmingwもだめそう)

面倒くさいといえば付属のbuild環境も面倒で無視した。手抜きでバッチでコンパイル。ow,dmc以外にコンパイル試したのは vc(7.1,9,11), mingw g++4.7.1tdm版(32bit/64bit), bcc5.5.1。(ああ mingw 64bit対応が一番マトモな作業かもしれない……動作確認不十分だけど)

作業の参考にと pointer_specialization.txt「コンフィグレーション マニュアル」 をいつものごとく翻訳サイトの訳を手直ししたりしてみたが……コンフィグは内容古くて実際には結構廃止されてたり追加されてたりするようで少し徒労感有り。

と、ま、モノは stlport521dmow2.zip(txt)
(追記5/31: clang3.1(+ming4.6.2) の設定を追加)




2013-5-19[日] optlink のコンパイル

仕事が一段落したので放置していた諸々に手をつけねば、だけど、忙しい最中の現実逃避の残滓を先に…とグダグダ。現実逃避で dmc や ow で遊んでたのですが、dmc ってc++としてはowよりよさげだけどリンク時にハングしたり-gでデバッグ付でまともに動かせなかったりと optlink がかなりネック。交代のリンカ探すもデバッグ機能対応してるやつなんてそうそうなく…で灯台下暗し。optlink 自体がオープンソース化されてたようで dm856c よりも新しいソースがコミットされてた。コンパイルして使うとハングとか -g の具合が改善されてる模様。(といっても -g付きでちょっと大きいリンクすると Error 168: >64K Global Types の刑なのは変わりませんが)

とりあえず、コンパイルメモ
  https://github.com/DigitalMars/optlink
より ソースを入手 (己はzipをダウンロード). また
  http://www.robpol86.com/index.php/ImageCFG
より imagecfg.exe というツールをダウンロード。

 コンパイルには dmc と vc(9) が必要。(express版 でいけるかは未確認)。 vc の nmake と ml(マクロアセンブラ) あたりを使っているよう。
 dmc は必ず ドライブのルートに
    \dm
としてインストールされていること.( \dm にインストールしていない場合は、 別途インストールするか、win7以降ならば mklink /d \dm \hoge\hage\dm 等でリンクするなりして)

dmcとvcのパスを通し(vcvars32.bat 実行後 set path=x:\dm\bin;%path% をするなり)、 imagecfg.exe をパスの通ったところに置いておく.(不精して dm\bin に掘り込んだ)

ダウンロードしたzip を \dm があるドライブの適当なフォルダに解凍。 (gitで取得のほうが普通か?). 一応 開発者と同じ状態にするならば
   \cbx
というフォルダを用意してそこに展開.

その中の
   build_optlink.bat
を実行(他のバッチは気にしない)、コンパイルに成功していれば
   optlinkc\os2link\objnt\link.exe

ができているので、dm\bin に上書きコピー。


追記 dmd 2.063 (及びそれに対応するdmc.zip)付属のlink.exeは2013/04 の修正が反映されたバージョンになったようで、わざわざコンパイルしなくてもよくなった。




<<2013-042013-06>>