The (usually shortened to '''GCC''') is a set of
Programming Language Compiler s produced by the
GNU Project . It is
Free Software distributed by the
Free Software Foundation (FSF) under the
GNU General Public License (GNU GPL) and
GNU Lesser General Public License
(GNU LGPL), and is a key component of the
GNU Toolchain . It is the standard compiler for the free software
Unix-like Operating Systems and Apple
Mac OS X .
Originally named the , because it only handled the
C Programming Language , GCC 1.0 was released in 1987, and the compiler was extended to compile
C++ in December of that year.
1 Front ends were later developed for
Fortran ,
Pascal ,
Objective-C ,
Java , and
Ada , among others.
2
GCC was started by . Its development was supervised by the
Free Software Foundation .Stallman, Richard M. (2001) "
Contributors to GCC, " in
''Using and Porting the GNU Compiler Collection (GCC)'' for gcc version 2.95 (Cambridge, Mass.: Free Software Foundation)
In
1997 , a group of developers, dissatisfied with the slow pace and closed nature of official GCC development, formed a project called
EGCS (Experimental/Enhanced GNU Compiler System), which merged several experimental
Forks into a single project forked from GCC. EGCS development subsequently proved more vigorous than GCC development, and EGCS was eventually "blessed" as the official version of GCC in April
1999 .
GCC is now maintained by a varied group of programmers from around the world. It has been ported to more kinds of
Processor s and
Operating System s than any other compiler.
Linux Information Project (LINFO) accessed 2007-3-20
As well as being the official compiler of the GNU system, including Linux-based variants (
GNU/Linux ), GCC has been adopted as the main compiler used to build and develop other operating systems, including the
BSD s,
Mac OS X ,
NeXTSTEP , and
BeOS .
In addition to its use in free software, GCC is widely deployed as a tool in commercial and closed development environments. GCC is also used in popular embedded platforms like
Symbian ,
Playstation and
Sega Dreamcast .
GCC is often the compiler of choice for developing software that is required to execute on a plethora of hardware. Differences in native compilers lead to difficulties in developing code that will compile correctly on all the compilers and build scripts that will run for all the platforms. By using GCC, the same parser is used for all platforms, so if the code compiles on one, chances are high that it compiles on all.
The standard compiler release 4.2 includes front ends for: ,
Modula-3 ,
Pascal ,
PL/I ,
D ,
Mercury ,
VHDL .
The Fortran front end was g77 before version 4.0, which only supports
Fortran 77 . In newer versions, g77 was dropped in favor of the new
GFortran front end that supports
Fortran 95 . A front end for
CHILL was previously included, but has been dropped owing to a lack of maintenance.
GCC target processors as of version 4.1 include:
Lesser-known target processors supported in the standard release have included:
Additional processors have been supported by GCC versions maintained separately from the FSF version:
When
Retargeting GCC to a new platform,
Bootstrapping is often used.
GCC's external interface is generally standard for a
Unix compiler. Users invoke a driver program named
gcc, which interprets command arguments, decides which language compilers to use for each input file, runs the
Assembler on their output, and then possibly runs the
Linker to produce a complete executable binary.
Each of the language compilers is a separate program that takes in source code and produces assembly language. All have a common internal structure. A per-language s) are applied to the code. Finally, assembly language is produced using architecture-specific
Pattern Matching originally based on an algorithm of
Jack Davidson and
Chris Fraser .
Nearly all of GCC is written in C with the exception of the Ada frontend; much of the Ada frontend is written in Ada.
Frontends vary internally, having to produce trees that can be handled by the backend. The parsers are hand-coded
Recursive Descent Parser s.
Until recently, the tree representation of the program was not fully independent of the processor being targeted. Confusingly, the meaning of a tree was somewhat different for different language front-ends, and front-ends could provide their own tree codes.
In 2005, two new forms of language-independent trees were introduced. These new tree formats are called
GENERIC and
GIMPLE . Parsing is now done by creating temporary language-dependent trees, and converting them to GENERIC. The so-called "gimplifier" then lowers this more complex form into the simpler
SSA -based GIMPLE form which is the common language for a large number of new powerful language- and architecture-independent global (function scope) optimizations.
Optimization on trees does not generally fit into what most compiler developers would consider a front end task, as it is not language dependent and does not involve parsing. GCC developers have given this part of the compiler the somewhat contradictory name the "middle end." These optimizations include
Dead Code Elimination ,
Partial Redundancy Elimination ,
Global Value Numbering ,
Sparse Conditional Constant Propagation , and
Scalar Replacement Of Aggregates . Array dependence based optimizations such as
Automatic Vectorization are currently being developed.
The behavior of the GCC back end is partly specified by
Preprocessor Macros and functions specific to a target architecture, for instance to define the
Endianness ,
Word Size , and
Calling Convention s. The front part of the back end uses these to help decide RTL generation, so although GCC's RTL is nominally processor-independent, the initial sequence of abstract instructions is already adapted to the target.
The exact set of GCC optimizations varies from release to release as it develops, but includes the standard algorithms, such as
Loop Optimization ,
Jump Threading ,
Common Subexpression Elimination ,
Instruction Scheduling , and so forth. The RTL optimizations are of less importance with the recent addition of global SSA-based optimizations on
GIMPLE trees
{Link without Title} , as RTL optimizations have a much more limited scope, and have less high-level information.
A "reloading" phase changes abstract (pseudo-)
Registers into real machine registers, using data collected from the patterns describing the target's
Instruction Set . This is a somewhat complicated phase, because it must account for the vagaries of all of GCC's targets.
The final phase is somewhat anticlimactic, since the patterns to match were generally chosen during reloading, and so the assembly code is simply built by running substitutions of registers and addresses into the strings specifying the instructions.
The primary tool for debugging GCC code is the
GNU Debugger (gdb). Among more specialized tools are
Valgrind for finding memory errors and leaks. The
GNU Profiler (gprof) can be used to find out how much time is spent in which routines, and how often they are called; this requires compiling programs with special ''profiling'' options.