その後のその後

iOSエンジニア 堤 修一のブログ github.com/shu223

LLVM GCC と LLVM Compiler 2.0 とどっちがいいのか?

Xcode 4 からコンパイラのシステムデフォルトが GCC 4.2 から LLVM GCC 4.2 へ変更されましたが、その下にある LLVM Compiler 2.0 ってのが気になるので調べてみました。

LLVM GCC と LLVM Compiler 2.0 の違い

GCCと比較した場合、LLVMコンパイラでビルドするとアプリが高速化されるらしいのですが、LLVM GCC と LLVM Compiler 2.0でそういった違いはあるのでしょうか。
WWDCのスライドによると、



LLVM GCCはGCCでパースしLLVMで機械語を生成、LLVM Compilerはパース部分をClangが行いLLVMで機械語を生成、とのことで、LLVM GCC / LLVM Compiler どちらを用いても生成されるバイナリは同じ、つまり生成されるアプリの速度などの違いはなさそうです。


(2011/7/27追記)
申し訳ありません、y_naka様よりコメントいただきました内容によると、どうやら上記は誤りのようです。

どうやら生成されるバイナリは異なるもののようです.
適当なコード(手元にあったrsync3.0.8_0)で実験してみたのですが,llvm-gccとclangで生成された実行ファイルのサイズが異なりました.
llvm-gcc 436KB
clang 449KB

Clang Parser を使用するメリット

では LLVM Compiler で使用されている Clang Parser のアドバンテージって何?ってことを調べてみました。(参考情報は同WWDCのスライド)

  • コンパイルが高速・・・3倍速いそうです
  • エラー、ワーニングメッセージの改善・・・GCCの不親切で情報量が少ないメッセージを改善したとのこと(!)


(資料に挙がっていた例)

$ gcc test.m
test.m:2: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token


$ clang test.m
test.m:2:1: error: unknown type name 'NSstring'
NSstring *P = @"good stuff";

まとめ

個人的にはコンパイルエラー/ワーニングメッセージが改善されるってことでもうLLVM Compilerに切り替えてもいいんじゃないかなと思ってしまいました。
が、それでも今のところXcode 4のデフォルトはLLVM GCCなので、その理由が気になるところではあります。


下記のような資料もあるので、引き続き勉強していきます。