hi,
we've started a project (will have a web-page soon) that aims to port the php-language (www.php.net) to run on top of parrot. we've written some initial code and i'm kinda stuck while writing the codegen (i target imc) my problem is that php is typeless. i am writing code to to some basic type-recognition in my ast to be able to leverage the much speedier I S and N types in parrot, but for obvious reasons i have to make the php basic type an PMC. problem now is that using pmc for everything will make execution much much slower that it could be. my compiler currently translates: <?php for ($i = 0; $i < 100; $i = $i + 5.5) { echo "hallo"; } ?> to: .pcc_sub _main prototyped .sym PerlUndef TEMP0 TEMP0 = new PerlUndef .sym PerlUndef TEMP1 TEMP1 = new PerlUndef .sym PerlUndef TEMP2 TEMP2 = new PerlUndef .sym PerlUndef TEMP3 TEMP3 = new PerlUndef .sym PerlUndef TEMP4 TEMP4 = new PerlUndef .sym PerlUndef i i = new PerlUndef i = 0 LBL0: TEMP1 = 100 I0 = 0 unless i < TEMP1 goto LBL3 I0 = 1 LBL3: unless I0 goto LBL2 TEMP4 = "hallo" print TEMP4 TEMP2 = 5.5 TEMP3 = i + TEMP2 i = clone TEMP3 goto LBL0 LBL2: .end (i know it can be made better - working on it) - but the basic dilemma is obvious: $i starts as an INT and becomes a FLOAT at runtime. so my compiler made it a PMC. (i know that i'll at one point have to write my own PMC for the PHP base-type, but for now PerlUndef works for me). because pmc as so much slower that native types i loose most of parrots brilliant speed due to the fact that i don't know the types at compile-time. i believe you'll face the same problem once perl6 becomes a reality on parrot so here's my question (i've only been on perl6-internals for some week, so sorry if this has been discussed in depth before): would't it make sense to introduce one additional new type into parrot that can "morph" between the normal types (I, S, N, P)? something like (i call the type VAL): typedef enum { INT, NUMBER, STRING, ... PMC } ValType; typedef struct { ValType type; union { INTVAL i; NUMBER n; STRING s; ... PMC p; } u; } VAL; and add support for this in the executor in the most efficient way. if you think this is unneeded could you explain how you are planning to make untyped languages run really fast on parrot and what direction i have to take to use that technique? (PMC will always carry the vtable jump overhead, so they will be slower than what perl or php use currently in the inner execution loop) i'd also like to add that eg PHP has different semantics when you do binary operations on strings that perl has so this VAL type would have to be as flexible as a PMC. (PHP would have to use a different implementation than Perl6 or Python) thies -- Thies C. Arntzen - Looking for all sorts of freelance work - just ask.. http://www.amazon.de/exec/obidos/wishlist/AB9DY62QWDSZ