> On Jun 23, 2021, at 1:22 PM, Stan Sieler via cctalk <cctalk@classiccmp.org>
> wrote:
>
> Paul K got it right:
> "Any language can be interpreted or compiled. For some languages, like
> LISP and TECO, interpreting is a rather natural implementation techniques,
> while for others (C, ALGOL) compilation is the obvious answer. But either
> is possible."
>
> A few quick notes...
> ...In some cases, we emulate a 16-bit wide CISC architecture (e.g., if you use
> the SPL construct "ASSEMBLE (...)", we compile it...into PA-RISC code
> emulating the old architecture). It's still in use today, and can now emit
> either PA-RISC code or C source code (for a form of cross-compiling).
That's a bit like the machine code translation pioneered by DEC (MIPS to ALPHA)
and subsequently used by Apple ("Rosetta") for PowerPC to Intel and now Intel
to ARM (M1). In a sense, those translators are compilers like all others,
except for the rather unusual "source code" they accept as input. Similar but
somewhat different: the DEC Alpha assembler was a compiler front end, connected
to the code generator shared with the (conventional) Alpha compilers. It was
rather amusing to say "macro/optimize" and see what the optimizer would do to
your assembly code...
> What HP missed, and many people miss, is that any language can be
> compiled. The main question one might ask is the degree of closeness to
> machine code that's emitted :)
I think it was Dijkstra who observed, in the context of the original EL-X1
compiler, that you're generating code for a "machine" of your choosing. When
you see a runtime library call, it makes sense to think of that as a machine
operation of a hypothetical machine different from the physical target
hardware. And function calls can be encoded as subroutine jump instructions,
or in what is often more compact and nearly as fast, threaded code or P-code
words. Typical FORTH implementations are neat in that respect, since they use
a threaded code encoding that allows for fast and efficient switching between
threaded code (subroutine calls) and straight machine code.