Download Game! Currently 78 players and visitors. Last logged in:SerkeiiBrundirMalosRammon

Blitzer's Blog >> 71375

Back to blogs index
Posted: 11 Jul 2026 19:34 [ permalink ]
Hauki Bytecode VM:n Hahmotelma
Jos lC$hdemme suunnittelemaan tC$tC$ "Hauki-Bytecodea", meidC$n kannattaa
pitC$C$ se C$C$rimmC$isen RISC-tyyppisenC$ (Reduced Instruction Set Computer).
Virtuaalikoneemme C-ytimessC$ ei tarvitse satoja kC$skyjC$.

TC$ssC$ on ehdotus siitC$, miltC$ arkkitehtuuri voisi nC$yttC$C$ konepellin
alla:

1. Virtuaalikoneen Tila (The VM State)
C-koodiin mC$C$ritellC$C$n kevyt struktuuri, joka edustaa yhtC$ "porttia" tai
rutiinia.

Rekisterit: 4-8 kappaletta 32-bittisiC$ yleisrekistereitC$ (esim. R0, R1, R2,
R3).

Osoittimet: PC (Program Counter, missC$ kohtaa bytecodea mennC$C$n), IN_PTR
(osoitin Inboxiin), OUT_PTR (osoitin Outboxiin).

Rajat: MC$C$rC$tty mC$C$rC$ muistia, jota tC$mC$ VM saa kC$yttC$C$ (estC$C$
ylivuodot heti kC$ttelyssC$).

2. KC$skykanta (Opcodes)
Suunnittelemme omat heksakoodatut kC$skyt, joita C-ytimen tulkki lukee
switch-case -rakenteessa salamannopeasti. Esimerkiksi:

0x01 (LOAD_IN): Lue tavu/chunk Inboxista rekisteriin R0.

0x02 (STORE_OUT): Kirjoita R0 Outboxiin.

0x10 (ADD): Laske R0 + R1.

0x20 (CMP): Vertaile kahta rekisteriC$.

0x21 (JMP_IF): HyppC$C$ toiseen kohtaan koodia, jos vertailu oli tosi.

3. Ikuisten silmukoiden estC$minen (Tulkkitasolla)
Koska ajamme tC$tC$ C-tulkissa, meidC$n ei tarvitse kC$yttC$C$ ajastimia.
Voimme yksinkertaisesti lisC$tC$ virtuaalikoneeseen "kaasumittarin" (Gas
Meter) aivan kuten Ethereum-verkon C$lysopimuksissa:

Jokainen kC$sky kuluttaa 1 yksikC6n kaasua.

C-tulkki antaa rutiinille lC$htC6arvoksi esim. 10 000 yksikkC6C$.

Jos kaasu loppuu ennen kuin rutiini ilmoittaa "VALMIS" (0xFF opcode), C-kernel
keskeyttC$C$ sen hallitusti ja heittC$C$ JS-hypervisorille virheilmoituksen.
TC$llC$ tavalla mikC$C$n while(true) -silmukka ei voi koskaan jumittaa koko
yhdintC$si.

Kun rakennamme tC$mC$n C:llC$, MQuickJS:n rooliksi jC$C$ vain kC$C$ntC$C$
korkean tason sC$C$nnC6t (tai jopa jonkinlainen JS-kaltainen syntaksi) tC$hC$n
binC$C$riseen Hauki-Bytecodeen ja tyC6ntC$C$ se porttiin.

MinkC$ tyyppinen data-kuorma nC$illC$ porteilla on ensimmC$isenC$ tulilinjalla
 puhummeko kiinteC$mittaisista datapaketeista (esim. 512 tavun chunkkeja
HW-laitteilta), vai haluatko rutiinin lukevan porttia tavu kerrallaan
striiminC$, kunnes se lC6ytC$C$ esimerkiksi rivinvaihdon tai tietyn otsakkeen?