:orphan:

=============================================
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.html>`_ -
   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.html>`_ -
   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.html>`_ - 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.html>`_ -
   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.html>`_ - 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.html>`_ - 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.html>`_ - 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.html>`_ - 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.html>`_ - 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.html>`_ - 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.
