Estou procurando construir uma Máquina Virtual como uma maneira independente de plataforma para executar algum código do jogo (essencialmente scripts).
As máquinas virtuais de que conheço os jogos são bastante antigas: a Z-Machine da Infocom , a SCUMM da LucasArts , o Quake 3 da id Software . Como desenvolvedor .net, conheço o CLR e examinei as instruções do CIL para obter uma visão geral do que você realmente implementa no nível da VM (versus o nível do idioma). Eu também me envolvi um pouco no 6502 Assembler durante o ano passado.
O problema é que agora que eu quero implementar um, preciso cavar um pouco mais fundo. Eu sei que existem VMs baseadas em pilha e registradas, mas realmente não sei qual é a melhor em que e se há mais abordagens híbridas. Preciso lidar com o gerenciamento de memória, decidir quais tipos de baixo nível fazem parte da VM e entender por que coisas como o ldstr funcionam da maneira que funcionam.
Meu único livro de referência (além do material Z-Machine) é o CLI Annotated Standard , mas me pergunto se existe uma palestra melhor, mais geral / fundamental para VMs? Basicamente, algo como o Dragon Book , mas para VMs? Estou ciente da Art of Computer Programming de Donald Knuth, que usa uma VM baseada em registro, mas não tenho certeza de quão aplicável essa série ainda é, especialmente porque ainda está inacabada?
Esclarecimento: O objetivo é construir uma VM especializada. Por exemplo, o Z-Machine da Infocom contém OpCodes para definir a cor de fundo ou reproduzir um som. Então, eu preciso descobrir o quanto a OpCodes usa na VM versus o compilador que pega um script (linguagem TBD) e gera o bytecode a partir dele, mas para isso eu preciso entender o que estou realmente fazendo.
¹ Eu sei que a tecnologia moderna me permitiria interpretar rapidamente uma linguagem de script de alto nível. Mas onde está a diversão nisso? :) Também é um pouco difícil de pesquisar no Google porque hoje em dia as Máquinas Virtuais estão frequentemente associadas à Virtualização de SO do tipo VMWare ...
do { switch(opcode) {case OP1: ... case OP2: ...} while (nextop);
, então talvez um compilador ... e, em seguida, começa a diversão - otimização para torná-lo realmente trabalho
Quake 3
uma máquina virtual?