|
| 1 | +% Overview |
| 2 | + |
| 3 | +The Rust compiler is comprised of six main compilation phases. |
| 4 | + |
| 5 | +1. Parsing input |
| 6 | +2. Configuration & expanding (cfg rules & syntax extension expansion) |
| 7 | +3. Running analysis passes |
| 8 | +4. Translation to LLVM |
| 9 | +5. LLVM passes |
| 10 | +6. Linking |
| 11 | + |
| 12 | +Phase one is responsible for parsing & lexing the input to the compiler. The |
| 13 | +output of this phase is an abstract syntax tree (AST). The AST at this point |
| 14 | +includes all macro uses & attributes. This means code which will be later |
| 15 | +expanded and/or removed due to `cfg` attributes is still present in this |
| 16 | +version of the AST. Parsing abstracts away details about individual fies which |
| 17 | +have been read into the AST. |
| 18 | + |
| 19 | +Phase two handles configuration and macro expansion. You can think of this |
| 20 | +phase as a function acting on the AST from the previous phase. The input for |
| 21 | +this phase is the unexpanded AST from phase one, and the output is an expanded |
| 22 | +version of the same AST. This phase will expand all macros & syntax |
| 23 | +extensions and will evaluate all `cfg` attributes, potentially removing some |
| 24 | +code. The resulting AST will not contain any macros or `macro_use` statements. |
| 25 | + |
| 26 | +The code for these first two phases is in [`libsyntax`][libsyntax]. |
| 27 | + |
| 28 | +After this phase, the compiler allocates IDs to each node in the AST |
| 29 | +(technically not every node, but most of them). If we are writing out |
| 30 | +dependencies, that happens now. |
| 31 | + |
| 32 | +The third phase is analysis. This is the most complex phase in the compiler, |
| 33 | +and makes up much of the code. This phase included name resolution, type |
| 34 | +checking, borrow checking, type & lifetime inference, trait selection, method |
| 35 | +selection, linting and so on. Most of the error detection in the compiler comes |
| 36 | +from this phase (with the exception of parse errors which arise during |
| 37 | +parsing). The "output" of this phase is a set of side tables containing |
| 38 | +semantic information about the source program. The analysis code is in |
| 39 | +[`librustc`][rustc] and some other crates with the `librustc_` prefix. |
| 40 | + |
| 41 | +The fourth phase is translation. This phase translates the AST (and the side |
| 42 | +tables from the previous phase) into LLVM IR (intermediate representation). |
| 43 | +This is achieved by calling into the LLVM libraries rather than writing IR |
| 44 | +directly to a file. The code for this is in [`librustc_trans`][trans]. |
| 45 | + |
| 46 | +Phase five runs the LLVM backend. This runs LLVM's optimization passes on the |
| 47 | +generated IR and generates machine code resulting in object files. This phase |
| 48 | +is not really part of the Rust compiler, as LLVM carries out all the work. |
| 49 | +The interface between LLVM and Rust is in [`librustc_llvm`][llvm]. |
| 50 | + |
| 51 | +The final phase, phase six, links the object files into an executable. This is |
| 52 | +again outsourced to other tools and not performed by the Rust compiler |
| 53 | +directly. The interface is in [`librustc_back`][back] (which also contains some |
| 54 | +things used primarily during translation). |
| 55 | + |
| 56 | +A module called the driver coordinates all these phases. It handles all the |
| 57 | +highest level coordination of compilation from parsing command line arguments |
| 58 | +all the way to invoking the linker to produce an executable. |
| 59 | + |
| 60 | +The next section of the guide covers the driver & individual phases in more |
| 61 | +detail. |
| 62 | + |
| 63 | +[libsyntax]: https://github.com/rust-lang/rust/tree/1.6.0/src/libsyntax/ |
| 64 | +[trans]: https://github.com/rust-lang/rust/tree/1.6.0/src/librustc_trans/ |
| 65 | +[llvm]: https://github.com/rust-lang/rust/tree/1.6.0/src/librustc_llvm/ |
| 66 | +[back]: https://github.com/rust-lang/rust/tree/1.6.0/src/librustc_back/ |
| 67 | +[rustc]: https://github.com/rust-lang/rust/tree/1.6.0/src/librustc/ |
0 commit comments