概要
普段はmacを使用しているので、C++などのコードをコンパイルするのにXcodeをインストールして、それに付随しているgccを使っていた........つもりになっていました。それが実はgccではなくclangが呼ばれていることがわかって、ちょっと調べてみたのでまとめておきます。
ただ、調べたらだいぶ前からそうなっていたようで、自分の知見の無さと、時代についてけてない感にちょっと凹み気味です。
この記事を書いて学んだこと
- XcodeではGCCではなくClangを使ってコンパイルしている。
- ClangはLLVMのサブプロジェクトの1つであり、C++をはじめとするC言語系のLLVMに対するフロントエンドを提供する。
- LLVMはコンパイラ基盤であり、LLVMをつかってClangのようなコンパイラを自作することもできる。
Xcodeのgccを呼び出すとclangが呼び出される
この事実に気がついたのは、他の記事を書いている際に、コンパイルの処理内容を表示させた時でした。
gcc -v -o hello main.cpp hello.cpp
この時表示されたのが
...
"/Library/Developer/CommandLineTools/usr/bin/clang" -cc1 .... hello.cpp
"/Library/Developer/CommandLineTools/usr/bin/clang" -cc1 .... main.cpp
...
んっ?clang? cc1plusじゃなくて?
念の為、ターミナル上でman gcc
を入力したが何も出力されず、試しにman clang
と入力したらバッチリ説明がでてきたので、gccの代わりにclangがインストールされているみたいです。
NAME
clang - the Clang C, C++, and Objective-C compiler
SYNOPSIS
clang [options] filename ...
DESCRIPTION
clang is a C, C++, and Objective-C compiler which encompasses prepro-
cessing, parsing, optimization, code generation, assembly, and linking.
Depending on which high-level mode setting is passed, Clang will stop
before doing a full link. While Clang is highly integrated, it is
important to understand the stages of compilation, to understand how to
invoke it. These stages are:
...
以下省略
...
...
clangはGCC互換のコンパイラみたいなもの
ググってみると、clangはGCCと互換のあるコンパイラで、LLVM用のC言語系のフロントエンドを提供するClangプロジェクトによって提供されたらしい。以下、Clangのホームページ(clang.llvm.org)からの原文の引用です。
The Clang project provides a language front-end and tooling infrastructure for languages in the C language family (C, C++, Objective C/C++, OpenCL, CUDA, and RenderScript) for the LLVM project. Both a GCC-compatible compiler driver (clang) and an MSVC-compatible compiler driver (clang-cl.exe) are provided. You can get and build the source today.
LLVMはコンパイラ基盤
LLVM(Low Level Virtual Machine)はコンパイラ基盤らしいです。以下、LLMVMのホームページ(llvm.org)からの原文の引用です。
The LLVM Project is a collection of modular and reusable compiler and toolchain technologies. Despite its name, LLVM has little to do with traditional virtual machines. The name "LLVM" itself is not an acronym; it is the full name of the project.
なんとなくまとめると、LLVMはコンパイラを作成するのに必要な環境が揃っていて、LLVMを使ってコンパイラを自作することが可能である。また、LLVMの特徴としては、最終的なマシン語を生成するまでの間に中間言語(IR)を何度も作成し、その度に最適化を行うらしいです。
公式ホームページ以外で参考にさせて頂いたのは以下のサイトです
大学院生のためのLLVM
LLVMを始めよう!〜LLVM IRの基礎はclangが教えてくれた- プログラムモグモグ
結局LLVMとClangって?
いまいち僕には難しくて良く理解できなかったのですが、色々な記事を読んで自分なりに(僕の知っている用語内で)解釈すると、LLVMは対応したハードウェア用のマシン語を作成するライブラリみたいなもので、ユーザはLLVMの用意したライブラリを使ってClangの様なコンパイラを作成することができる...ということでとりあえず納得することにします。
まとめ
今回は、たまたまmacがgccでなくLLVMのclangを読んでいることから、LLVMとClangについて調べました。LLVMはコンパイラを作成する環境を提供していて、それを使って開発されたものがいくつかあり、その1つがClangプロジェクトのclangということがわかりました。LLVMを使用すれが、簡単なコンパイラが(難しいと思うけど)作れそうなので、今度機会があればLLVMについてもう少し細かく調べたいなと思います。