Home | History | Annotate | Download | only in www
      1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" 
      2           "http://www.w3.org/TR/html4/strict.dtd">
      3 <!-- Material used from: HTML 4.01 specs: http://www.w3.org/TR/html401/ -->
      4 <html>
      5 <head>
      6   <META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
      7   <title>Comparing clang to other open source compilers</title>
      8   <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">
     14     <h1>Clang vs Other Open Source Compilers</h1>
     15     
     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
     19        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>
     24        
     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
     28        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>
     33        
     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     
     37     <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     
     44     <!--=====================================================================-->
     45     <h2><a name="gcc">Clang vs GCC (GNU Compiler Collection)</a></h2>
     46     <!--=====================================================================-->
     47     
     48     <p>Pro's of GCC vs clang:</p>
     49     
     50     <ul>
     51     <li>GCC supports languages that clang does not aim to, such as Java, Ada,
     52         FORTRAN, etc.</li>
     53     <li>GCC has a few <a href="cxx_status.html">C++'0x features</a> that Clang
     54         does not yet support.</li>
     55     <li>GCC supports more targets than LLVM.</li>
     56     <li>GCC is popular and widely adopted.</li>
     57     <li>GCC does not require a C++ compiler to build it.</li>
     58     </ul>
     59     
     60     <p>Pro's of clang vs GCC:</p>
     61     
     62     <ul>
     63     <li>The Clang ASTs and design are intended to be <a 
     64         href="features.html#simplecode">easily understandable</a> by
     65         anyone who is familiar with the languages involved and who has a basic
     66         understanding of how a compiler works.  GCC has a very old codebase
     67         which presents a steep learning curve to new developers.</li>
     68     <li>Clang is designed as an API from its inception, allowing it to be reused
     69         by source analysis tools, refactoring, IDEs (etc) as well as for code
     70         generation.  GCC is built as a monolithic static compiler, which makes
     71         it extremely difficult to use as an API and integrate into other tools.
     72         Further, its historic design and <a 
     73         href="http://gcc.gnu.org/ml/gcc/2007-11/msg00460.html">current</a>
     74         <a href="http://gcc.gnu.org/ml/gcc/2004-12/msg00888.html">policy</a> 
     75         makes it difficult to decouple the front-end from the rest of the
     76         compiler. </li>
     77     <li>Various GCC design decisions make it very difficult to reuse: its build
     78         system is difficult to modify, you can't link multiple targets into one
     79         binary, you can't link multiple front-ends into one binary, it uses a
     80         custom garbage collector, uses global variables extensively, is not
     81         reentrant or multi-threadable, etc.  Clang has none of these problems.
     82         </li>
     83     <li>For every token, clang tracks information about where it was written and
     84         where it was ultimately expanded into if it was involved in a macro.
     85         GCC does not track information about macro instantiations when parsing
     86         source code.  This makes it very difficult for source rewriting tools
     87         (e.g. for refactoring) to work in the presence of (even simple) 
     88         macros.</li>
     89     <li>Clang does not implicitly simplify code as it parses it like GCC does.
     90         Doing so causes many problems for source analysis tools: as one simple
     91         example, if you write "x-x" in your source code, the GCC AST will
     92         contain "0", with no mention of 'x'.  This is extremely bad for a
     93         refactoring tool that wants to rename 'x'.</li>
     94     <li>Clang can serialize its AST out to disk and read it back into another 
     95         program, which is useful for whole program analysis.  GCC does not have
     96         this.  GCC's PCH mechanism (which is just a dump of the compiler 
     97         memory image) is related, but is architecturally only 
     98         able to read the dump back into the exact same executable as the one 
     99         that produced it (it is not a structured format).</li>
    100     <li>Clang is <a href="features.html#performance">much faster and uses far
    101         less memory</a> than GCC.</li>
    102     <li>Clang aims to provide extremely clear and concise diagnostics (error and
    103         warning messages), and includes support for <a
    104         href="diagnostics.html">expressive diagnostics</a>.  GCC's warnings are 
    105         sometimes acceptable, but are often confusing and it does not support
    106         expressive diagnostics.  Clang also preserves typedefs in diagnostics
    107         consistently, showing macro expansions and many other features.</li>
    108     <li>GCC is licensed under the GPL license.  clang uses a BSD license, which
    109         allows it to be used by projects that do not themselves want to be
    110         GPL.</li>
    111     <li>Clang inherits a number of features from its use of LLVM as a backend,
    112         including support for a bytecode representation for intermediate code,
    113         pluggable optimizers, link-time optimization support, Just-In-Time
    114         compilation, ability to link in multiple code generators, etc.</li>
    115     <li><a href="compatibility.html#c++">Clang's support for C++</a> is more
    116         compliant than GCC's in many ways (e.g. conformant two phase name
    117         lookup).</li>
    118     </ul>
    119 
    120     <!--=====================================================================-->
    121     <h2><a name="elsa">Clang vs Elsa (Elkhound-based C++ Parser)</a></h2>
    122     <!--=====================================================================-->
    123     
    124     <p>Pro's of Elsa vs clang:</p>
    125     
    126     <ul>
    127     <li>Elsa's parser and AST is designed to be easily extensible by adding
    128         grammar rules.  Clang has a very simple and easily hackable parser,
    129         but requires you to write C++ code to do it.</li>
    130     </ul>
    131     
    132     <p>Pro's of clang vs Elsa:</p>
    133     
    134     <ul>
    135     <li>Clang's C and C++ support is far more mature and practically useful than
    136         Elsa's, and includes many C++'0x features.</li>
    137     <li>The Elsa community is extremely small and major development work seems
    138         to have ceased in 2005. Work continued to be used by other small 
    139         projects (e.g. Oink), but Oink is apparently dead now too.  Clang has a
    140         vibrant community including developers that
    141         are paid to work on it full time.  In practice this means that you can
    142         file bugs against Clang and they will often be fixed for you.  If you
    143         use Elsa, you are (mostly) on your own for bug fixes and feature
    144         enhancements.</li>
    145     <li>Elsa is not built as a stack of reusable libraries like clang is.  It is
    146         very difficult to use part of Elsa without the whole front-end.  For
    147         example, you cannot use Elsa to parse C/ObjC code without building an
    148         AST.  You can do this in Clang and it is much faster than building an
    149         AST.</li>
    150     <li>Elsa does not have an integrated preprocessor, which makes it extremely
    151         difficult to accurately map from a source location in the AST back to
    152         its original position before preprocessing.  Like GCC, it does not keep
    153         track of macro expansions.</li>
    154     <li>Elsa is even slower and uses more memory than GCC, which itself requires 
    155         far more space and time than clang.</li>
    156     <li>Elsa only does partial semantic analysis.  It is intended to work on
    157         code that is already validated by GCC, so it does not do many semantic
    158         checks required by the languages it implements.</li>
    159     <li>Elsa does not support Objective-C.</li>
    160     <li>Elsa does not support native code generation.</li>
    161     </ul>
    162     
    163     
    164     <!--=====================================================================-->
    165     <h2><a name="pcc">Clang vs PCC (Portable C Compiler)</a></h2>
    166     <!--=====================================================================-->
    167     
    168     <p>Pro's of PCC vs clang:</p>
    169     
    170     <ul>
    171     <li>The PCC source base is very small and builds quickly with just a C
    172         compiler.</li>
    173     </ul>
    174     
    175     <p>Pro's of clang vs PCC:</p>
    176     
    177     <ul>
    178     <li>PCC dates from the 1970's and has been dormant for most of that time.
    179         The clang + llvm communities are very active.</li>
    180     <li>PCC doesn't support Objective-C or C++ and doesn't aim to support
    181         C++.</li>
    182     <li>PCC's code generation is very limited compared to LLVM.  It produces very
    183         inefficient code and does not support many important targets.</li>
    184     <li>Like Elsa, PCC's does not have an integrated preprocessor, making it
    185         extremely difficult to use it for source analysis tools.</li>
    186   </div>
    187 </body>
    188 </html>
    189