Rename page and add pop instruction to part 5 of compiler series

This commit is contained in:
Danila Fedorin 2019-11-14 11:05:17 -08:00
parent 58c9d5f982
commit c309ac4c14
3 changed files with 23 additions and 3 deletions

View File

@ -137,6 +137,6 @@ Here are the posts that I've written so far for this series:
* [Typechecking]({{< relref "03_compiler_typechecking.md" >}}) * [Typechecking]({{< relref "03_compiler_typechecking.md" >}})
* [Small Improvements]({{< relref "04_compiler_improvements.md" >}}) * [Small Improvements]({{< relref "04_compiler_improvements.md" >}})
* [Execution]({{< relref "05_compiler_execution.md" >}}) * [Execution]({{< relref "05_compiler_execution.md" >}})
* [Compilation]({{< relref "06_compiler_semantics.md" >}}) * [Compilation]({{< relref "06_compiler_compilation.md" >}})
* [Runtime]({{< relref "07_compiler_runtime.md" >}}) * [Runtime]({{< relref "07_compiler_runtime.md" >}})
* [LLVM]({{< relref "08_compiler_llvm.md" >}}) * [LLVM]({{< relref "08_compiler_llvm.md" >}})

View File

@ -558,7 +558,9 @@ rule to Unwind:
{{< /gmachine_inner >}} {{< /gmachine_inner >}}
{{< /gmachine >}} {{< /gmachine >}}
Just one more! Sometimes, it's possible for a tree node to reference itself. Just a couple more special-purpose instructions, and we're done!
Sometimes, it's possible for a tree node to reference itself.
For instance, Haskell defines the For instance, Haskell defines the
[fixpoint combinator](https://en.wikipedia.org/wiki/Fixed-point_combinator) [fixpoint combinator](https://en.wikipedia.org/wiki/Fixed-point_combinator)
as follows: as follows:
@ -586,9 +588,27 @@ We can allocate an indirection on the stack, and call Update on it when
we've constructed a node. While we're constructing the tree, we can we've constructed a node. While we're constructing the tree, we can
refer to the indirection when a self-reference is required. refer to the indirection when a self-reference is required.
Lastly, we also define a Pop instruction, which just removes
some number of nodes from the stack. We want this because
calling Update at the end of a function modifies a node further up the stack,
leaving anything on top of the stack after that node as scratch work. We get
rid of that scratch work simply by popping it.
{{< gmachine "Pop" >}}
{{< gmachine_inner "Before">}}
\( \text{Pop} \; n : i \quad a_1, a_2, ..., a_n : s \quad d \quad h \quad m \)
{{< /gmachine_inner >}}
{{< gmachine_inner "After" >}}
\( i \quad s \quad d \quad h \quad m \)
{{< /gmachine_inner >}}
{{< gmachine_inner "Description" >}}
Pop \(n\) nodes from the stack.
{{< /gmachine_inner >}}
{{< /gmachine >}}
That's it for the instructions. Knowing them, however, doesn't That's it for the instructions. Knowing them, however, doesn't
tell us what to do with our `ast` structs. We'll need to define tell us what to do with our `ast` structs. We'll need to define
rules to translate trees into these instructions, and I've already rules to translate trees into these instructions, and I've already
alluded to this when we went over `double 326`. alluded to this when we went over `double 326`.
However, this has already gotten pretty long, However, this has already gotten pretty long,
so we'll do it in the next post: [Part 6 - Compilation]({{< relref "06_compiler_semantics.md" >}}). so we'll do it in the next post: [Part 6 - Compilation]({{< relref "06_compiler_compilation.md" >}}).