Re: Hello - and where to begin: Sourceless Programming

Gwenhwyfaer <[email protected]>
Newsgroups gmane.comp.lang.forth.colorforth
Message-ID <[email protected]>
On 22/01/2008, Jeff Fox <[email protected]> wrote:
> >> dictionary of names but Chuck was the compiler.
> >
> > Threaded or machine code?
>
> Subroutine threaded code I think.

Ah - I can see that being a little more difficult to decompile than
indirect threaded code (particularly on an x86, where all jumps are
relative).

> I understand. But that same one to one correspondence is a feature
> of machineForth

Not quite - you still have to worry about jump destinations (where to
put THEN). Whereas indirect threaded code can roll that up into a
higher level primitive, for example one that calls one of two words
depending on the flag on the top of the stack, or the Y combinator.

And then once you've got that far, indirect threading lets you change
what the primitive does, so that rather than executing its code, it's
compiling it into the code area - instant JIT compilation!

> > Add [ ... ] to memoise a constant (so that it only executes the
> > first time it's run, and thereafter just returns the result),
>
> Chuck compiles a constant that when compiled compiles a literal
> with the value of the constant.

I know, I read the description. I'm talking about an approach to doing
it in threaded code which preserves the calculation you started with,
which I remember being one of Chuck's issues with sourceless
programming. Basically, you'd compile the word as before, but it'd
reserve an extra cell at PFA, and its CFA would point to a chunk of
code which executes the word at PFA+1, stores the TOS at PFA, and
changes the CFA to that of CONSTANT. Constant optimisation in a
sourceless system, but without losing the semantic value of the
constant.

And not only that - if we go with the JIT idea, where executing
threaded code actually compiles native code, we can execute the
bracketed code and just compile the result as a literal.

> > In fact, colorForth source more or less IS threaded code - just token
> > threaded, rather than indirect threaded, and with a number of possible
> > ways of interpreting each token - and the inner interpreter has become
> > the outer interpreter...
>
> When targeting machineForth hardware the approach is native code.
> Otherwise, as you say, it is a form of token threading.

You miss my meaning - what I mean is that a BLOCK in colorForth is
effectively a chunk of threaded code which, when executed, compiles a
chunk of native code. Token threaded, because the code cells aren't
actually pointers to other bits of threaded code; and slightly unusual
in that the CFAs are included with the tokens rather than the
definitions (and there are only 16 possible CFA values) - but threaded
code, nonetheless.

Regards
Gwenhwyfaer
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.