> А слово bytecode, я подозреваю, там появилось ещё до того,
> как придумали java.Байт-код вообще появился задолго до того, как придумали Java. Н.Вирт называл такое P-code.
Вот опкоды Perl:
typedef enum opcode {
OP_NULL = 0,
OP_STUB = 1,
...
OP_METHSTART = 419,
OP_INITFIELD = 420,
OP_CLASSNAME = 421,
OP_max
} opcode;
https://github.com/Perl/perl5/blob/48d382667948f6a16c732c477...
Размером больше байта, что сути не меняет, поскольку его размер и в Си стандартизировали относительно недавно.
> там нет никакой виртуальной машине
Here's an older description from Larry.
Perl's compiler is essentially a 3-pass compiler with interleaved phases:
A bottom-up pass
A top-down pass
An execution-order pass
Есть терминологическая неоднозначность. Если Perl не переводит исходный текст в инструкции целевой машины, значит это не компилятор (для такой машины). Но компилятор там есть - в вышеупомянутый коды операций (и было бы странно, если бы он всякий раз при исполнении раз разбирал текст). Эти кода исполняет машина, не реализованная в железе, а потому она - виртуальная.
/* This file contains the main Perl opcode execution loop. It just
* calls the pp_foo() function associated with each op, and expects that
* function to return a pointer to the next op to be executed, or null if
* it's the end of the sub or program or whatever.
...
*/
...
/*
* 'Away now, Shadowfax! Run, greatheart, run as you have never run before!
* Now we are come to the lands where you were foaled, and every stone you
* know. Run now! Hope is in speed!' --Gandalf
*
* [p.600 of _The Lord of the Rings_, III/xi: "The Palantír"]
*/
int
Perl_runops_standard(pTHX)
{
OP *op = PL_op;
PERL_DTRACE_PROBE_OP(op);
while ((PL_op = op = op->op_ppaddr(aTHX))) {
PERL_DTRACE_PROBE_OP(op);
}
PERL_ASYNC_CHECK();
TAINT_NOT;
return 0;
}
https://github.com/Perl/perl5/blob/48d382667948f6a16c732c477...
> и тем более сборщика мусора.
В мои планы не входило в ходе дискуссии скачивать сорцы Perl и что-то там искать, полагаю, что цитат выше достаточно для начала. Устройство интерпретаторов в общем виде я знаю, как и несколько частных случаев. Если в языке нет явного управления памятью, значит это делает за программиста "рантайм". Консервативный сборщик, уплотняющий ли, или же там подсчёт ссылок - это дело десятое. Под мои требования к "ВМ" не очень подходит даже free(), поскольку там нет гарантии O(1).