| # My First Language Frontend with LLVM Tutorial | |
| **Requirements:** This tutorial assumes you know C++, but no previous | |
| compiler experience is necessary. | |
| Welcome to the "My First Language Frontend with LLVM" tutorial. Here we | |
| run through the implementation of a simple language, showing | |
| how fun and easy it can be. This tutorial will get you up and running | |
| fast and show a concrete example of something that uses LLVM to generate | |
| code. | |
| This tutorial introduces the simple "Kaleidoscope" language, building it | |
| iteratively over the course of several chapters, showing how it is built | |
| over time. This lets us cover a range of language design and LLVM-specific | |
| ideas, showing and explaining the code for it all along the way, | |
| and reduces the overwhelming amount of details up front. We strongly | |
| encourage that you *work with this code* - make a copy and hack it up and | |
| experiment. | |
| **Warning**: In order to focus on teaching compiler techniques and LLVM | |
| specifically, | |
| this tutorial does *not* show best practices in software engineering | |
| principles. For example, the code uses global variables | |
| pervasively, doesn't use | |
| [visitors](http://en.wikipedia.org/wiki/Visitor_pattern), etc... but | |
| instead keeps things simple and focuses on the topics at hand. | |
| This tutorial is structured into chapters covering individual topics, | |
| allowing you to skip ahead as you wish: | |
| - [Chapter #1: Kaleidoscope language and Lexer](LangImpl01.md) - | |
| This shows where we are | |
| going and the basic functionality that we want to build. A lexer | |
| is also the first part of building a parser for a language, and we | |
| use a simple C++ lexer which is easy to understand. | |
| - [Chapter #2: Implementing a Parser and AST](LangImpl02.md) - | |
| With the lexer in place, we can talk about parsing techniques and | |
| basic AST construction. This tutorial describes recursive descent | |
| parsing and operator precedence parsing. | |
| - [Chapter #3: Code generation to LLVM IR](LangImpl03.md) - with | |
| the AST ready, we show how easy it is to generate LLVM IR, and show | |
| a simple way to incorporate LLVM into your project. | |
| - [Chapter #4: Adding JIT and Optimizer Support](LangImpl04.md) - | |
| One great thing about LLVM is its support for JIT compilation, so | |
| we'll dive right into it and show you the 3 lines it takes to add JIT | |
| support. Later chapters show how to generate .o files. | |
| - [Chapter #5: Extending the Language: Control Flow](LangImpl05.md) - With | |
| the basic language up and running, we show how to extend | |
| it with control flow operations ('if' statement and a 'for' loop). This | |
| gives us a chance to talk about SSA construction and control | |
| flow. | |
| - [Chapter #6: Extending the Language: User-defined Operators](LangImpl06.md) - This chapter extends the language to let | |
| users define arbitrary unary and binary operators - with assignable | |
| precedence! This allows us to build a significant piece of the | |
| "language" as library routines. | |
| - [Chapter #7: Extending the Language: Mutable Variables](LangImpl07.md) - This chapter talks about adding user-defined local | |
| variables along with an assignment operator. This shows how easy it is | |
| to construct SSA form in LLVM: LLVM does *not* require your front-end | |
| to construct SSA form in order to use it! | |
| - [Chapter #8: Compiling to Object Files](LangImpl08.md) - This | |
| chapter explains how to take LLVM IR and compile it down to object | |
| files, like a static compiler does. | |
| - [Chapter #9: Debug Information](LangImpl09.md) - A real language | |
| needs to support debuggers, so we | |
| add debug information that allows setting breakpoints in Kaleidoscope | |
| functions, print out argument variables, and call functions! | |
| - [Chapter #10: Conclusion and other tidbits](LangImpl10.md) - This | |
| chapter wraps up the series by discussing ways to extend the language | |
| and includes pointers to info on "special topics" like adding garbage | |
| collection support, exceptions, debugging, support for "spaghetti | |
| stacks", etc. | |
| By the end of the tutorial, we'll have written a bit less than 1000 lines | |
| of (non-comment, non-blank) lines of code. With this small amount of | |
| code, we'll have built up a nice little compiler for a non-trivial | |
| language including a hand-written lexer, parser, AST, as well as code | |
| generation support - both static and JIT! The breadth of this is a great | |
| testament to the strengths of LLVM and shows why it is such a popular | |
| target for language designers and others who need high performance code | |
| generation. | |