Hatena::ブログ(Diary)

Over&Out その後 このページをアンテナに追加 RSSフィード Twitter

2011-05-30

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のスライドによると、


f:id:shu223:20110605160450p:image:w550


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なので、その理由が気になるところではあります。


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



y_nakay_naka 2011/07/25 23:36 まさに表題の件について自分も疑問でして,検索にて辿り着きました.

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

構文解析が異なることで,最適化されたバイナリにも違いが出るのでしょうか?

shu223shu223 2011/07/27 21:07 y_naka様、コメントどうもありがとうございます!違いが出るんですね・・・記事に修正を追記させていただきました。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

2009 | 08 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2013 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2014 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2015 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2016 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 11 | 12 |
2017 | 01 | 02 | 03 | 04 | 05 | 06 | 07 |