Hans Wennborg | 74e4f8a | 2019-04-11 07:46:25 +0000 | [diff] [blame] | 1 | :orphan: |
| 2 | |
Chris Lattner | 2243a165 | 2019-04-07 13:17:16 +0000 | [diff] [blame] | 3 | ============================================= |
Chris Lattner | 13d3505 | 2019-04-07 13:42:29 +0000 | [diff] [blame] | 4 | My First Language Frontend with LLVM Tutorial |
Chris Lattner | 2243a165 | 2019-04-07 13:17:16 +0000 | [diff] [blame] | 5 | ============================================= |
| 6 | |
Chris Lattner | 0fa6c15 | 2019-04-07 14:23:11 +0000 | [diff] [blame] | 7 | **Requirements:** This tutorial assumes you know C++, but no previous |
| 8 | compiler experience is necessary. |
| 9 | |
Chris Lattner | 13d3505 | 2019-04-07 13:42:29 +0000 | [diff] [blame] | 10 | Welcome to the "My First Language Frontend with LLVM" tutorial. Here we |
| 11 | run through the implementation of a simple language, showing |
| 12 | how fun and easy it can be. This tutorial will get you up and running |
| 13 | fast and show a concrete example of something that uses LLVM to generate |
| 14 | code. |
Chris Lattner | 2243a165 | 2019-04-07 13:17:16 +0000 | [diff] [blame] | 15 | |
Chris Lattner | 13d3505 | 2019-04-07 13:42:29 +0000 | [diff] [blame] | 16 | This tutorial introduces the simple "Kaleidoscope" language, building it |
| 17 | iteratively over the course of several chapters, showing how it is built |
| 18 | over time. This lets us cover a range of language design and LLVM-specific |
| 19 | ideas, showing and explaining the code for it all along the way, |
Chris Lattner | 0fa6c15 | 2019-04-07 14:23:11 +0000 | [diff] [blame] | 20 | and reduces the overwhelming amount of details up front. We strongly |
Chris Lattner | 13d3505 | 2019-04-07 13:42:29 +0000 | [diff] [blame] | 21 | encourage that you *work with this code* - make a copy and hack it up and |
| 22 | experiment. |
Chris Lattner | 2243a165 | 2019-04-07 13:17:16 +0000 | [diff] [blame] | 23 | |
Chris Lattner | 0fa6c15 | 2019-04-07 14:23:11 +0000 | [diff] [blame] | 24 | **Warning**: In order to focus on teaching compiler techniques and LLVM |
Chris Lattner | 13d3505 | 2019-04-07 13:42:29 +0000 | [diff] [blame] | 25 | specifically, |
| 26 | this tutorial does *not* show best practices in software engineering |
| 27 | principles. For example, the code uses global variables |
Chris Lattner | 0fa6c15 | 2019-04-07 14:23:11 +0000 | [diff] [blame] | 28 | pervasively, doesn't use |
Chris Lattner | 2243a165 | 2019-04-07 13:17:16 +0000 | [diff] [blame] | 29 | `visitors <http://en.wikipedia.org/wiki/Visitor_pattern>`_, etc... but |
Chris Lattner | 13d3505 | 2019-04-07 13:42:29 +0000 | [diff] [blame] | 30 | instead keeps things simple and focuses on the topics at hand. |
Chris Lattner | 2243a165 | 2019-04-07 13:17:16 +0000 | [diff] [blame] | 31 | |
Chris Lattner | 13d3505 | 2019-04-07 13:42:29 +0000 | [diff] [blame] | 32 | This tutorial is structured into chapters covering individual topics, |
Chris Lattner | 0fa6c15 | 2019-04-07 14:23:11 +0000 | [diff] [blame] | 33 | allowing you to skip ahead as you wish: |
Chris Lattner | 2243a165 | 2019-04-07 13:17:16 +0000 | [diff] [blame] | 34 | |
Chris Lattner | 0fa6c15 | 2019-04-07 14:23:11 +0000 | [diff] [blame] | 35 | - `Chapter #1: Kaleidoscope language and Lexer <LangImpl01.html>`_ - |
| 36 | This shows where we are |
Chris Lattner | 13d3505 | 2019-04-07 13:42:29 +0000 | [diff] [blame] | 37 | going and the basic functionality that we want to build. A lexer |
| 38 | is also the first part of building a parser for a language, and we |
| 39 | use a simple C++ lexer which is easy to understand. |
Chris Lattner | 0fa6c15 | 2019-04-07 14:23:11 +0000 | [diff] [blame] | 40 | - `Chapter #2: Implementing a Parser and AST <LangImpl02.html>`_ - |
Chris Lattner | 2243a165 | 2019-04-07 13:17:16 +0000 | [diff] [blame] | 41 | With the lexer in place, we can talk about parsing techniques and |
| 42 | basic AST construction. This tutorial describes recursive descent |
Chris Lattner | 13d3505 | 2019-04-07 13:42:29 +0000 | [diff] [blame] | 43 | parsing and operator precedence parsing. |
Chris Lattner | 0fa6c15 | 2019-04-07 14:23:11 +0000 | [diff] [blame] | 44 | - `Chapter #3: Code generation to LLVM IR <LangImpl03.html>`_ - with |
Chris Lattner | 13d3505 | 2019-04-07 13:42:29 +0000 | [diff] [blame] | 45 | the AST ready, we show how easy it is to generate LLVM IR, and show |
| 46 | a simple way to incorporate LLVM into your project. |
Chris Lattner | 0fa6c15 | 2019-04-07 14:23:11 +0000 | [diff] [blame] | 47 | - `Chapter #4: Adding JIT and Optimizer Support <LangImpl04.html>`_ - |
| 48 | One great thing about LLVM is its support for JIT compilation, so |
Chris Lattner | 2243a165 | 2019-04-07 13:17:16 +0000 | [diff] [blame] | 49 | we'll dive right into it and show you the 3 lines it takes to add JIT |
Chris Lattner | 13d3505 | 2019-04-07 13:42:29 +0000 | [diff] [blame] | 50 | support. Later chapters show how to generate .o files. |
Chris Lattner | 0fa6c15 | 2019-04-07 14:23:11 +0000 | [diff] [blame] | 51 | - `Chapter #5: Extending the Language: Control Flow <LangImpl05.html>`_ - With the basic language up and running, we show how to extend |
Chris Lattner | 13d3505 | 2019-04-07 13:42:29 +0000 | [diff] [blame] | 52 | it with control flow operations ('if' statement and a 'for' loop). This |
| 53 | gives us a chance to talk about SSA construction and control |
Chris Lattner | 2243a165 | 2019-04-07 13:17:16 +0000 | [diff] [blame] | 54 | flow. |
Chris Lattner | 0fa6c15 | 2019-04-07 14:23:11 +0000 | [diff] [blame] | 55 | - `Chapter #6: Extending the Language: User-defined Operators |
| 56 | <LangImpl06.html>`_ - This chapter extends the language to let |
| 57 | users define arbitrary unary and binary operators - with assignable |
| 58 | precedence! This allows us to build a significant piece of the |
Chris Lattner | 13d3505 | 2019-04-07 13:42:29 +0000 | [diff] [blame] | 59 | "language" as library routines. |
Chris Lattner | 0fa6c15 | 2019-04-07 14:23:11 +0000 | [diff] [blame] | 60 | - `Chapter #7: Extending the Language: Mutable Variables |
| 61 | <LangImpl07.html>`_ - This chapter talks about adding user-defined local |
Chris Lattner | 13d3505 | 2019-04-07 13:42:29 +0000 | [diff] [blame] | 62 | variables along with an assignment operator. This shows how easy it is |
| 63 | to construct SSA form in LLVM: LLVM does *not* require your front-end |
| 64 | to construct SSA form in order to use it! |
Chris Lattner | 0fa6c15 | 2019-04-07 14:23:11 +0000 | [diff] [blame] | 65 | - `Chapter #8: Compiling to Object Files <LangImpl08.html>`_ - This |
Chris Lattner | 2243a165 | 2019-04-07 13:17:16 +0000 | [diff] [blame] | 66 | chapter explains how to take LLVM IR and compile it down to object |
Chris Lattner | 13d3505 | 2019-04-07 13:42:29 +0000 | [diff] [blame] | 67 | files, like a static compiler does. |
Chris Lattner | 32a8e74 | 2019-04-07 14:34:24 +0000 | [diff] [blame] | 68 | - `Chapter #9: Debug Information <LangImpl09.html>`_ - A real language |
| 69 | needs to support debuggers, so we |
Chris Lattner | 0fa6c15 | 2019-04-07 14:23:11 +0000 | [diff] [blame] | 70 | add debug information that allows setting breakpoints in Kaleidoscope |
Chris Lattner | 13d3505 | 2019-04-07 13:42:29 +0000 | [diff] [blame] | 71 | functions, print out argument variables, and call functions! |
Chris Lattner | 0fa6c15 | 2019-04-07 14:23:11 +0000 | [diff] [blame] | 72 | - `Chapter #10: Conclusion and other tidbits <LangImpl10.html>`_ - This |
| 73 | chapter wraps up the series by discussing ways to extend the language |
| 74 | and includes pointers to info on "special topics" like adding garbage |
Chris Lattner | 2243a165 | 2019-04-07 13:17:16 +0000 | [diff] [blame] | 75 | collection support, exceptions, debugging, support for "spaghetti |
Chris Lattner | 0fa6c15 | 2019-04-07 14:23:11 +0000 | [diff] [blame] | 76 | stacks", etc. |
Chris Lattner | 2243a165 | 2019-04-07 13:17:16 +0000 | [diff] [blame] | 77 | |
| 78 | By the end of the tutorial, we'll have written a bit less than 1000 lines |
Chris Lattner | 0fa6c15 | 2019-04-07 14:23:11 +0000 | [diff] [blame] | 79 | of (non-comment, non-blank) lines of code. With this small amount of |
Chris Lattner | 13d3505 | 2019-04-07 13:42:29 +0000 | [diff] [blame] | 80 | code, we'll have built up a nice little compiler for a non-trivial |
Chris Lattner | 2243a165 | 2019-04-07 13:17:16 +0000 | [diff] [blame] | 81 | language including a hand-written lexer, parser, AST, as well as code |
Chris Lattner | 0fa6c15 | 2019-04-07 14:23:11 +0000 | [diff] [blame] | 82 | generation support - both static and JIT! The breadth of this is a great |
| 83 | testament to the strengths of LLVM and shows why it is such a popular |
| 84 | target for language designers and others who need high performance code |
| 85 | generation. |