Scusa se il titolo non è chiaro, i suggerimenti su un titolo migliore sono i benvenuti.
Allo scopo di [auto-] istruzione sto scrivendo un linguaggio di scripting giocattolo che dovrebbe essere compilato in bytecode ed essere eseguito su una VM giocattolo.
Questo non sarà un linguaggio completo di turing e conterrà solo strutture di controllo del flusso semplici come if...then...else
e nel complesso sarà solo una sequenza di istruzioni diritta.
Ho già praticamente tutto funzionante tranne una parte: vorrei che il mio bytecode avesse una sezione di dati di sola lettura (molto simile a .rodata nei binari nativi). Tuttavia sono bloccato su come faccio riferimento a questo in opcode? Posso dare l'indirizzo dell'inizio del blocco di dati, ma come posso fornire la lunghezza dei dati?
Ad esempio: posso avere un opcode 0x01
per confrontare un valore immediato 0x0005
con i dati nella sezione dati ad un indirizzo 0xf002
(ignora endianness per ora):
0000 0100050002
...
f002 0005000000
Una possibile soluzione che potrei pensare è di anteporre il valore alla lunghezza del blocco di dati (come 0005000000
diventa 0200050000
) ma ciò porta al problema di essere limitati nella dimensione del blocco dati (cioè se si usa 1 byte come in questo esempio, ovviamente sarà limitato da 255 byte, che alcuni potrebbero dire è sufficiente per tutti) o se fornisci una dimensione sufficientemente grande (ad esempio 8 byte), la dimensione della dimensione sarà molto più grande dei dati effettivi in alcuni casi, che non è desiderabile.
Quale sarebbe un approccio migliore?