c++ - ¿Por qué el nombre de mangling no está estandarizado?
name-mangling (2)
Solo me pregunto por qué la manipulación de nombres nunca fue estandarizada por el estándar C ++. Claramente, tener diferentes algoritmos de gestión de nombres daña la interoperabilidad [1] y no veo ninguna ventaja de tenerla definida en la implementación.
Es decir, a diferencia de las convenciones de llamada o el tamaño de las primitivas, a la máquina en sí no le importa o ni siquiera sabe cómo se llama la función. Entonces, ¿por qué no fue estandarizado y por qué todavía no está estandarizado? Los compiladores han cambiado las reglas en el pasado de todos modos entre las versiones.
[1] todas aquellas personas que exportan funciones como volúmenes extern "C"
.
El estándar en realidad no requiere la manipulación de nombres. Para el caso, el Estándar no requiere números de punto flotante IEEE, ni dos enteros de complemento ni ninguna otra cosa.
Hasta que hubo un ABI generalizado en el que podía confiar, GCC realmente se esforzó por usar un esquema de manipulación de nombres diferente al de sus competidores:
G ++ no hace gestos de nombres de la misma manera que otros compiladores de C ++. Esto significa que los archivos de objeto compilados con un compilador no se pueden usar con otro.
Este efecto es intencional, para protegerte de problemas más sutiles. Los compiladores difieren en cuanto a muchos detalles internos de la implementación de C ++, que incluyen: cómo se diseñan las instancias de clase, cómo se implementa la herencia múltiple y cómo se manejan las llamadas a funciones virtuales. Si la codificación del nombre se hiciera igual, sus programas se vincularían con las bibliotecas proporcionadas por otros compiladores, pero los programas se bloquearían cuando se ejecutaran. Las bibliotecas incompatibles se detectan en el momento del enlace, en lugar de en el tiempo de ejecución.
La manipulación de nombres también es más compleja de lo que muchos programadores se dan cuenta. Por ejemplo, ¿cómo especificaría el estándar convenciones de llamadas aceptables para todas las plataformas en las que C ++ podría ejecutarse ? ¿Debería requerirse un sistema RISC para soportar x86 stdcall
, aunque los sistemas RISC usualmente pasan sus argumentos en registros en lugar de en la pila?
El estándar no aborda los detalles de implementación. Hay muchas, muchas cosas que dependen de la implementación, y que impiden que los programas trabajen juntos: cómo están organizadas las clases, la estructura de la vtable
, etc. En general, los compiladores cambiarán el nombre de los nombres si cambian alguno de estos . Esto es intencional, ya que evita que el código que no funciona se vincule.
Es posible que una plataforma determinada defina un ABI de C ++; todos los compiladores que se adhieran a él usarían implementaciones compatibles y tendrán un nombre común de mutilación. Este es un problema para los proveedores de la plataforma, sin embargo; por las razones que sean, muy pocos proveedores han definido un C ++ ABI.
Y la razón por la que extern "C"
funciona es porque casi todas las plataformas definen un C ABI.