Start working on runtime chapter
This commit is contained in:
parent
ed88d54aa6
commit
65b9f385cf
44
content/blog/07_compiler_runtime.md
Normal file
44
content/blog/07_compiler_runtime.md
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
---
|
||||||
|
title: Compiling a Functional Language Using C++, Part 7 - Runtime
|
||||||
|
date: 2019-08-06T14:26:38-07:00
|
||||||
|
draft: true
|
||||||
|
tags: ["C and C++", "Functional Languages", "Compilers"]
|
||||||
|
---
|
||||||
|
Wikipedia has the following definition for a __runtime__:
|
||||||
|
|
||||||
|
> A [runtime] primarily implements portions of an execution model.
|
||||||
|
|
||||||
|
We know what our execution model is! We talked about it in Part 5 - it's the
|
||||||
|
lazy graph reduction we've been talking about. Creating and manipulating
|
||||||
|
graph nodes is slightly above hardware level, and all programs in our
|
||||||
|
functional language will rely on such manipulation (it's how they run!). Furthermore,
|
||||||
|
most G-machine instructions are also above hardware level (especially unwind!).
|
||||||
|
|
||||||
|
Push and Slide and other instructions are pretty complex instructions.
|
||||||
|
Most computers aren't stack machines. We'll have to implement
|
||||||
|
our own stack, and whenever a graph-building function will want to modify
|
||||||
|
the stack, it will have to call library routines for our stack implementation:
|
||||||
|
|
||||||
|
```C
|
||||||
|
void stack_push(struct stack_s* s, struct node_s* n);
|
||||||
|
struct node_s* stack_slide(struct stack_s* s, size_t c);
|
||||||
|
/* other stack operation */
|
||||||
|
```
|
||||||
|
|
||||||
|
Furthermore, we observe that Unwind does a lot of the heavy lifting in our
|
||||||
|
G-machine definition. After we build the graph,
|
||||||
|
Unwind is what picks it apart and performs function calls. Furthermore,
|
||||||
|
Unwind pushes Unwind back on the stack: once you've hit it,
|
||||||
|
you're continuing to Unwind until you reach a function call. This
|
||||||
|
effectively means we can implement Unwind as a loop:
|
||||||
|
|
||||||
|
```C
|
||||||
|
while(1) {
|
||||||
|
// Check for Unwind's first rule
|
||||||
|
// Check for Unwind's second rule
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
In this implementation, Unwind is in charge. We won't need to insert
|
||||||
|
the Unwind operations at the end of our generated functions.
|
Loading…
Reference in New Issue
Block a user