Clang

Clang

ClangはC++、C、Objective-C、Objective-C++などのプログラミング言語をマシン語にコンパイルするために使用されるコンパイラ フロントエンドです。

Clangを高速化

Clangとは?

ClangはC++、C、Objective-C、Objective-C++などのプログラミング言語をマシン語にコンパイルするために使用されるコンパイラ フロントエンドで、OpenMP、OpenCL、RenderScript、CUDA、HIPなどのフレームワーク用コンパイラとしても使用されます。

ClangはバックエンドにLLVMを使用しており 、LLVM 2.6以降はLLVMの一部としてリリースされています。ClangコンパイラはGCCを置き換えることができるコンパイラとして提供されており、GCCと同じ動作をするように設計されていますが、GCCのデフォルトがgnu89GCCなのに対して、Clangのデフォルトはgnu99という違いがあります。

今すぐ始める
what is clang

しくみ

Clangコンパイラは次の3段階のフェーズで動作します。

1. フロントエンドでソースコードを解析します。コードにエラーがないかをチェックし、言語固有の抽象構文木 (AST) を作って入力コードとして動作させます。

2. フロントエンドで作られたASTが最適化されます。

3. バックエンドでターゲットに応じてマシンで実行する最終的なコードを生成します。

歴史

Clangのオリジナルの開発者はAppleです。同社ではLLVMのフロントエンドにGCCを使っていましたが、コードサイズが大き過ぎるためAppleのIDE (統合開発環境) に統合されないという問題がありました。また、LLVMのライセンスとGCCのライセンスは互換性もありませんでした。この時期のAppleではソフトウェアにObjective-Cを多用していましたが、GCCの開発者にとってこの言語の優先度は高くありませんでした。そのため、Appleは独自にClangを開発し、2007年7月にオープンソース化しました。

Clangの最新バージョンはClang 12です。2020年11月現在、公開済みのすべてのC++規格を完全にサポートし、次期C++20規格も部分的にサポートする予定です。

無料トライアルは

こちらをクリック

ダウンロード / インストール方法

Clangのダウンロードとインストールは以下の手順で行います。

  • コマンド「clang — version」を入力して、Clangコンパイラのインストール状況を確認します。
  • Clangコンパイラをインストールまたはアップデートするために「xcode-select–install」を入力します。

コマンドを実行すると、今すぐインストールするか、後でインストールするかを尋ねるポップアップウィンドウが表示されます。[インストール] をクリックすると使用許諾契約が表示されます。[同意する] を選択してインストールを続行します。インストールが完了したら [完了] をクリックします。

インストールできたかどうかを確認したい場合は、ターミナルを開いて再度「clang — version」を入力してください。

Clangの使用例

ClangはClang 1.0としてLLVM 2.6と同時にリリースされました。続くClang C++では、GCC 4.2のlibstdc++のパース、自身のコンパイル、小規模なプログラムのコード生成が可能になりました。Clang 3.0から最新バージョンのClang 12.0.0まで様々な機能を追加しながらよりスケーラブルで軽く、高速なコンパイラへと進化し続けています。

ClangはGCCと比べて、コンパイル中により多くのデータを保持するように設計されています (GCCについてはこちら)を参照)。
また、メインコードの形式を保持しているため、エラーを簡単にメインソースにマッピングし直すことができます。Clangによるエラーの報告は詳細かつ具体的で、機械可読なためコンパイル処理中にコンパイラの出力をインデックス化することができます。

Clangの特長

Alibabatechが行ったパフォーマンステストではClangのフロントエンドはGCCよりもコンパイルが大幅に速く、メモリ使用量も少ないという結果が出ています。この結果は、特に大規模なプロジェクトの方がClangの特性を活かせるということを示しています。

Clangコンパイラは便利で分かりやすい診断メッセージ (エラー / 警告) を出力します。また、Clangはライブラリベースのアーキテクチャを採用しており、フロントエンドは様々な各種ニーズに対応できるよう個別のライブラリに分かれています。これにより、すべてのスタックのレイヤーのコストをすばやく簡単に見積もれます。Clangのライブラリベースのプロセスでは、基本的な知識さえあれば全体像は把握する必要がないので開発に新規参加しやすいのも特長です。

