layers and passes
This commit is contained in:
parent
9eba6d8c26
commit
e839d04a2f
53
_posts/2014-07-05-layers-vs-passes.md
Normal file
53
_posts/2014-07-05-layers-vs-passes.md
Normal file
@ -0,0 +1,53 @@
|
||||
---
|
||||
layout: news
|
||||
author: Torsten
|
||||
---
|
||||
|
||||
I am not stuck. I know i'm not. Just because there is little visible progress doesn't mean i'm stuck. It may just feel like it though.
|
||||
|
||||
But like little cogweels in the clock, i can hear the background process ticking away and sometime there is a gong.
|
||||
|
||||
What i wasn't stuck with is where to draw the layer for the vm.
|
||||
|
||||
### Layers
|
||||
|
||||
Software engineers like layers. Like the onion boy. You can draw boxes, make presentation and convince your boss.
|
||||
They help us to reason about the software.
|
||||
|
||||
In this case the model was to go from ast layer to a vm layer. Via a compile method, that could just as well have been a
|
||||
visitor.
|
||||
|
||||
That didn't work, too big astep and so it was from ast, to vm, to neumann. But i couldn't decide on the abstraction of the
|
||||
virtual machine layer. Specifically, when you have a send (and you have soo many sends in ruby), do you:
|
||||
|
||||
- model it as a vm instruction (a bit like java)
|
||||
- implement it in a couple instructions like resolve, a loop and call
|
||||
- go to a version that is clearly translatable to neumann, say without the value type implementation
|
||||
|
||||
Obviously the third is where we need to get to, as the next step is the neumann layer and somewhow we need to get there.
|
||||
In effect one could take those three and present them as layers, not as alternatives like i have.
|
||||
|
||||
### Passes
|
||||
|
||||
And then the little cob went click, and the idea of passes resurfaced. LLvm has these passes on the code tree, is probably
|
||||
where it surfaced from.
|
||||
|
||||
So we can have as high of a degree of abstraction as possible when going from ast to code. And then have as many passes
|
||||
over that as we want / need.
|
||||
|
||||
Passes can be order dependend, and create more an more datail. To solve the above layer conundrum, we just do a pass for each
|
||||
of those options.
|
||||
|
||||
The two main benefits that come from this are:
|
||||
|
||||
1 - At each point, ie after and during each pass we can analyse the data. Imagine for example that we would have picked the
|
||||
second layer option, that means there would never have been a representation where the sends would have been explicit. Thus
|
||||
any analasis of them would be impossible or need reverse engineering (eg call graph analysis)
|
||||
|
||||
2 - Passes can be gems or come from other sources. The mechanism can be relatively oblivious to explicit passes. And they
|
||||
make the transformation explicit, ie easier to understand. In the example of having picked the second layer level, one
|
||||
would have to patch the implementation of that transformation to achieve a different result. With pases it would be a matter
|
||||
of replacing a pass, thus explicitly stating "i want a non-standard send implementation"
|
||||
|
||||
Actually a third benefit is that it makes testing simpler. More modular. Just test the initial ast->code and then mostly
|
||||
the results of passes.
|
Loading…
Reference in New Issue
Block a user