¿Por qué los desarrolladores de Microsoft eligieron hacer del .NET una máquina basada en la pila?

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

  •  30-10-2019
  •  | 
  •  

Pregunta

Hoy he encontrado la IL desascado entre las herramientas proporcionadas con VS2008. Traté de desmontar un programa y ver el resultado. Los códigos de operación no eran tan difíciles de entender, pero una cosa me sorprendió: ¿el .NET está basado en la pila? Lectura "Escribe un gran código, Volumen II" No obtuve una buena imagen de las máquinas basadas en pila porque son bastante lentas. También son fáciles de implementar, pero no creo que MS Devs haya elegido este enfoque debido a su simplicidad, después de todo, ese código debe traducirse en un código de máquina real para que simplemente muevan el problema.
¿Puede alguno de ustedes explicar esta extraña opción?

PD:
Publico aquí lo que leí sobre este tema:

13.1.1 Máquinas a base de pilaLas máquinas basadas en pila usan memoria para la mayoría de los cálculos, empleando una pila en la memoria para contener todos los operandos y resultados. Los sistemas informáticos que emplean una arquitectura de pila ofrecen algunas ventajas importantes sobre otras arquitecturas:

  • Las instrucciones a menudo son más pequeñas (cada uno consume menos bytes) que las que se encuentran en otras arquitecturas porque las instrucciones generalmente no tienen que especificar ningún operando.
  • En general, es más fácil escribir compiladores para arquitecturas de pila que para otras máquinas porque la conversión de expresiones aritméticas a una secuencia de operaciones de pila es muy fácil.
  • Las variables temporales rara vez se necesitan en una arquitectura de pila, porque la pila en sí tiene ese propósito.
Desafortunadamente, las máquinas de pila también sufren algunas desventajas serias:
  • Casi todas las instrucciones hacen referencia a la memoria (que es lenta en las máquinas modernas). Aunque los cachés pueden ayudar a mitigar este problema, el rendimiento de la memoria sigue siendo un problema importante en las máquinas de pila.
  • Aunque la conversión de HLL a una máquina de pila es muy fácil, hay menos oportunidades para la optimización que con otras arquitecturas.
  • Debido a que las máquinas de pila están accediendo constantemente a los mismos elementos de datos (es decir, datos en la parte superior de la pila), el paralelismo de tuberías e instrucciones es difícil de lograr (consulte Escribir un gran código, Volumen 1 para obtener detalles sobre la tubería y el paralelismo de instrucciones).
Una pila es una estructura de datos que permite operaciones solo en unos pocos elementos limitados de la pila (a menudo llamado la parte superior de la pila y el siguiente en la pila). Con una pila, generalmente hace una de las tres cosas: presionar nuevos datos en la pila, Pop Data de la pila o operar en los datos que actualmente se encuentran en la parte superior de la pila (y posiblemente los datos inmediatamente debajo).

y

13.1.1.5 máquinas de pila del mundo real
Una gran ventaja de la arquitectura de la pila es que es fácil escribir un compilador para tal máquina. También es muy fácil escribir un emulador para una máquina a base de pila. Por estas razones, las arquitecturas de pila son populares en las máquinas virtuales (máquinas virtuales), como la máquina virtual Java y el intérprete de código P de Microsoft Visual Basic. Existen algunas CPU basadas en la pila del mundo real, como una implementación de hardware de la VM Java; Sin embargo, no son muy populares debido a las limitaciones de rendimiento del acceso a la memoria. No obstante, comprender los conceptos básicos de una arquitectura de pila es importante porque muchos compiladores traducen el código fuente HLL en un formulario basado en pila antes de traducirse al código de máquina real. De hecho, en el peor de los casos (aunque raro), los compiladores se ven obligados a emitir un código que emule una máquina a base de pila al compilar expresiones aritméticas complejas.

EDITAR: Acabo de encontrar un artículo En el blog de @Ericlippert respondiendo la pregunta y confirmando la respuesta de @Aaron

No hay solución correcta

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top