Finish draft of part 6 of compiler series
This commit is contained in:
parent
df0b819b0e
commit
b27dc19e57
|
@ -409,6 +409,11 @@ looks as follows for `definition_defn`:
|
|||
|
||||
{{< codelines "C++" "compiler/06/definition.cpp" 44 51 >}}
|
||||
|
||||
Notice that we terminate the function with Update. This
|
||||
will turn the `ast_app` node that served as the "root"
|
||||
of the application into an indirection to the value that we have computed.
|
||||
In essense, this is how we can lazily evaluate expressions.
|
||||
|
||||
Finally, we make a function in our `main.cpp` file to compile
|
||||
all the definitions:
|
||||
|
||||
|
@ -450,4 +455,45 @@ in that position, so `x` is pushed onto the stack.
|
|||
Finally, `+` is pushed, and the application
|
||||
`(+) x y` is created, which is equivalent to `x+y`.
|
||||
|
||||
{{< todo >}}Backport bugfix in case's typecheck{{< /todo >}}
|
||||
Let's also take a look at a case expression program:
|
||||
|
||||
{{< rawblock "compiler/06/examples/works3.txt" >}}
|
||||
|
||||
The result of the compilation is as follows:
|
||||
|
||||
```
|
||||
Push(0)
|
||||
Eval()
|
||||
Jump(
|
||||
Split()
|
||||
PushInt(0)
|
||||
Slide(0)
|
||||
|
||||
Split()
|
||||
Push(1)
|
||||
PushGlobal(length)
|
||||
MkApp()
|
||||
PushInt(1)
|
||||
PushGlobal(+)
|
||||
MkApp()
|
||||
MkApp()
|
||||
Slide(2)
|
||||
|
||||
)
|
||||
Update(1)
|
||||
```
|
||||
|
||||
We push the first (and only) parameter onto the stack. We then make
|
||||
sure it's evaluated, and perform case analysis: if the list
|
||||
is `Nil`, we simply push the number 0 onto the stack. If it's
|
||||
a concatenation of some `x` and another lists `xs`, we
|
||||
push `xs` and `length` onto the stack, make the application
|
||||
(`length xs`), push the 1, and finally apply `+` to the result.
|
||||
This all makes sense!
|
||||
|
||||
With this, we've been able to compile our expressions and functions
|
||||
into G-machine code. We're not done, however - our computers
|
||||
aren't G-machines. We'll need to compile our G-machine code to
|
||||
__machine code__ (we will use LLVM for this), implement the
|
||||
__runtime__, and develop a __garbage collector__. We'll
|
||||
tackle the first of these in the next post - see you there!
|
||||
|
|
Loading…
Reference in New Issue
Block a user