186 lines
9.6 KiB
HTML
186 lines
9.6 KiB
HTML
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
|
||
|
"http://www.w3.org/TR/html4/strict.dtd">
|
||
|
<!-- Material used from: HTML 4.01 specs: http://www.w3.org/TR/html401/ -->
|
||
|
<html>
|
||
|
<head>
|
||
|
<META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||
|
<title>Comparing clang to other open source compilers</title>
|
||
|
<link type="text/css" rel="stylesheet" href="menu.css">
|
||
|
<link type="text/css" rel="stylesheet" href="content.css">
|
||
|
</head>
|
||
|
<body>
|
||
|
<!--#include virtual="menu.html.incl"-->
|
||
|
<div id="content">
|
||
|
<h1>Clang vs Other Open Source Compilers</h1>
|
||
|
|
||
|
<p>Building an entirely new compiler front-end is a big task, and it isn't
|
||
|
always clear to people why we decided to do this. Here we compare clang
|
||
|
and its goals to other open source compiler front-ends that are
|
||
|
available. We restrict the discussion to very specific objective points
|
||
|
to avoid controversy where possible. Also, software is infinitely
|
||
|
mutable, so we don't talk about little details that can be fixed with
|
||
|
a reasonable amount of effort: we'll talk about issues that are
|
||
|
difficult to fix for architectural or political reasons.</p>
|
||
|
|
||
|
<p>The goal of this list is to describe how differences in goals lead to
|
||
|
different strengths and weaknesses, not to make some compiler look bad.
|
||
|
This will hopefully help you to evaluate whether using clang is a good
|
||
|
idea for your personal goals. Because we don't know specifically what
|
||
|
<em>you</em> want to do, we describe the features of these compilers in
|
||
|
terms of <em>our</em> goals: if you are only interested in static
|
||
|
analysis, you may not care that something lacks codegen support, for
|
||
|
example.</p>
|
||
|
|
||
|
<p>Please email cfe-dev if you think we should add another compiler to this
|
||
|
list or if you think some characterization is unfair here.</p>
|
||
|
|
||
|
<ul>
|
||
|
<li><a href="#gcc">Clang vs GCC</a> (GNU Compiler Collection)</li>
|
||
|
<li><a href="#elsa">Clang vs Elsa</a> (Elkhound-based C++ Parser)</li>
|
||
|
<li><a href="#pcc">Clang vs PCC</a> (Portable C Compiler)</li>
|
||
|
</ul>
|
||
|
|
||
|
|
||
|
<!--=====================================================================-->
|
||
|
<h2><a name="gcc">Clang vs GCC (GNU Compiler Collection)</a></h2>
|
||
|
<!--=====================================================================-->
|
||
|
|
||
|
<p>Pro's of GCC vs clang:</p>
|
||
|
|
||
|
<ul>
|
||
|
<li>GCC supports languages that clang does not aim to, such as Java, Ada,
|
||
|
FORTRAN, etc.</li>
|
||
|
<li>GCC supports more targets than LLVM.</li>
|
||
|
</ul>
|
||
|
|
||
|
<p>Pro's of clang vs GCC:</p>
|
||
|
|
||
|
<ul>
|
||
|
<li>The Clang ASTs and design are intended to be <a
|
||
|
href="features.html#simplecode">easily understandable</a> by
|
||
|
anyone who is familiar with the languages involved and who has a basic
|
||
|
understanding of how a compiler works. GCC has a very old codebase
|
||
|
which presents a steep learning curve to new developers.</li>
|
||
|
<li>Clang is designed as an API from its inception, allowing it to be reused
|
||
|
by source analysis tools, refactoring, IDEs (etc) as well as for code
|
||
|
generation. GCC is built as a monolithic static compiler, which makes
|
||
|
it extremely difficult to use as an API and integrate into other tools.
|
||
|
Further, its historic design and <a
|
||
|
href="http://gcc.gnu.org/ml/gcc/2007-11/msg00460.html">current</a>
|
||
|
<a href="http://gcc.gnu.org/ml/gcc/2004-12/msg00888.html">policy</a>
|
||
|
makes it difficult to decouple the front-end from the rest of the
|
||
|
compiler. </li>
|
||
|
<li>Various GCC design decisions make it very difficult to reuse: its build
|
||
|
system is difficult to modify, you can't link multiple targets into one
|
||
|
binary, you can't link multiple front-ends into one binary, it uses a
|
||
|
custom garbage collector, uses global variables extensively, is not
|
||
|
reentrant or multi-threadable, etc. Clang has none of these problems.
|
||
|
</li>
|
||
|
<li>For every token, clang tracks information about where it was written and
|
||
|
where it was ultimately expanded into if it was involved in a macro.
|
||
|
GCC does not track information about macro instantiations when parsing
|
||
|
source code. This makes it very difficult for source rewriting tools
|
||
|
(e.g. for refactoring) to work in the presence of (even simple)
|
||
|
macros.</li>
|
||
|
<li>Clang does not implicitly simplify code as it parses it like GCC does.
|
||
|
Doing so causes many problems for source analysis tools: as one simple
|
||
|
example, if you write "x-x" in your source code, the GCC AST will
|
||
|
contain "0", with no mention of 'x'. This is extremely bad for a
|
||
|
refactoring tool that wants to rename 'x'.</li>
|
||
|
<li>Clang can serialize its AST out to disk and read it back into another
|
||
|
program, which is useful for whole program analysis. GCC does not have
|
||
|
this. GCC's PCH mechanism (which is just a dump of the compiler
|
||
|
memory image) is related, but is architecturally only
|
||
|
able to read the dump back into the exact same executable as the one
|
||
|
that produced it (it is not a structured format).</li>
|
||
|
<li>Clang is <a href="features.html#performance">much faster and uses far
|
||
|
less memory</a> than GCC.</li>
|
||
|
<li>Clang aims to provide extremely clear and concise diagnostics (error and
|
||
|
warning messages), and includes support for <a
|
||
|
href="diagnostics.html">expressive diagnostics</a>. GCC's warnings are
|
||
|
sometimes acceptable, but are often confusing and it does not support
|
||
|
expressive diagnostics. Clang also preserves typedefs in diagnostics
|
||
|
consistently, showing macro expansions and many other features.</li>
|
||
|
<li>GCC is licensed under the GPL license. <a href="features.html#license">
|
||
|
clang uses a BSD license,</a> which allows it to be embedded in
|
||
|
software that is not GPL-licensed.</li>
|
||
|
<li>Clang inherits a number of features from its use of LLVM as a backend,
|
||
|
including support for a bytecode representation for intermediate code,
|
||
|
pluggable optimizers, link-time optimization support, Just-In-Time
|
||
|
compilation, ability to link in multiple code generators, etc.</li>
|
||
|
<li><a href="compatibility.html#c++">Clang's support for C++</a> is more
|
||
|
compliant than GCC's in many ways (e.g. conformant two phase name
|
||
|
lookup).</li>
|
||
|
</ul>
|
||
|
|
||
|
<!--=====================================================================-->
|
||
|
<h2><a name="elsa">Clang vs Elsa (Elkhound-based C++ Parser)</a></h2>
|
||
|
<!--=====================================================================-->
|
||
|
|
||
|
<p>Pro's of Elsa vs clang:</p>
|
||
|
|
||
|
<ul>
|
||
|
<li>Elsa's parser and AST is designed to be easily extensible by adding
|
||
|
grammar rules. Clang has a very simple and easily hackable parser,
|
||
|
but requires you to write C++ code to do it.</li>
|
||
|
</ul>
|
||
|
|
||
|
<p>Pro's of clang vs Elsa:</p>
|
||
|
|
||
|
<ul>
|
||
|
<li>Clang's C and C++ support is far more mature and practically useful than
|
||
|
Elsa's, and includes many C++'11 features.</li>
|
||
|
<li>The Elsa community is extremely small and major development work seems
|
||
|
to have ceased in 2005. Work continued to be used by other small
|
||
|
projects (e.g. Oink), but Oink is apparently dead now too. Clang has a
|
||
|
vibrant community including developers that
|
||
|
are paid to work on it full time. In practice this means that you can
|
||
|
file bugs against Clang and they will often be fixed for you. If you
|
||
|
use Elsa, you are (mostly) on your own for bug fixes and feature
|
||
|
enhancements.</li>
|
||
|
<li>Elsa is not built as a stack of reusable libraries like clang is. It is
|
||
|
very difficult to use part of Elsa without the whole front-end. For
|
||
|
example, you cannot use Elsa to parse C/ObjC code without building an
|
||
|
AST. You can do this in Clang and it is much faster than building an
|
||
|
AST.</li>
|
||
|
<li>Elsa does not have an integrated preprocessor, which makes it extremely
|
||
|
difficult to accurately map from a source location in the AST back to
|
||
|
its original position before preprocessing. Like GCC, it does not keep
|
||
|
track of macro expansions.</li>
|
||
|
<li>Elsa is even slower and uses more memory than GCC, which itself requires
|
||
|
far more space and time than clang.</li>
|
||
|
<li>Elsa only does partial semantic analysis. It is intended to work on
|
||
|
code that is already validated by GCC, so it does not do many semantic
|
||
|
checks required by the languages it implements.</li>
|
||
|
<li>Elsa does not support Objective-C.</li>
|
||
|
<li>Elsa does not support native code generation.</li>
|
||
|
</ul>
|
||
|
|
||
|
|
||
|
<!--=====================================================================-->
|
||
|
<h2><a name="pcc">Clang vs PCC (Portable C Compiler)</a></h2>
|
||
|
<!--=====================================================================-->
|
||
|
|
||
|
<p>Pro's of PCC vs clang:</p>
|
||
|
|
||
|
<ul>
|
||
|
<li>The PCC source base is very small and builds quickly with just a C
|
||
|
compiler.</li>
|
||
|
</ul>
|
||
|
|
||
|
<p>Pro's of clang vs PCC:</p>
|
||
|
|
||
|
<ul>
|
||
|
<li>PCC dates from the 1970's and has been dormant for most of that time.
|
||
|
The clang + llvm communities are very active.</li>
|
||
|
<li>PCC doesn't support Objective-C or C++ and doesn't aim to support
|
||
|
C++.</li>
|
||
|
<li>PCC's code generation is very limited compared to LLVM. It produces very
|
||
|
inefficient code and does not support many important targets.</li>
|
||
|
<li>Like Elsa, PCC's does not have an integrated preprocessor, making it
|
||
|
extremely difficult to use it for source analysis tools.</li>
|
||
|
</ul>
|
||
|
</div>
|
||
|
</body>
|
||
|
</html>
|