Start writing up the implementation

This commit is contained in:
Danila Fedorin 2019-10-01 14:35:28 -07:00
parent bcaa67cc7a
commit 64f4abb8d6

View File

@ -161,9 +161,35 @@ graphs when we have to instantiate those functions, we simply
evaluate the arguments and perform the relevant arithmetic operation using BinOp. evaluate the arguments and perform the relevant arithmetic operation using BinOp.
We will do a similar thing for constructors. We will do a similar thing for constructors.
With that out of the way, we can get around to writing some code. We can envision ### Implementation
a method on the `ast` struct that takes an environment (just like our compilation
scheme takes the environment \\(\\rho\\\)). Rather than returning a vector With that out of the way, we can get around to writing some code. Let's
first define C++ structs for the instructions of the G-machine:
{{< codeblock "C++" "compiler/06/instruction.hpp" >}}
We can now envision a method on the `ast` struct that takes an environment
(just like our compilation scheme takes the environment \\(\\rho\\\)),
and compiles the `ast`. Rather than returning a vector
of instructions (which involves copying, unless we get some optimization kicking in), of instructions (which involves copying, unless we get some optimization kicking in),
we'll pass to it a reference to a vector. The method will then place the generated we'll pass a reference to a vector to our method. The method will then place the generated
instructions into the vector. instructions into the vector.
There's one more thing to be considered. How do we tell apart a "global"
from a variable? A naive solution would be to take a list or map of
global functions as a third parameter to our `compile` method.
But there's an easier way! We know that the program passed type checking.
This means that every referenced variable exists. From then, the situation is easy -
if actual variable names are kept in the environment, \\(\\rho\\), then whenever
we see a variable that __isn't__ in the current environment, it must be a function name.
Having finished contemplating out method, it's time to define a signature:
```C++
virtual void compile(const env_ptr env, std::vector<instruction>& into) const;
```
Ah, but now we have to define "environment". Let's do that:
{{< codeblock "C++" "compiler/06/env.hpp" >}}
And now, we begin our implementation.