Jump to content

GNU Compiler Collection: Difference between revisions

From Wikipedia, the free encyclopedia
Content deleted Content added
m →‎Overview: Pascal link
→‎Overview: clarify GCC's origins
Line 16: Line 16:


==Overview==
==Overview==
GCC was originally written by [[Richard Stallman]] starting in 1985 in an extended, nonportable dialect of [[Pascal (programming language)| Pascal]], ported to C by [[Leonard H. Tower Jr.| Len Tower]] and Stallman,<ref>{{cite journal | last = Stallman | first = Richard M. | title = GNU Status| journal = GNU's Bulletin | volume = 1 | issue = 1 | publisher = Free Software Foundation | date = February 1986 | url = http://web.cecs.pdx.edu/~trent/gnu/bull/01/bull01.txt | accessdate = 2006-09-26 }}</ref> and released in 1987<ref>Tower, Leonard (1987) "[http://groups.google.com/group/comp.lang.misc/msg/32eda22392c20f98 GNU C compiler beta test release,]" ''comp.lang.misc'' USENET newsgroup; see also http://gcc.gnu.org/releases.html#timeline</ref> as the compiler for the GNU Project, in order to have a compiler available that was [[free software]]. Its development was closely shepherded by the [[Free Software Foundation]].<ref>Stallman, Richard M. (2001) "[http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_23.html#SEC260 Contributors to GCC,]" in [http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc.html#SEC_Top ''Using and Porting the GNU Compiler Collection (GCC)''] for gcc version 2.95 (Cambridge, Mass.: Free Software Foundation)</ref>
GCC was started by [[Richard Stallman]] in 1985. He extended an existing compiler to compile C. The compiler originally compiled Pastel, an extended, nonportable dialect of [[Pascal (programming language)| Pascal]], and was written in Pastel. It was rewritten in C by [[Leonard H. Tower Jr.| Len Tower]] and Stallman,<ref>{{cite journal | last = Stallman | first = Richard M. | title = GNU Status| journal = GNU's Bulletin | volume = 1 | issue = 1 | publisher = Free Software Foundation | date = February 1986 | url = http://web.cecs.pdx.edu/~trent/gnu/bull/01/bull01.txt | accessdate = 2006-09-26 }}</ref> and released in 1987<ref>Tower, Leonard (1987) "[http://groups.google.com/group/comp.lang.misc/msg/32eda22392c20f98 GNU C compiler beta test release,]" ''comp.lang.misc'' USENET newsgroup; see also http://gcc.gnu.org/releases.html#timeline</ref> as the compiler for the GNU Project, in order to have a compiler available that was [[free software]]. Its development was supervised by the [[Free Software Foundation]].<ref>Stallman, Richard M. (2001) "[http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_23.html#SEC260 Contributors to GCC,]" in [http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc.html#SEC_Top ''Using and Porting the GNU Compiler Collection (GCC)''] for gcc version 2.95 (Cambridge, Mass.: Free Software Foundation)</ref>


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 [[fork (software)|forks]] into a single project forked from GCC. EGCS development subsequently proved sufficiently more vital than GCC development, and EGCS was eventually "blessed" as the official version of GCC in April [[1999]].
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 [[fork (software)|forks]] into a single project forked from GCC. EGCS development subsequently proved sufficiently more vital than GCC development, and EGCS was eventually "blessed" as the official version of GCC in April [[1999]].

Revision as of 02:29, 10 December 2006

GNU Compiler Collection
Developer(s)The GNU Project
Stable release
4.1.1 / May 24, 2006
Repository
Operating systemCross-platform
TypeCompiler
LicenseGPL
Websitegcc.gnu.org

The GNU Compiler Collection (usually shortened to GCC) is a set of programming language compilers produced by the GNU Project. It is free software distributed by the Free Software Foundation (FSF) under the GNU GPL and 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 GNU C Compiler, because it only handled the C programming language, GCC was later extended to compile C++, Objective-C, Java, Fortran, and Ada among others.

Overview

GCC was started by Richard Stallman in 1985. He extended an existing compiler to compile C. The compiler originally compiled Pastel, an extended, nonportable dialect of Pascal, and was written in Pastel. It was rewritten in C by Len Tower and Stallman,[1] and released in 1987[2] as the compiler for the GNU Project, in order to have a compiler available that was free software. Its development was supervised by the Free Software Foundation.[3]

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 sufficiently more vital 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 processors and operating systems than any other compiler.[citation needed]

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 BSDs, Mac OS X, NeXTSTEP, and BeOS.

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.

Languages

As of version 4.1.1 (released on May 24, 2006), the standard compiler release includes front ends for:

A front end for CHILL was previously included, but has been dropped owing to a lack of maintenance. Before version 4.0, the Fortran front end was G77, which only supports Fortran 77. In newer versions, G77 was dropped in favour of the new GFortran frontend that supports Fortran 95.

Pascal, D, Modula-2, Modula-3, Mercury, VHDL, and PL/I frontends also exist.

Architectures

GCC target processors (as of version 4.1) include:

Lesser-known target processors supported in the standard release have included A29K, ARC, C4x, CRIS, D30V, DSP16xx, FR-30, FR-V, Intel i960, IP2000, M32R, 68HC11, MCORE, MMIX, MN10200, MN10300, NS32K, ROMP, Stormy16, V850, and Xtensa. Additional processors, such as the D10V, PDP-10, MicroBlaze, MSP430 and Z8000, have been supported by GCC versions maintained separately from the FSF version.

When retargeting GCC to a new platform, bootstrapping is often used.

Structure

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 front end that parses the languages and produces an abstract syntax tree ("tree" for short), and a back end that converts the trees to GCC's Register Transfer Language (RTL), runs various compiler optimizations, then produces assembly language using architecture-specific pattern matching originally based on an algorithm of Jack Davidson and Chris Fraser's.

Nearly all of GCC is written in C, although much of the Ada frontend is written in Ada.

Front ends

Frontends vary internally, having to produce trees that can be handled by the backend. The parsers are hand-coded recursive descent parsers.

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.

Middle end

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.

Back end

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 conventions. 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[1], 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.

Debugging GCC programs

The primary tool for debugging GCC code is the GNU Debugger (gdb). Among more specialized tools are Valgrind for finding memory 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.

References

  1. ^ Stallman, Richard M. (February 1986). "GNU Status". GNU's Bulletin. 1 (1). Free Software Foundation. Retrieved 2006-09-26.
  2. ^ Tower, Leonard (1987) "GNU C compiler beta test release," comp.lang.misc USENET newsgroup; see also http://gcc.gnu.org/releases.html#timeline
  3. ^ 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)

See also

GCC now includes Boehm GC, a conservative garbage collector for C/C++.

Further reading