@Grendizer: quoto il tuo post, soprattutto riguardo la parte relativa ad un universo parallelo dove Amiga potrebbe girare su hardware x86...
Riguardo la parentesi emulazione, non mi ritengo un esperto in questo preciso settore, ma un paio di appunti "tecnici" posso farli. Lieto di essere smentito/corretto da chi è più esperto di me.
Ho letto in rete di un' emulatore di power pc per X86 che si chiama PearPc... mi sembra che lo sviluppo sia fermo dal 2005... il rapporto di emulazione dovrebbe essere intorno ai 15:1 come lentezza.... ai 15MHZ di un Intel corrisponderebbe 1 MHZ di un PowerPc G4...
Generalmente queste stime sono mooolto approssimative. Alcune istruzioni potrebbero essere emulate con velocità 50:1, altre con velocità 1:1, e altre ancora potrebbero essere perfino più veloci della controparte originale. Quindi queste cifre sono sempre da prendere un po' con le pinze.
quindi 3.2 ghz di un i7 corrisponderebbero a 213 Mhz di un g4...
Non esattamente. Un Core i7 è in grado, a parità di cicli di clock, di macinare fino a 3 volte le istruzioni di un Pentium 4 Northwood (CPU molto in voga nel 2004-2005). Quindi, in teoria, se un Pentium 4 vecchio tipo a 3.2 GHz può emulare, più o meno, un G4 a 200 Mhz, allora mi aspetto che un Core i7 renda nell'emulazione più o meno come un G4 da 300 a 600 MHz. Ovviamente tutto questo usando un solo core.
se si usassero in parallelo i 4 core già sarebbero + di 800 Mhz...oppure con un AMD x6 (3.2ghz * 6 = 19,2 GHZ) sarebbero 1280MHZ G4...
Questa è la parte più spinosa del discorso. Scendere nei dettagli tecnici è veramente complesso, ma cercherò di semplificare la cosa per chi non si intende di programmazione.
Un emulatore, generalmente, si occupa di replicare il funzionamento dei componenti di un computer e deve sottostare a certe regole. In particolare, tutto ciò che nel computer reale funziona in parallelo (cioè, la scheda video per i fatti suoi, la CPU per i fatti suoi, ecc...), può essere emulato usando thread paralleli, sebbene con qualche difficoltà nella sincronizzazione tra gli stessi. Ci sono cose, però, che sono veramente difficili, se non del tutto impossibili, da emulare in parallelo. Questi sono i componenti che, per loro intrinseca natura, lavorano in modo sequenziale.
Per emulare l'istruzione di posto i-esimo, in genere, bisogna conoscere l'esito dell'istruzione precedente. E' per questo motivo che praticamente tutti gli emulatori di CPU funzionano in un thread singolo, perchè è praticamente impossibile dividere il calcolo di emulazione in due o più pezzi indipendenti.
Certamente, si può trarre comunque qualche vantaggio dal multicore. Ad esempio si può emulare video, audio, chipset, rete, CPU, ecc... tutti su thread separati. Ma alcune cose (l'audio, la rete) sono molto semplici da emulare rispetto ad altre (come video e CPU), quindi il carico di lavoro non è per niente bilanciato tra i vari thread, portando quindi ad un guadagno modesto nelle performances.
In realtà ci sarebbe una terza strada: l'emulazione di alto livello (chiamata in gergo HLE). Tramite questa tecnica non si emula tutto il sistema nel suo complesso, ma si emula soltanto il sistema operativo. In questo modo si avrebbe un kernel scritto per x86, che lancia N diverse istanze di emulatori PPC, i quali si occupano esclusivamente di emulare la CPU (visto che il resto dell'hardware è quello reale, gestito dal kernel x86). Ciascuna istanza dell'emulatore si occupa di un singolo programma (quindi N programmi su N emulatori) e, tramite il normale meccanismo di scheduling, a ciascun core della macchina sarebbe possibile assegnare un'istanza diversa dell'emulatore (e quindi un programma diverso).
Questa tecnica comporta il massimo del vantaggio prestazionale su architetture multicore, ma richiede comunque la riscrittura di parte del kernel, e l'integrazione a basso livello di questo emulatore. E' la tecnica usata da Apple con il suo emulatore Rosetta (emula programmi PPC su macchine Intel), ed è anche la stessa tecnica che usano gli emulatori m68k per AmigaOS e MorphOS. Sorprendentemente, questa tecnica è usata anche (sotto il nome di Virtual Machine) in software come Google Chrome (per l'esecuzione di codice Javascript), nella Java Runtime Environment (per l'esecuzione di programmi compilati in Java Bytecode), nel .Net framework e, in generale, funzionano in modo simile tutti i linguaggi interpretati come python, ruby, falcon, ecc... ecc...
Cioè, non è l'intera macchina a venire emulata, ma solo la CPU (che può essere fittizia, come nella Java Virtual Machine, o reale come nel caso degli emulatori Rosetta e Petunia) e l'interfaccia verso l'OS.