Pregunta

En el diseño del compilador, ¿por qué en lugar de tener un sistema de guardado de registro de llamante o llamante, el llamante no puede pasar su lista de registros usados ??(que empujaría en caso de un acuerdo de guardado de llamante) al llamante para que el llamante puede comparar su lista de registros usados ??con los registros usados ??por la persona que llama. Entonces solo los registros que realmente necesitan ser empujados, serían empujados. ¿Me estoy perdiendo algo?

¿Fue útil?

Solución

Es una idea interesante. Creo que hay dos cosas que lo hacen menos atractivo:

  • La persona que llama tiene que reservar espacio de pila para el peor de los casos, independientemente.
  • Para hacerlo eficiente, necesitaría instrucciones especiales para almacenar y cargar conjuntos de registros de una sola vez. Tales instrucciones estaban en el Motorola 68000 (y quizás también en PowerPC), pero no han sido populares.

Aquí hay una pequeña explicación de cómo debería funcionar: Usted querría que la persona que llama empaquete la lista en una palabra de máquina como un vector de bits. A continuación, necesitaría que el destinatario de la llamada sea bitwise y, con su propia lista, tenga una instrucción que guarde todos los registros nombrados por el vector de bits resultante.

Debido a que va a tener que reservar espacio en la pila para el peor de los casos, no guarda mucho --- en un procesador moderno, superscalar, fuera de orden, las escrituras en la misma línea de caché son casi libre.

También es cierto que si lo que realmente desea es minimizar el número de cargas y almacenes en el tiempo de ejecución, solo tiene que ir con todos los registros de llamadas guardadas. Esta estrategia también hace que sea realmente barato generar una excepción y cambiar de manera preventiva subprocesos y muchos compiladores (como OCaml ) Utilízalo por ese motivo. Los registros de llamadas guardadas son una especie de truco para tratar de reducir el tamaño del código para las instrucciones de derrame y recarga. Funcionan en muchas situaciones y ahorran espacio porque los sitios de llamadas superan en mucho las definiciones de procedimientos (en promedio, un procedimiento contiene múltiples llamadas).

Para obtener más información sobre las compensaciones entre los registros de llamadas salva y de llamadas, hay un buen documento de Jack Davidson y David Whalley .

Otros consejos

eso es muy ineficiente ... necesitarás analizar la lista (¡para cada función!) lo cual es totalmente innecesario.

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