Qual è la relazione tra interpreti meta-circolari, macchine virtuali e aumento delle prestazioni?

11

Ho letto degli interpreti meta-circolari sul web (incluso SICP) e ho esaminato il codice di alcune implementazioni (come PyPy e Narciso).

Ho letto un bel po 'di due lingue che hanno fatto un grande uso della valutazione metacircolare, Lisp e Smalltalk. Per quanto ne so, Lisp è stato il primo compilatore self-hosting e Smalltalk ha avuto la prima "vera" implementazione JIT.

Una cosa che non ho compreso appieno è come possono quegli interpreti / compilatori ottenere prestazioni così buone o, in altre parole, perché PyPy è più veloce di CPython? È a causa della riflessione?

Inoltre, la mia ricerca Smalltalk mi ha portato a credere che esista una relazione tra JIT, macchine virtuali e riflessione. Le macchine virtuali come la JVM e la CLR consentono una grande introspezione di tipo e credo che facciano un grande uso nella compilazione Just-in-Time (e AOT, suppongo?). Ma per quanto ne so, le macchine virtuali sono un po 'come le CPU, in quanto hanno un set di istruzioni di base. Le macchine virtuali sono efficienti perché includono il tipo e le informazioni di riferimento, che consentirebbero una riflessione indipendente dalla lingua?

Chiedo questo perché molti linguaggi interpretati e compilati ora usano il bytecode come target (LLVM, Parrot, YARV, CPython) e le macchine virtuali tradizionali come JVM e CLR hanno ottenuto incredibili miglioramenti nelle prestazioni. Mi è stato detto che si tratta di JIT, ma per quanto ne so, il JIT non è una novità dal momento che Smalltalk e il Sole stesso di Sun lo hanno fatto prima di Java. Non ricordo le VM che si sono comportate particolarmente bene in passato, non ce n'erano molte non accademiche al di fuori di JVM e .NET e le loro prestazioni non erano decisamente buone come adesso (vorrei poter ottenere questa affermazione, ma io parla per esperienza personale).

Poi all'improvviso, verso la fine degli anni 2000, qualcosa è cambiato e molte VM hanno iniziato a comparire anche per linguaggi consolidati e con ottime prestazioni. È stato scoperto qualcosa sull'implementazione del JIT che ha permesso a quasi tutte le moderne macchine virtuali di salire alle stelle in termini di prestazioni? Forse un foglio o un libro?

    
posta Gomi 30.09.2013 - 23:11
fonte

1 risposta

1

2 su 3: non esiste alcuna relazione tra i tempi di programmazione "meta-circolare" e "ad alte prestazioni". I runtime a meta-circolo che raggiungono alte prestazioni lo fanno tramite la compilazione JIT nel codice nativo e l'esecuzione del codice nativo. Non c'è motivo per cui il tuo runtime Python hi-perf debba essere scritto in Python, o Lisp in Lisp, ecc. Ma se pensi che il tuo linguaggio sia più potente, espressivo, ecc. Degli altri, perché non usarlo per scrivere il proprio runtime? Oppure, se non pensi che il tuo linguaggio sia in qualche modo "migliore" di altri, perché hai intenzione di implementarlo del tutto?

    
risposta data 03.10.2013 - 20:19
fonte

Leggi altre domande sui tag