Clangはインクリメンタル コンパイルのサポートが主な目的のため幅広いクライアントに対応しており、IDEのGUIとの接続性も申し分ありません。C、C++、Objective-Cの開発ツール向けの強固な基盤となれるように細心の注意を払って設計・構築が行われています。また、Microsoft、GCCなどメジャーなコンパイラとも互換性があり、様々な拡張機能を使って強化することができます。ClangコンパイラはIDEと統合できるのでプロジェクト全体を俯瞰することができます。

商用プロジェクト向けにはLLVMのBSDライセンスを使用しています。これは独立したコンパイラではなくサードパーティ製アプリに組み込むライブラリとして設計されています。BSDライセンスでは複数のコントリビューターがソースコードをチェック・改良してソースコードを強化します。

FirefoxやChromeのようなパフォーマンス重視のソフトウェアの開発にClangを使用した場合のメリットは次の通りです。

clang advantages

メリット

  • 優れた診断 (カラフルで高い視認性、エラーの修正方法の提案、typedefによる型定義、正確な参照元の指摘など)。
  • コンパイルの高速化 (5~20%)。プリコンパイル済みヘッダー (PCH) のサポートによってさらに改善されます (コンパイル性能を示すSPECベンチマーク」の上の図を参照)。
  • C++によるモジュール化されたコードベースなので読みやすく (コンパイラのバグが見つけやすい)、使い回しも簡単 (libclangによる他のツールへの記述やコンパイラの拡張など)。

WindowsでClangを使う

WindowsでClangを使う際にはClang/LLVMベースのツールセットをフルサポートしているVisual Studioが推奨されています。Clangツールのインストールは簡単です。「C++ によるデスクトップ開発」オプションのコンポーネント下で「Windows 用 C++ Clang コンパイラ」を選択します。これでWindows上でClang開発ができるようになります。最適なサポートを得るために最新バージョンのClangをご利用ください。

LinuxでClangを使う

リモートのLinuxマシンでVisual StudioでClang/LLVMを使用するには、配布元のパッケージマネージャーと一緒にインストールする必要があります。「which clang」機能でコンパイルを検出できたら準備は完了です。また、ClangはすべてのLinux/GNUディストリビューションまたはBSDでパッケージシステムの一部として提供されています。Xcode 4.2以降のmacOS XではClangがデフォルトのコンパイラです。

インクリメンタル ビルドを迅速に行いたい場合はNinjaがお勧めです。

生成されたVisual Studioのプロジェクト ファイルを使ってClangのソースコードを編集すると、テスト用のビルド ディレクトリが生成されます。

MacでClangを使う

ClangをインストールするにはVisual Studio CodeやHomebrewを使用します。

  • macOSにVisual Studio Codeをインストールします。
  • Visual StudioにVSコード用のC++拡張機能をインストールします。ターミナルでコマンド「clang — version」を入力してmacOSにClangがインストールされていることを確認します。
  • Clangがインストールされていない場合は、コマンド「xcode-select –install」を入力してインストールします。
  • プロジェクト実行用にフォルダを新規作成できるようになります。

Homebrewでインストール

  • 次のコマンドを入力します。$ brew install llvm
  • 新しいバイナリが自動的にパスに含まれなくなります。
    次のエラー メッセージに気をつけてください。「OS X already provides this software and installing another version in parallel can cause all kinds of trouble」。
  • バイナリ ファイルは次の場所にあります。 $(brew –prefix llvm)/bin
  • 次のコマンドを実行すると、Homebrewのllvm/clangが表示されます。
    $ echo ‘export PATH=”/usr/local/opt/llvm/bin:$PATH”‘ >> ~/.bash_profil

Icredibuildとの統合

Incredibuildが対応しているVisual Studio IDE、CMake、Ninjaなどのビルドシステムで実行されるClang/LLVMコンパイルを高速化できます。独自の分散コンピューティング技術により、ネットワーク上の何百ものリモートコアに処理をシームレスに分散してclangベースコンパイル時間を大幅に短縮します。Unreal EngineでのClang++の分散にも対応しています。

icon

まとめ

Clangは他のコンパイラと異なりツールを構築するためのインフラが付属し、動作を簡単に拡張することもできます。LLVM/Clangのソースコードには多くのツールが含まれ、ウェブ上でも入手できます。また、ビルドツールの非常に優れたC/C++パーサとして使用できます。

無料トライアル