10
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

Xcodeのgccでコンパイルしているつもりで実はclangでコンパイルしていた事実を今更知りました

概要

普段は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についてもう少し細かく調べたいなと思います。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
10
Help us understand the problem. What are the problem?