Come divertente progetto per hobby, sto scrivendo una semplice VM bytecode e un compilatore da un linguaggio di alto livello di base al suddetto bytecode.
(Offtopic: il compilatore è ispirato al fantastico tutorial di Jack Crenshaw - Costruiamo un compilatore. Vale davvero la pena leggerlo se non hai familiarità con esso).
Scrivere la VM mi ha fatto riflettere: qual è il set minimo di operazioni che la VM deve supportare per consentire la programmazione di qualsiasi applicazione?
Non sto parlando della completezza di Turing - questo semplicemente ha a che fare con la possibilità di calcolare qualsiasi programma.
Mi riferisco al set di operazioni IO che la VM dovrebbe supportare, tramite opcode dedicati bytecode, attraverso funzioni integrate o attraverso qualche altro meccanismo, per consentire qualsiasi tipo di IO:
Una vera applicazione potrebbe dover leggere un file dal disco, scrivere su un altro, comunicare su TCP o UDP, creare complesse interfacce grafiche sullo schermo, ascoltare l'audio sul microfono, ecc.
Sicuramente gli sviluppatori di, ad esempio, la Java Virtual Machine non hanno creato bytecode dedicati o funzioni built-in per ogni possibile operazione IO. Identico all'interprete Python.
Ora che ci sto pensando - lo stesso si può dire dei compilatori: nessuno scrittore di compilatori per una determinata lingua può supportare ogni possibile operazione di IO.
Quindi come farebbe un progettista VM (o compilatore) per ottenere questo?