コラム19.  :LLVMとClang

ClangとGCC

GNUに関する説明の中で、Cコンパイラの定番ともいえるgccについて説明しましたが、実はCコンパイラは、今もものすごい勢いで進化しているのです。世界中に普及したGCCですが、現在それに置き換わるこののできるコンパイラを提供することを目的とした、「Clang(クラン)」というコンパイラの開発プロジェクトが進行しています。

では、このClangとは、どんなコンパイラなのでしょうか?そして従来のGCCとはどんな点が違い、どんな点が優れているのでしょうか?

フロントエンドとバックエンド

Clangについて説明する前に、コンパイラには、「フロントエンド」と「バックエンド」の2つの側面があるということを理解する必要があります。コンパイラの「フロントエンド」とは、ソースコードを分析して中間表現と呼ばれる抽象的なデータに置き換える部分です。それに対し、「バックエンド」とは、フロントエンドによって生成された、中間表現を最終的なコードに生成する部分です。

場合によっては、この中間部分である「ミドルエンド」に分割されている場合もありますが、ここで理解しておきたいのは、現在のコンパイラは、このように二階建て、もしくは三階建ての構造になっているという点です。

このフロントエンド/ミドルエンド/バックエンドという分割法を採用することにより、異なるプログラミング言語向けのフロントエンドを結合したり、異なるCPU向けのバックエンドを結合したりできるのです。それにより、様々な言語のコンパイラを、異なるプラットフォームで容易に実現できるようになるわけです。

ClangとLLVM

実は、Clangは、プログラミング言語 C、C++、Objective-C、Objective-C++ 向けのコンパイラフロントエンドという位置づけになっています。これに対して、バックエンドとしてLLVMと呼ばれるものを用いるコンパイラが今後の主流になりそうなのです。

LLVM の名称の由来は、Low Level Virtual Machine (低水準仮想機械) の略で、中間言語を介して、対象のアーキテクチャに最適なマシン語へ変換することができます。

従来のバックエンドであれば、ここに直接なんらかのCPUのアセンブラのコードを出力する、という考え方になるのですが、LLVMはここにいったんこういう抽象的なプロセスを入れているのが特徴です。

さらに、コンパイル時やリンク時、実行時などあらゆる時点でプログラムを最適化できることから、多様なプラットフォームで、適切なコード生成ができるのが特徴です。なお、Clangは、LLVM 2.6以降は LLVM の一部としてリリースされており、現在はほぼセットと考えていいでしょう。

ClangはCをターゲットとした新しいコンパイラで、LLVM上で動作することを意図して設計されており、その主要な目標の一つは、統合開発環境 (IDE) のGUIと密接に連携した開発のしやすさです。

LLVMの目指すもの

では、このClangよLLVMの組み合わせは、具体的にどのような点が従来のコンパイラよりも優れているのでしょう?

具体的に言うと「XCodeやNetBeansのようなIDE(統合開発環境)で、様々な環境でのクロスプラットフォーム開発を容易にできる」という点です。現在は、一つのソースコードを、iOSやAndroidのような多様な携帯端末などに対応させる必要があります。

そのために、一つのアプリを異なるプラットフォームごとに作り直すのはたいへん効率が悪く、そういったことを「一度にできる」ようにするのが、このClangよLLVMが究極の目標の一つです。

また、言語もC/C++言語のみならず、様々な言語が存在し、そういった「異なる言語による壁」も突き崩していきたい、というのも大事なポイントです。つまり、「何らかの言語でコードを書いたら、どんな実行環境でも実行できてしまう」そんな世界を目指しているわけです。