Chcę zbudować maszynę wirtualną jako niezależny od platformy sposób uruchamiania kodu gry (w zasadzie skryptów).
Maszyny wirtualne, które znam w grach, są raczej stare: Z-Machine Infocom , SCUMM LucasArtsa , Quake 3 id Software . Jako programista .net znam CLR i zapoznałem się z instrukcjami CIL, aby uzyskać przegląd tego, co faktycznie wdrażasz na poziomie maszyny wirtualnej (w porównaniu do poziomu języka). W ubiegłym roku trochę się też bawiłem w asemblerze 6502 .
Chodzi o to, że teraz, gdy chcę wdrożyć jedną, muszę głębiej kopnąć. Wiem, że istnieją maszyny wirtualne oparte na stosie i oparte na rejestrach, ale tak naprawdę nie wiem, która z nich jest lepsza w czym i czy jest więcej lub podejście hybrydowe. Muszę poradzić sobie z zarządzaniem pamięcią, zdecydować, które typy niskiego poziomu są częścią maszyny wirtualnej i muszę zrozumieć, dlaczego rzeczy takie jak ldstr działają w ten sposób.
Moją jedyną książką referencyjną (oprócz elementów Z-Machine) jest CLI Annotated Standard , ale zastanawiam się, czy jest lepszy, bardziej ogólny / podstawowy wykład dla maszyn wirtualnych? Zasadniczo coś w rodzaju Dragon Book , ale dla maszyn wirtualnych? Zdaję sobie sprawę z sztuki programowania komputerowego Donalda Knutha, która wykorzystuje maszynę wirtualną opartą na rejestrach, ale nie jestem pewien, w jaki sposób ta seria wciąż ma zastosowanie, zwłaszcza, że wciąż jest niedokończona?
Wyjaśnienie: Celem jest zbudowanie specjalistycznej maszyny wirtualnej. Na przykład Z-Machine Infocom zawiera kody OpC do ustawiania koloru tła lub odtwarzania dźwięku. Muszę więc dowiedzieć się, ile idzie na maszynę wirtualną jako OpCodes vs. kompilator, który pobiera skrypt (język TBD) i generuje z niego kod bajtowy, ale w tym celu muszę zrozumieć, co naprawdę robię.
¹ Wiem, że nowoczesna technologia pozwoliłaby mi na bieżąco interpretować język skryptowy wysokiego poziomu. Ale gdzie jest w tym zabawa? :) Google jest również trochę trudny, ponieważ maszyny wirtualne są obecnie często kojarzone z wirtualizacją systemu operacyjnego VMWare ...
do { switch(opcode) {case OP1: ... case OP2: ...} while (nextop);
a może może kompilator ... i wtedy zaczyna się zabawa - optymalizacja, aby rzeczywiście działała
Quake 3
wirtualna maszyna?