From 1a380a0b0930f5a1e48618fd6ec09ea5d07d1282 Mon Sep 17 00:00:00 2001
From: Chris Lattner
End-User Features:
+ + + +Driving Goals and Internal Design:
A major focus of our work on clang is to make it fast, light and scalable. +The library-based architecture of clang makes it straight-forward to time and +profile the cost of each layer of the stack, and the driver has a number of +options for performance analysis.
+ +While there is still much that can be done, we find that the clang front-end +is significantly quicker than gcc and uses less memory For example, when +compiling "Carbon.h" on Mac OS/X, we see that clang is 2.5x faster than GCC:
+ +Carbon.h is a monster: it transitively includes 558 files, 12.3M of code, +declares 10000 functions, has 2000 struct definitions, 8000 fields, 20000 enum +constants, etc (see slide 25+ of the clang +talk for more information). It is also #include'd into almost every C file +in a GUI app on the Mac, so its compile time is very important.
+ +From the slide above, you can see that we can measure the time to preprocess +the file independently from the time to parse it, and independently from the +time to build the ASTs for the code. GCC doesn't provide a way to measure the +parser without AST building (it only provides -fsyntax-only). In our +measurements, we find that clang's preprocessor is consistently 40% faster than +GCCs, and the parser + AST builder is ~4x faster than GCC's. If you have +sources that do not depend as heavily on the preprocessor (or if you +use Precompiled Headers) you may see a much bigger speedup from clang. +
+ +Compile time performance is important, but when using clang as an API, often +memory use is even moreso: the less memory the code takes the more code you can +fit into memory at a time (useful for whole program analysis tools, for +example).
+ +Here we see a huge advantage of clang: its ASTs take 5x less memory +than GCC's syntax trees, despite the fact that clang's ASTs capture far more +source-level information than GCC's trees do. This feat is accomplished through +the use of carefully designed APIs and efficient representations.
+ +In addition to being efficient when pitted head-to-head against GCC in batch +mode, clang is built with a library based +architecture that makes it relatively easy to adapt it and build new tools +with it. This means that it is often possible to apply out-of-the-box thinking +and novel techniques to improve compilation in various ways.
+ +This slide shows how the clang preprocessor can be used to make "distcc" +parallelization 3x more scalable than when using the GCC preprocessor. +"distcc" quickly bottlenecks on the preprocessor running on the central driver +machine, so a fast preprocessor is very useful. Comparing the first two bars +of each group shows how a ~40% faster preprocessor can reduce preprocessing time +of these large C++ apps by about 40% (shocking!).
+ +The third bar on the slide is the interesting part: it shows how trivial +caching of file system accesses across invocations of the preprocessor allows +clang to reduce time spent in the kernel by 10x, making distcc over 3x more +scalable. This is obviously just one simple hack, doing more interesting things +(like caching tokens across preprocessed files) would yield another substantial +speedup.
+ +The clean framework-based design of clang means that many things are possible +that would be very difficult in other systems, for example incremental +compilation, multithreading, intelligent caching, etc. We are only starting +to tap the full potential of the clang design.
+ + + +Clang is designed to efficiently capture range information for expressions +and statements, which allows it to emit very useful and detailed diagnostic +information (e.g. warnings and errors) when a problem is detected.
+ +For example, this slide compares the diagnostics emitted by clang (top) to +the diagnostics emitted by GCC (middle) for a simple example:
+ +As you can see, clang goes beyond tracking just column number information: it +is able to highlight the subexpressions involved in a problem, making it much +easier to understand the source of the problem in many cases. For example, in +the first problem, it tells you why the operand is invalid (it +requires a pointer) and what type it really is.
+ +In the second error, you can see how clang uses column number information to +identify exactly which "+" out of the four on that line is causing the problem. +Further, it highlights the subexpressions involved, which can be very useful +when a complex subexpression that relies on tricky precedence rules.
+ +The example doesn't show it, but clang works very hard to retain typedef +information, ensuring that diagnostics print the user types, not the fully +expanded (and often huge) types. This is clearly important for C++ code (tell +me about "std::string", not about "std::basic_string<char, +std::char_traits<char>, std::allocator<char> >"!), but it is +also very useful in C code in some cases as well (e.g. "__m128" vs +"float __attribute__((__vector_size__(16)))").
+ + + +GCC is currently the defacto-standard open source compiler today, and it +routinely compiles a huge volume of code. GCC supports a huge number of +extensions and features (many of which are undocumented) and a lot of +code and header files depend on these features in order to build.
+ +While it would be nice to be able to ignore these extensions and focus on +implementing the language standards to the letter, pragmatics force us to +support the GCC extensions that see the most use. As mentioned above, all +extensions are explicitly recognized as such and marked with extension +diagnostics, which can be mapped to warnings, errors, or just ignored. +
+ + + ++"The world needs better compiler tools, tools which are built as libraries. +This design point allows reuse of the tools in new and novel ways. However, +building the tools as libraries isn't enough: they must have clean APIs, be as +decoupled from each other as possible, and be easy to modify/extend. This +requires clean layering, decent design, and keeping the libraries independent of +any specific client."+ Currently, the LLVM front-end is divided into the following libraries:
Of course this is only a rough outline of the goals and features of - Clang. To get a true sense of what the new LLVM front-end is all about, - as well as why you might want to considering using it, see the Features section.
+ Clang. To get a true sense of what it is all about, see the Features section. The Features section breaks + each of these down and explains them in more detail.The development of a new front-end was started out of a need -- a need for a compiler that allows better diagnostics, better integration with IDEs, a license that is compatible with commercial products, and a - compiler that is easier to develop and maintain. All of these were + nimble compiler that is easy to develop and maintain. All of these were motivations for starting work on a new front-end that could meet these needs.
diff --git a/www/menu.css b/www/menu.css index 46ebb1b85c..1784a9d994 100644 --- a/www/menu.css +++ b/www/menu.css @@ -23,10 +23,6 @@ /* menu style */ /**************/ -#menu { - padding-left: .3em; -} - #menu .submenu { padding-top:1em; display:block; -- 2.50.1