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?