Perché gli sviluppatori di Microsoft hanno scelto di rendere il .NET una macchina basata su stack?

StackOverflow https://stackoverflow.com/questions/5940449

  •  30-10-2019
  •  | 
  •  

Domanda

Oggi ho trovato lo disassemblare IL tra gli strumenti forniti con VS2008. Ho provato a smontare un programma e dare un'occhiata al risultato. Opcode non era così difficile da capire, ma una cosa mi ha sorpreso: il .NET è basato su Stack?! Leggendo "Scrivi un ottimo codice, Volume II" Non ho avuto una buona foto di macchine basate su stack perché sono piuttosto lenti. Sono facili da implementare anche, ma non credo che MS Devs abbia scelto questo approccio a causa della sua semplicità, dopo che tutto quel codice deve essere tradotto in un codice di macchina reale in modo da spostare il problema.
Qualcuno di voi può spiegare questa strana scelta?

Ps:
Pubblico qui quello che ho letto su questo argomento:

13.1.1 Macchine a base di stackLe macchine basate su stack usano la memoria per la maggior parte dei calcoli, impiegando uno stack in memoria per contenere tutti gli operandi e i risultati. I sistemi informatici che impiegano un'architettura dello stack offrono alcuni importanti vantaggi rispetto ad altre architetture:

  • Le istruzioni sono spesso più piccole (ciascuna che consuma meno byte) rispetto a quelle che si trovano in altre architetture perché le istruzioni generalmente non devono specificare alcun operoni.
  • È generalmente più facile scrivere compilatori per le architetture dello stack che per altre macchine perché la conversione delle espressioni aritmetiche in una sequenza di operazioni di stack è molto semplice.
  • Le variabili temporanee sono raramente necessarie in un'architettura dello stack, perché lo stack stesso serve a tale scopo.
Sfortunatamente, Stack Machines soffre anche di alcuni gravi svantaggi:
  • Quasi tutte le istruzioni fanno riferimento alla memoria (che è lenta sulle macchine moderne). Sebbene le cache possano aiutare a mitigare questo problema, le prestazioni della memoria sono ancora un grosso problema sulle macchine dello stack.
  • Anche se la conversione da HLLS in una macchina da stack è molto semplice, ci sono meno opportunità di ottimizzazione di quanto non ci siano con altre architetture.
  • Poiché le macchine dello stack accedono costantemente agli stessi elementi di dati (ovvero i dati nella parte superiore dello stack), il parallelismo di pipelining e istruzioni è difficile da raggiungere (vedere Scrivi un ottimo codice, volume 1 per i dettagli sul pipelining e il parallelismo delle istruzioni).
Uno stack è una struttura di dati che consente le operazioni solo su alcuni elementi limitati dello stack (spesso chiamato top di stack e il prossimo in stack). Con uno stack generalmente fai una delle tre cose: spingere nuovi dati sullo stack, i dati pop dallo stack o operare sui dati che sono attualmente seduti sulla parte superiore dello stack (e possibilmente i dati immediatamente sotto di esso).

e

13.1.1.5 Machine dello stack del mondo reale
Un grande vantaggio dell'architettura dello stack è che è facile scrivere un compilatore per una macchina del genere. È anche molto facile scrivere un emulatore per una macchina a base di stack. Per questi motivi, le architetture dello stack sono popolari nelle macchine virtuali (VM) come la macchina virtuale Java e l'interprete M Microsoft Visual Basic-Code. Esistono alcune CPU basate su stack nel mondo reale, come un'implementazione hardware della VM Java; Tuttavia, non sono molto popolari a causa delle limitazioni delle prestazioni dell'accesso alla memoria. Tuttavia, comprendere le basi di un'architettura dello stack è importante perché molti compilatori traducono il codice sorgente HLL in un modulo basato su stack prima di tradursi in codice macchina effettivo. In effetti, nel peggiore dei casi (anche se rari), i compilatori sono costretti a emettere codice che emula una macchina a base di stack quando compilano espressioni aritmetiche complesse.

MODIFICARE: Ho appena trovato un articolo Nel blog di @Ericlippert che risponde alla domanda e conferma la risposta di @Aaron

Nessuna soluzione corretta

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top