2014-08-28 21:32:53 +02:00
|
|
|
### Parfait: a thin layer
|
|
|
|
|
2015-03-25 16:16:20 +01:00
|
|
|
Parfait is the run-time of the vm.
|
|
|
|
To be more precise, it is that part of the run-time that can be expressed in ruby.
|
2014-06-13 23:19:12 +02:00
|
|
|
|
2015-03-25 16:16:20 +01:00
|
|
|
The run-time needs to contain quite a lot of functionality for a dynamic system.
|
|
|
|
And a large part of that functionality must actually be used at compile time too.
|
2014-06-13 23:19:12 +02:00
|
|
|
|
2015-03-25 16:16:20 +01:00
|
|
|
We reuse the Parfait code at compile-time, by inlining it.
|
2014-06-13 23:19:12 +02:00
|
|
|
|
2014-08-05 14:55:24 +02:00
|
|
|
A work in progress that started from here : http://salama.github.io/2014/06/10/more-clarity.html went on here
|
|
|
|
http://salama.github.io/2014/07/05/layers-vs-passes.html
|
|
|
|
|
|
|
|
A step back: the code (program) we compile runs at run - time.
|
|
|
|
And so does parfait. So all we have to do is compile it with the program.
|
|
|
|
|
|
|
|
And thus parfait can be used at run-time.
|
|
|
|
|
|
|
|
It's too simple: just slips off the mind like a fish into water.
|
|
|
|
|
2015-03-25 16:29:39 +01:00
|
|
|
Parfait has a brother, the Builtin module. Builtin contains everything that can not be coded in ruby,
|
|
|
|
but we stil need (things like array access).
|
2014-08-28 18:12:46 +02:00
|
|
|
|
2014-08-05 14:55:24 +02:00
|
|
|
#### Example: Message send
|
|
|
|
|
2014-08-28 18:12:46 +02:00
|
|
|
It felt a little stupid that it took me so long to notice that sending a message is very closely related to the
|
2014-08-05 14:55:24 +02:00
|
|
|
existing ruby method Object.send
|
|
|
|
|
2015-03-25 16:29:39 +01:00
|
|
|
Off course Object.send takes symbol and the arguments and has the receiver, so all the elements of our
|
|
|
|
Messaage are there. And the process that Object.send needs to do is exactly that:
|
|
|
|
send that message, ie find the correct method according to the old walk up the inheritance tree rules and dispatch it.
|
2014-08-05 14:55:24 +02:00
|
|
|
|
2014-08-28 18:12:46 +02:00
|
|
|
And as all this happens at runtime, "all" we have to do is code this logic. And since it is at runtime,
|
|
|
|
we can do it in ruby (as i said, this get's compiled and run, just like the program).
|
2014-08-05 14:55:24 +02:00
|
|
|
|
|
|
|
But what about the infinite loop problem:
|
|
|
|
|
2015-03-25 16:29:39 +01:00
|
|
|
There was a little step left out: Off course the method gets compiled at compile-time and so
|
|
|
|
we don't just blindly dispatch: we catch the simple cases that we know about:
|
|
|
|
layout, type instance variables and compile time known functions.
|
|
|
|
Part of those are some that we just don't allow to be overridden.
|
2014-08-05 14:55:24 +02:00
|
|
|
|
2015-03-25 16:29:39 +01:00
|
|
|
Also what in ruby is object.send is Message.send in salama, as it is the message we are sending and
|
|
|
|
which defines all the data we need (not the object). The object receives, it does not send.
|