Download as pdf or txt
Download as pdf or txt
You are on page 1of 1

The Architecture of Open Source Applications (Volume 1)LLVM https://aosabook.org/en/v1/llvm.

html

compilers, such as the runtime specialization engine in Apple's OpenGL stack and the image
processing library in Adobe's After Effects product. Finally LLVM has also been used to create a
broad variety of new products, perhaps the best known of which is the OpenCL GPU programming
language and runtime.

1 1 . 1 . A Q u i c k I nt r o d u c t i o n t o C l a s s i c a l C o m p i l e r D e s i g n
The most popular design for a traditional static compiler (like most C compilers) is the three phase
design whose major components are the front end, the optimizer and the back end (Figure 11.1).
The front end parses source code, checking it for errors, and builds a language-specific Abstract
Syntax Tree (AST) to represent the input code. The AST is optionally converted to a new
representation for optimization, and the optimizer and back end are run on the code.

Figure 11.1: Three Major Components of a Three-Phase Compiler

The optimizer is responsible for doing a broad variety of transformations to try to improve the
code's running time, such as eliminating redundant computations, and is usually more or less
independent of language and target. The back end (also known as the code generator) then maps
the code onto the target instruction set. In addition to making correct code, it is responsible for
generating good code that takes advantage of unusual features of the supported architecture.
Common parts of a compiler back end include instruction selection, register allocation, and
instruction scheduling.

This model applies equally well to interpreters and JIT compilers. The Java Virtual Machine (JVM)
is also an implementation of this model, which uses Java bytecode as the interface between the
front end and optimizer.

1 1 . 1 . 1 . I m p li c a t i o n s o f t h i s D e s i g n

The most important win of this classical design comes when a compiler decides to support
multiple source languages or target architectures. If the compiler uses a common code
representation in its optimizer, then a front end can be written for any language that can compile
to it, and a back end can be written for any target that can compile from it, as shown in Figure 11.2.

2 of 16 1/11/2024, 2:19 PM

You might also like