Smalltalk code generation
Mariano Montone
mariano_montone at yahoo.com.ar
Sat Oct 8 17:34:29 UTC 2005
Marcus,
thank you for the long answer, with the examples and so on
:-) .
I'll take the bytecode generation approach into account for
a future refactoring and optimization as I already have it working fine
the other way.
Marian
Marcus Denker wrote:
>
> Am 08.10.2005 um 05:47 schrieb Mariano Montone:
>
>> Hi Alexandre, sorry for not answering before, I hadn't noticed the
>> message.
>>
>> The problem is that I have a code generation visitor traversing the
>> AST. I need to generate different parts of the method from different
>> methods of the visitor. I don't see how your approach may fit, that's
>> why I need to implement it this way.
>>
>
> Yes, then you don't want to deal with text, for sure. One way to do it
> is to visit your AST and build up a refactoring browser AST. The new
> compiler
> (see project NewCompiler on SqueakSource) then can generate bytecode
> from that. (Or you can use the standard Squeak AST for that, but
> this is far from fun to use...)
>
> Another way to do it is to reuse just the back-end of the new compiler:
> Generate directly bytecode from your AST. This saved you from doing
> the conversion to the Squeak AST, thus it's faster and you are not bound
> to Smalltalk semantics, that is, you can encode controlflow with jumps
> directly as you like, thus generating quite nice code for your language.
>
> The backend is IRBuilder: It's a kind of a "symbolic assembler" for
> Squeak Bytecode.
>
> Here's a simple example:
>
> iRMethod := IRBuilder new
> numRargs: 1;
> addTemps: #(self); "receiver and args declarations"
> pushLiteral: 1;
> returnTop;
> ir.
> aCompiledMethod := iRMethod compiledMethod.
>
> So for your AST visitor, you make one IRBuilder, put it in an instVar
> of the visitor and then just call methods on it while
> traversing the tree. IRBuilder has support for symbolic jumps, a test
> showing this:
>
> ir := IRBuilder new
> numRargs: 2;
> addTemps: #(self a z); "rcvr, arg, & extra temp (not
> used here)"
> pushTemp: #self;
> pushInstVar: 2;
> pushTemp: #a;
> send: #>;
> jumpAheadTo: #else if: false;
> pushLiteral: 'yes';
> returnTop;
> jumpAheadTarget: #else;
> pushLiteral: 'no';
> returnTop;
> ir.
> cm := ir compiledMethod.
> self assert: (cm isKindOf: CompiledMethod).
> self assert: (cm valueWithReceiver: self arguments: #(1)) =
> 'yes' .
> self assert: (cm valueWithReceiver: self arguments: #(3)) =
> 'no' .
> ^cm
>
> There are some examples in the IRBuilderTest method (e.g. for how to
> do blocks).
>
> Of course there are downsides: For a complete system you need to take
> care of debugging (a it more difficult,
> but it should be doable. The debugger just needs a mapping
> bytecode-->text that your compiler/decompiler need to
> build up). And you need to keep in mind that the code generated will
> not be decompilable by the smalltalk decompiler,
> If you need a decompiler, then do your own that then will decompile
> directly to your AST.
>
> One problem: It's not yet all to easy to get it in installed, the new
> compiler requires the
> latest 3.9a with AST and methodAnnotations (from
> http://www.iam.unibe.ch/~denker/temp/CMAnnotations.zip).
> This will be fixed soon.
>
>
> Marcus
>
>
___________________________________________________________
1GB gratis, Antivirus y Antispam
Correo Yahoo!, el mejor correo web del mundo
http://correo.yahoo.com.ar
More information about the Squeak-dev
mailing list
|