Sto leggendo un manuale del compilatore che viene compilato in qualche forma di assemblaggio. Poiché non conosco questo linguaggio di assemblaggio, ho deciso di inventare il mio semplice "linguaggio assembly" e di implementare una "macchina virtuale" di base che eseguirà queste istruzioni.
Attualmente sto pensando a come implementare la funzione di declinazione e chiamata alle funzioni nel linguaggio e nella VM.
Ho avuto la seguente idea, per favore dimmi cosa ne pensi:
Le funzioni di decoro assomigliano a semplici etichette. Alla fine di una funzione c'è un'istruzione end
. Il "programma principale" è una funzione autonoma. Ad esempio:
main:
// some logic
CALL funcA
// more logic
END
funcA:
// .. some logic
END
Tuttavia la differenza tra call <function>
e goto <label>
è questa:
goto
imposta semplicemente il 'puntatore di istruzioni' (il registro che contiene il numero della riga successiva da eseguire) sul numero di riga dell'etichetta.
call
fa ciò che goto
fa, ma prima di saltare spinge il numero di riga corrente (più 1) in uno stack.
Quando viene raggiunto end
, la VM apre la parte superiore dello stack e salta a questo numero di riga. Se non c'è nulla nello stack, il programma termina.
Quindi, ad esempio, per il codice sopra questo è ciò che accade:
main: // this is where the VM starts
// some logic
CALL funcA // push onto the stack the number 4 (3+1), and jump to the label funcA
// more logic .. this is where we return to from funcA
END // pop the top of the stack and jump to this line number. nothing -> terminate
funcA:
// .. some logic
END // pop the top of the stack (the number 4), and jump to this line number
Cosa ne pensi di questo approccio?