git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@43758 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2007-11-06 06:32:18 +00:00
parent 9907cb12ae
commit 4134c2821f

View File

@ -38,8 +38,8 @@
<p>Welcome to the "Implementing a language with LLVM" tutorial. This tutorial
runs through the implementation of a simple language, showing how fun and
easy it can be. This tutorial will get you up and started as well as help to
build a framework you can extend to other languages, allowing you to use this
as a way to start playing with other LLVM specific things.
build a framework you can extend to other languages. The code in this tutorial
can also be used as a playground to hack on other LLVM specific things.
</p>
<p>
@ -59,8 +59,8 @@ use the code as a basis for future projects, fixing these deficiencies shouldn't
be hard.</p>
<p>I've tried to put this tutorial together in a way that makes chapters easy to
skip over if you are already familiar or are uninterested with various pieces.
The structure of the tutorial is:
skip over if you are already familiar with or are uninterested in the various
pieces. The structure of the tutorial is:
</p>
<ul>
@ -82,10 +82,10 @@ is.</li>
Support</b> - Because a lot of people are interested in using LLVM as a JIT,
we'll dive right into it and show you the 3 lines it takes to add JIT support.
LLVM is also useful in many other ways, but this is one simple and "sexy" way
that shows off its power. :)</li>
to shows off its power. :)</li>
<li><b><a href="LangImpl5.html">Chapter #5</a>: Extending the Language: Control
Flow</b> - With the language up and running, we show how to extend it with
control flow operations (if/then/else and a for loop). This gives us a chance
control flow operations (if/then/else and a 'for' loop). This gives us a chance
to talk about simple SSA construction and control flow.</li>
<li><b><a href="LangImpl6.html">Chapter #6</a>: Extending the Language:
User-defined Operators</b> - This is a silly but fun chapter that talks about
@ -94,9 +94,9 @@ unary and binary operators (with assignable precedence!). This lets us build a
significant piece of the "language" as library routines.</li>
<li><b><a href="LangImpl7.html">Chapter #7</a>: Extending the Language: Mutable
Variables</b> - This chapter talks about adding user-defined local variables
along with variable assignment operator. The interesting part about this is how
easy and trivial it is to construct SSA form in LLVM (no, LLVM does <em>not</em>
require your front-end to construct SSA form!).</li>
along with an assignment operator. The interesting part about this is how
easy and trivial it is to construct SSA form in LLVM: no, LLVM does <em>not</em>
require your front-end to construct SSA form!</li>
<li><b><a href="LangImpl8.html">Chapter #8</a>: Conclusion and other useful LLVM
tidbits</b> - This chapter wraps up the series by talking about potential
ways to extend the language, but also includes a bunch of pointers to info about
@ -105,8 +105,8 @@ support for "spaghetti stacks", and a bunch of other tips and tricks.</li>
</ul>
<p>By the end of the tutorial, we'll have written about 700 lines of
non-comment, non-blank lines of code. With this small amount of code, we'll
<p>By the end of the tutorial, we'll have written a bit less than 700 lines of
non-comment, non-blank, lines of code. With this small amount of code, we'll
have built up a very reasonable compiler for a non-trivial language including
a hand-written lexer, parser, AST, as well as code generation support with a JIT
compiler. While other systems may have interesting "hello world" tutorials,
@ -115,8 +115,9 @@ LLVM and why you should consider it if you're interested in language or compiler
design.</p>
<p>A note about this tutorial: we expect you to extend the language and play
with it on your own. Take the code and go crazy hacking away at it. It can be
a lot of fun to play with languages! In any case, lets get into the code!</p>
with it on your own. Take the code and go crazy hacking away at it, compilers
don't need to be scary creatures - it can be a lot of fun to play with
languages!</p>
</div>
@ -127,7 +128,8 @@ a lot of fun to play with languages! In any case, lets get into the code!</p>
<div class="doc_text">
<p>This tutorial will be illustrated with a toy language that we'll call
"<a href="http://en.wikipedia.org/wiki/Kaleidoscope">Kaleidoscope</a>".
"<a href="http://en.wikipedia.org/wiki/Kaleidoscope">Kaleidoscope</a>" (derived
from "meaning beautiful, form, and view").
Kaleidoscope is a procedural language that allows you to define functions, use
conditionals, math, etc. Over the course of the tutorial, we'll extend
Kaleidoscope to support the if/then/else construct, a for loop, user defined
@ -169,9 +171,11 @@ atan2(sin(.4), cos(42))
</pre>
</div>
<p>A more interesting example is included in Chapter 6 where we show the code
used to <a href="LangImpl6.html#example">implement a Mandelbrot Set viewer</a>
in Kaleidoscope.</p>
<p>A more interesting example is included in Chapter 6 where we write a little
Kaleidoscope application that <a href="LangImpl6.html#example">displays
a Mandelbrot Set</a> at various levels of magnification.</p>
<p>Lets dive into the implementation of this language!</p>
</div>
@ -210,7 +214,7 @@ static double NumVal; // Filled in if tok_number
</div>
<p>Each token returned by our lexer will either be one of the Token enum values
or it will be an 'unknown' character like '+', which is returned as its ascii
or it will be an 'unknown' character like '+', which is returned as its ASCII
value. If the current token is an identifier, the <tt>IdentifierStr</tt>
global variable holds the name of the identifier. If the current token is a
numeric literal (like 1.0), <tt>NumVal</tt> holds its value. Note that we use
@ -298,9 +302,9 @@ if you typed in "1.23". Feel free to extend it :). Next we handle comments:
</div>
<p>We handle comments by skipping to the end of the line and then return the
next comment. Finally, if the input doesn't match one of the above cases, it is
either an operator character like '+' or the end of the file. These are handled with
this code:</p>
next token. Finally, if the input doesn't match one of the above cases, it is
either an operator character like '+' or the end of the file. These are handled
with this code:</p>
<div class="doc_code">
<pre>