Existen situaciones en las que la optimización de la cola podría romper el ABI o, al menos, ser muy difícil de implementar de forma semántica. Piense en el código de posición independiente en bibliotecas compartidas, por ejemplo: algunas plataformas permiten que los programas se vinculen dinámicamente con bibliotecas para guardar la memoria principal cuando varias aplicaciones diferentes dependen de la misma funcionalidad. En tales casos, la biblioteca se carga una vez y se asigna a cada una de las memorias virtuales del programa como si fuera la única aplicación en un sistema. En UNIX y también en algunos otros sistemas, esto se logra utilizando un código de posición independiente para las bibliotecas, de modo que el direccionamiento es relativo a un desplazamiento, en lugar de absoluto a un espacio de direcciones fijo. Sin embargo, en muchas plataformas, el código de posición independiente no debe ser optimizado. El problema involucrado es que las compensaciones para navegar a través del programa deben mantenerse en registros; en Intel 32 bits, se usa %ebx
que es un registro guardado en línea; otras plataformas siguen esa noción. A diferencia de las funciones que utilizan llamadas normales, las que despliegan llamadas de cola deben restaurar los registros guardados en línea antes de la bifurcación en la subrutina, no cuando se devuelven. Normalmente, eso no es un problema, porque en este punto, la función de llamada más alta no se preocupa por el valor almacenado en %ebx
, pero el código de posición independiente depende de este valor en cada comando de salto, llamada o bifurcación.
Otros problemas podrían estar pendientes de las limpiezas en los lenguajes orientados a objetos (C++), lo que significa que la última llamada de una función no es realmente la última llamada; las limpiezas sí lo son. Por lo tanto, el compilador generalmente no optimiza, cuando este es el caso.
También setjmp
y longjmp
son problemáticos, por supuesto, ya que esto efectivamente significa que una función puede terminar la ejecución más de una vez, antes de que realmente termine. ¡Difícil o imposible de optimizar en tiempo de compilación!
Probablemente haya razones más técnicas que se puedan imaginar. Estas son solo algunas consideraciones.
Relacionados: http://stackoverflow.com/questions/2250727/regarding-stack-reuse-of-a-function-calling-itself –