Mercurial > lcfOS
view doc/compiler.rst @ 305:0615b5308710
Updated docs
author | Windel Bouwman |
---|---|
date | Fri, 06 Dec 2013 13:50:38 +0100 |
parents | fa99f36fabb5 |
children | b145f8e6050b |
line wrap: on
line source
Compiler ======== This chapter describes the design of the compiler. The compiler consists a frontend, mid-end and back-end. The frontend deals with source file parsing and semantics checking. The mid-end performs optimizations. This is optional. The back-end generates machine code. The front-end produces intermediate code. This is a simple representation of the source. The back-end can accept this kind of representation. .. graphviz:: digraph x { rankdir="LR" 1 [label="c3 source file"] 10 [label="c3 front end" ] 11 [label="language X front end" ] 20 [label="mid end" ] 30 [label="back end for X86" ] 31 [label="back end for ARM" ] 40 [label="object file"] 1 -> 10 10 -> 20 [label="IR-code"] 11 -> 20 [label="IR-code"] 20 -> 30 [label="IR-code"] 20 -> 31 [label="IR-code"] 30 -> 40 } IR-code ------- The intermediate representation (IR) of a program de-couples the front end from the backend of the compiler. See ir for details about all the available instructions. C3 Front-end ------------ For the front-end a recursive descent parser is created for the c3 language. This is a subset of the C language with some additional features. .. graphviz:: digraph c3 { rankdir="LR" 1 [label="source text"] 10 [label="lexer" ] 20 [label="parser" ] 30 [label="semantic checks" ] 40 [label="code generation"] 99 [label="IR-code object"] 1 -> 10 10 -> 20 20 -> 30 30 -> 40 [label="AST tree"] 40 -> 99 } .. autoclass:: ppci.c3.Lexer .. autoclass:: ppci.c3.Builder .. autoclass:: ppci.c3.Parser .. autoclass:: ppci.c3.CodeGenerator Back-end -------- The back-end is more complicated. There are several steps to be taken here. 1. Instruction selection 2. register allocation 3. Peep hole optimization? 4. real code generation .. automodule:: codegen :members: Instruction selection ~~~~~~~~~~~~~~~~~~~~~ The instruction selection phase takes care of scheduling and instruction selection. The output of this phase is a one frame per function with a flat list of abstract machine instructions. // .. autoclass:: ppci.irmach.Frame // .. autoclass:: ppci.irmach.AbstractInstruction