blob: 0a13ea8637bc67a4cfc9f9f0b3b040a3d6215880 [file] [log] [blame]
Chris Lattner83109672007-12-10 01:44:24 +00001<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
2 "http://www.w3.org/TR/html4/strict.dtd">
Kevina6751332007-12-14 05:47:49 +00003<!-- Material used from: HTML 4.01 specs: http://www.w3.org/TR/html401/ -->
Chris Lattner83109672007-12-10 01:44:24 +00004<html>
5<head>
6 <META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
Chris Lattner0fcc09e2007-12-11 22:26:03 +00007 <title>Comparing clang to other open source compilers</title>
Chris Lattner83109672007-12-10 01:44:24 +00008 <link type="text/css" rel="stylesheet" href="menu.css" />
9 <link type="text/css" rel="stylesheet" href="content.css" />
10</head>
11<body>
12 <!--#include virtual="menu.html.incl"-->
13 <div id="content">
Chris Lattner0fcc09e2007-12-11 22:26:03 +000014 <h1>Clang vs Other Open Source Compilers</h1>
Chris Lattner83109672007-12-10 01:44:24 +000015
16 <p>Building an entirely new compiler front-end is a big task, and it isn't
17 always clear to people why we decided to do this. Here we compare clang
18 and its goals to other open source compiler front-ends that are
Chris Lattner74a165b2007-12-10 17:38:50 +000019 available. We restrict the discussion to very specific objective points
20 to avoid controversy where possible. Also, software is infinitely
21 mutable, so we don't talk about little details that can be fixed with
22 a reasonable amount of effort: we'll talk about issues that are
23 difficult to fix for architectural or political reasons.</p>
Chris Lattner83109672007-12-10 01:44:24 +000024
25 <p>The goal of this list is to describe how differences in goals lead to
26 different strengths and weaknesses, not to make some compiler look bad.
27 This will hopefully help you to evaluate whether using clang is a good
Chris Lattnerc222f932007-12-10 06:01:32 +000028 idea for your personal goals. Because we don't know specifically what
29 <em>you</em> want to do, we describe the features of these compilers in
30 terms of <em>our</em> goals: if you are only interested in static
31 analysis, you may not care that something lacks codegen support, for
32 example.</p>
Chris Lattner83109672007-12-10 01:44:24 +000033
34 <p>Please email cfe-dev if you think we should add another compiler to this
35 list or if you think some characterization is unfair here.</p>
36
Chris Lattnerac7e0902007-12-10 05:23:01 +000037 <ul>
38 <li><a href="#gcc">Clang vs GCC</a> (GNU Compiler Collection)</li>
39 <li><a href="#elsa">Clang vs Elsa</a> (Elkhound-based C++ Parser)</li>
40 <li><a href="#pcc">Clang vs PCC</a> (Portable C Compiler)</li>
41 </ul>
42
43
Chris Lattner83109672007-12-10 01:44:24 +000044 <!--=====================================================================-->
45 <h2><a name="gcc">Clang vs GCC (GNU Compiler Collection)</a></h2>
46 <!--=====================================================================-->
47
Chris Lattner40ae32f2007-12-10 05:06:15 +000048 <p>Pro's of GCC vs clang:</p>
Chris Lattner83109672007-12-10 01:44:24 +000049
50 <ul>
51 <li>GCC supports languages that clang does not aim to, such as Java, Ada,
52 FORTRAN, etc.</li>
53 <li>GCC front-ends are very mature and already support C/C++/ObjC and all
Chris Lattner3b88ce82008-08-24 05:44:37 +000054 the variants we are interested in. <a href="cxx_status.html">clang's
55 support for C++</a> in particular is nowhere near what GCC supports.</li>
Chris Lattner3e820af2008-08-24 05:42:07 +000056 <li>GCC's codegen is much more mature than clang's right now and supports
57 more targets than LLVM.</li>
Chris Lattner83109672007-12-10 01:44:24 +000058 <li>GCC is popular and widely adopted.</li>
Chris Lattner6c9a70d2007-12-10 02:18:15 +000059 <li>GCC does not require a C++ compiler to build it.</li>
Chris Lattner83109672007-12-10 01:44:24 +000060 </ul>
61
Chris Lattner40ae32f2007-12-10 05:06:15 +000062 <p>Pro's of clang vs GCC:</p>
Chris Lattner83109672007-12-10 01:44:24 +000063
64 <ul>
Chris Lattnerb5604af2007-12-10 07:23:52 +000065 <li>The Clang ASTs and design are intended to be <a
66 href="features.html#simplecode">easily understandable</a> by
Chris Lattner0d1638e2007-12-10 08:21:12 +000067 anyone who is familiar with the languages involved and who has a basic
Chris Lattner6c9a70d2007-12-10 02:18:15 +000068 understanding of how a compiler works. GCC has a very old codebase
69 which presents a steep learning curve to new developers.</li>
70 <li>Clang is designed as an API from its inception, allowing it to be reused
71 by source analysis tools, refactoring, IDEs (etc) as well as for code
72 generation. GCC is built as a monolithic static compiler, which makes
73 it extremely difficult to use as an API and integrate into other tools.
74 Further, its historic design and <a
Chris Lattner83109672007-12-10 01:44:24 +000075 href="http://gcc.gnu.org/ml/gcc/2007-11/msg00460.html">current</a>
Chris Lattnerff11fa32007-12-10 02:05:32 +000076 <a href="http://gcc.gnu.org/ml/gcc/2004-12/msg00888.html">policy</a>
Chris Lattner6c9a70d2007-12-10 02:18:15 +000077 makes it difficult to decouple the front-end from the rest of the
78 compiler. </li>
Chris Lattner83109672007-12-10 01:44:24 +000079 <li>Various GCC design decisions make it very difficult to reuse: its build
80 system is difficult to modify, you can't link multiple targets into one
81 binary, you can't link multiple front-ends into one binary, it uses a
82 custom garbage collector, uses global variables extensively, is not
83 reentrant or multi-threadable, etc. Clang has none of these problems.
84 </li>
Chris Lattner42f956b2007-12-10 02:24:44 +000085 <li>For every token, clang tracks information about where it was written and
Chris Lattner40ae32f2007-12-10 05:06:15 +000086 where it was ultimately expanded into if it was involved in a macro.
Chris Lattner42f956b2007-12-10 02:24:44 +000087 GCC does not track information about macro instantiations when parsing
Chris Lattner40ae32f2007-12-10 05:06:15 +000088 source code. This makes it very difficult for source rewriting tools
89 (e.g. for refactoring) to work in the presence of (even simple)
90 macros.</li>
Chris Lattner42f956b2007-12-10 02:24:44 +000091 <li>Clang does not implicitly simplify code as it parses it like GCC does.
Chris Lattner40ae32f2007-12-10 05:06:15 +000092 Doing so causes many problems for source analysis tools: as one simple
Chris Lattner42f956b2007-12-10 02:24:44 +000093 example, if you write "x-x" in your source code, the GCC AST will
94 contain "0", with no mention of 'x'. This is extremely bad for a
95 refactoring tool that wants to rename 'x'.</li>
Chris Lattner45918f32007-12-12 03:33:41 +000096 <li>Clang can serialize its AST out to disk and read it back into another
Chris Lattner0b11baa2007-12-11 22:29:38 +000097 program, which is useful for whole program analysis. GCC does not have
Chris Lattner64374062008-08-24 05:56:54 +000098 this. GCC's PCH mechanism (which is just a dump of the compiler
99 memory image) is related, but is architecturally only
100 able to read the dump back into the exact same executable as the one
101 that produced it (it is not a structured format).</li>
Chris Lattner6c9a70d2007-12-10 02:18:15 +0000102 <li>Clang is <a href="features.html#performance">much faster and uses far
103 less memory</a> than GCC.</li>
104 <li>Clang aims to provide extremely clear and concise diagnostics (error and
105 warning messages), and includes support for <a
106 href="features.html#expressivediags">expressive diagnostics</a>. GCC's
107 warnings are acceptable, but are often confusing and it does not support
108 expressive diagnostics. Clang also preserves typedefs in diagnostics
109 consistently.</li>
Chris Lattnerff11fa32007-12-10 02:05:32 +0000110 <li>GCC is licensed under the GPL license. clang uses a BSD license, which
111 allows it to be used by projects that do not themselves want to be
112 GPL.</li>
Chris Lattner6c9a70d2007-12-10 02:18:15 +0000113 <li>Clang inherits a number of features from its use of LLVM as a backend,
114 including support for a bytecode representation for intermediate code,
115 pluggable optimizers, link-time optimization support, Just-In-Time
Chris Lattner64374062008-08-24 05:56:54 +0000116 compilation, ability to link in multiple code generators, etc.</li>
Chris Lattner83109672007-12-10 01:44:24 +0000117 </ul>
118
119 <!--=====================================================================-->
120 <h2><a name="elsa">Clang vs Elsa (Elkhound-based C++ Parser)</a></h2>
121 <!--=====================================================================-->
122
Chris Lattner40ae32f2007-12-10 05:06:15 +0000123 <p>Pro's of Elsa vs clang:</p>
Chris Lattner83109672007-12-10 01:44:24 +0000124
125 <ul>
126 <li>Elsa's support for C++ is far beyond what clang provides. If you need
127 C++ support in the next year, Elsa is a great way to get it. That said,
128 Elsa is missing important support for templates and other pieces: for
129 example, it is not capable of compiling the GCC STL headers from any
130 version newer than GCC 3.4.</li>
Chris Lattner40ae32f2007-12-10 05:06:15 +0000131 <li>Elsa's parser and AST is designed to be easily extensible by adding
132 grammar rules. Clang has a very simple and easily hackable parser,
133 but requires you to write C++ code to do it.</li>
Chris Lattner83109672007-12-10 01:44:24 +0000134 </ul>
135
Chris Lattner40ae32f2007-12-10 05:06:15 +0000136 <p>Pro's of clang vs Elsa:</p>
Chris Lattner83109672007-12-10 01:44:24 +0000137
138 <ul>
139 <li>The Elsa community is extremely small and major development work seems
Chris Lattner64374062008-08-24 05:56:54 +0000140 to have ceased in 2005, though it continues to be used by other small
141 projects
Chris Lattner83109672007-12-10 01:44:24 +0000142 (e.g. Oink). Clang has a vibrant community including developers that
Chris Lattnerc222f932007-12-10 06:01:32 +0000143 are paid to work on it full time. In practice this means that you can
144 file bugs against Clang and they will often be fixed for you. If you
145 use Elsa, you are (mostly) on your own for bug fixes and feature
146 enhancements.</li>
Chris Lattner83109672007-12-10 01:44:24 +0000147 <li>Elsa is not built as a stack of reusable libraries like clang is. It is
Chris Lattner64374062008-08-24 05:56:54 +0000148 very difficult to use part of Elsa without the whole front-end. For
Chris Lattner83109672007-12-10 01:44:24 +0000149 example, you cannot use Elsa to parse C/ObjC code without building an
150 AST. You can do this in Clang and it is much faster than building an
151 AST.</li>
152 <li>Elsa does not have an integrated preprocessor, which makes it extremely
153 difficult to accurately map from a source location in the AST back to
Chris Lattner40ae32f2007-12-10 05:06:15 +0000154 its original position before preprocessing. Like GCC, it does not keep
Chris Lattner83109672007-12-10 01:44:24 +0000155 track of macro expansions.</li>
Chris Lattner64374062008-08-24 05:56:54 +0000156 <li>Elsa is even slower and uses more memory than GCC, which itself requires
157 far more space and time than clang.</li>
Chris Lattner83109672007-12-10 01:44:24 +0000158 <li>Elsa only does partial semantic analysis. It is intended to work on
159 code that is already validated by GCC, so it does not do many semantic
160 checks required by the languages it implements.</li>
161 <li>Elsa does not support Objective-C.</li>
162 <li>Elsa does not support native code generation.</li>
163 </ul>
164
Chris Lattnerc030f002007-12-11 07:59:50 +0000165 <p>Note that there is a fork of Elsa known as "Pork". It addresses some of
Chris Lattneraeae19c2007-12-12 04:22:37 +0000166 these shortcomings by loosely integrating a preprocessor. This allows it
Chris Lattnerc030f002007-12-11 07:59:50 +0000167 to map from a source location in the AST to the original position before
168 preprocessing, providing it better support for static analysis and
Chris Lattner64374062008-08-24 05:56:54 +0000169 refactoring. Note that Pork is in stasis now too.</p>
Chris Lattnerc030f002007-12-11 07:59:50 +0000170
Chris Lattner83109672007-12-10 01:44:24 +0000171
172 <!--=====================================================================-->
173 <h2><a name="pcc">Clang vs PCC (Portable C Compiler)</a></h2>
174 <!--=====================================================================-->
175
Chris Lattner40ae32f2007-12-10 05:06:15 +0000176 <p>Pro's of PCC vs clang:</p>
Chris Lattner83109672007-12-10 01:44:24 +0000177
178 <ul>
179 <li>The PCC source base is very small and builds quickly with just a C
180 compiler.</li>
181 </ul>
182
Chris Lattner40ae32f2007-12-10 05:06:15 +0000183 <p>Pro's of clang vs PCC:</p>
Chris Lattner83109672007-12-10 01:44:24 +0000184
185 <ul>
186 <li>PCC dates from the 1970's and has been dormant for most of that time.
Chris Lattner0d1638e2007-12-10 08:21:12 +0000187 The clang + llvm communities are very active.</li>
Chris Lattner6c9a70d2007-12-10 02:18:15 +0000188 <li>PCC doesn't support C99, Objective-C, and doesn't aim to support
189 C++.</li>
Chris Lattner0d1638e2007-12-10 08:21:12 +0000190 <li>PCC's code generation is very limited compared to LLVM. It produces very
Chris Lattner83109672007-12-10 01:44:24 +0000191 inefficient code and does not support many important targets.</li>
Chris Lattner40ae32f2007-12-10 05:06:15 +0000192 <li>Like Elsa, PCC's does not have an integrated preprocessor, making it
193 extremely difficult to use it for source analysis tools.</li>
Chris Lattner83109672007-12-10 01:44:24 +0000194 </div>
195</body>
196</html>