BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース FreeBSD 10アルファ,ビルドをClangに移行

FreeBSD 10アルファ,ビルドをClangに移行

原文(投稿日:2013/09/16)へのリンク

FreeBSD 10で最初のアルファリリースが公開された。以前より計画されていたGCCからClangへのコンパイラ切り替えが,一部のプラットフォームで実現している。(Clangがターゲットしとないアーキテクチャのプラットフォームでは,引き続きGCCが使用される。) さらに,Raspberry Pi上で動作する最初のFreeBSDでもある。

切り替えの理由はライセンスに関するものだ。GCCは従来GPLv2の下で使用可能だったが,2009年にGPLv3によるライセンスに変更された。この変更がFreeBSDユーザにとって受け入れられるものではなかったため,結果的にGCC 4.2.1を引き続き使用することになった。その後GCCよりもライセンスの寛容なClangがリリースされた時,FreeBSDをClangで構築する計画がスタートした。コンパイラエラーや関係するソフトウェアパッケージの修正が行われた結果,FreeBSD 9システムは変更せずにClangでビルド可能になり,さらにFreeBSD 10では,システムそのものがClangでブートストラップされ,ビルドされることになった。

i386およびamd64プラットフォームでは,1年近く前からClangがデフォルトコンパイラとして使えるようになっていた。そして今月初めから,i386, amd64, powerpc64プラットフォームでClangがデフォルトとして使用されるようになった。GCCを使用しなくなったプラットフォームに関しては,そのプラットフォーム用のGCCコンパイラは今後ビルドされない

Speed tests(2012年実施) の結果を見ると,全般的にClangは,同じ時期に比較可能であったバージョンのGCCに対して,コンパイル速度もメモリ使用も優れている。ただし,これらのテストが実施された時期以降,ClangとGCCはともにパフォーマンスでも実装機能の面でも進歩しているので,示された結果はもはや適切ではないかも知れない。

LinuxでもClangによるビルドが試みられている。LLVMLinuxや,DebianのClangを使用したパッケージビルドなどだ。Debianのパッケージベースでは,GCCでのコンパイルに比較して,Clangでは11.6%(18854パッケージ中の2188)のパッケージがエラーによってビルドに失敗している。その多くは,GCCでは警告されなかったコードをClangでコンパイルする時に出力される,追加された警告やエラーである。例えば非void型の関数は値を返さなければならない,GCC特有の参照のポイントが未定義参照になる – あるいはHaskellで,base_GHCziTopHandler_flushStdHandles_closureで参照されるライブラリの不足が,ClangでコンパイルしたDebianのパッケージリストにある770のエラー中のおよそ620を占める,というような具合だ。今年のLinux Plumbers ConferenceではLLVMマイクロカンファレンスが特別に開催され,LLVMLinuxについて語り合われることになっている。

AppleのiPhone 5S(64bitプロセッサを備える)の新規リリースに伴って,Clangにも間もなく64bit ARMマイクロコードを生成する機能が追加される。AppleはLLVMとClangに多大な投資を続けていて,その成果は将来的にLLVMの一部となる予定である。

近い将来に起こるコンパイラの変更すべてからは,コンパイラがあまりにも急激に変更されるのではないか,あるいはサポートされなくなるのではないか,という疑念が生じてくる。コンパイラの信頼性が変わってくるのではないか,というMiod Vallat氏の質問には,hacker newsに多数のフォローアップ意見が寄せられた。コードベースが増加したことには,新たな標準によるものも一部あるが,最適化ルーチンの増加分がコンパイラのサイズに追加された,という理由もある。John Rehgr氏がいくつかの解析結果をポストしている。

最初の質問に戻ってみましょう: オープンソースコンパイラの信頼性は,GCC 2.7以降低くなっているのでしょうか? そんなようには思えません。実際に今回の実験では,本当はその逆かも知れないことが示されています。ランダムに生成されたCプログラムが必ずしも現実を表すとは限りませんから,これらの結果の解釈に注意が必要なのは当然です。実際のCプログラムでは起こり得ないバグを誘発しているかも知れませんし,質問をしたMiodが言うようなバグをすべて見逃しているのかも知れません。さらには,GCC 2.7はCsmithを使ってテストされることはありませんでしたが,現在のバージョンのGCCとClangでは,大規模なランダムテストを行っている,という事情もあります。

新たに登場した自動テストツールやスイートによって,コンパイラの品質が以前より向上していることは間違いない。そしてClangとGCCの間の競争によって,両方のプラットフォームに対応しようとする開発が増加しているのが現状だ。

この記事に星をつける

おすすめ度
スタイル

特集コンテンツ一覧

BT