2011-07-24 16 views
5

¿En qué parte del proceso de creación del programa, el compilador, el enlazador, etc., está la anulación de las funciones y la sobrecarga del operador?¿Dónde se realiza la anulación de funciones?

Estoy particularmente interesado en dónde se hace en C++, Ruby y Python.

Respuesta

4

Función sobrecarga es (al menos en C++) manejado internamente dentro del compilador. La idea es que el código que el compilador genera en última instancia estará codificado para llamar a la función apropiada, como si todas las funciones tuvieran nombres diferentes y usted llamara a la función especialmente adecuada para los argumentos. De manera más general, en la mayoría de los lenguajes compilados de que soportan la sobrecarga, la resolución de sobrecarga se realiza en tiempo de compilación y el código emitido siempre llamará a la función indicada. Por ejemplo, Haskell admite la sobrecarga de tiempo de compilación de esta manera.

La sobrecarga del operador es un caso especial de sobrecarga general, por lo que generalmente se maneja de la misma manera.

Función primordial (un término que surge en OOP cuando una clase derivada hereda de una clase base y redefine uno de sus métodos) está casi siempre resuelto en tiempo de ejecución, ya que un compilador no siempre puede decir qué función se va para ser invocado sin saber realmente sobre los tipos en tiempo de ejecución. Algunos compiladores pueden demostrar de manera estática que un determinado objeto tiene un tipo específico y luego pueden optimizar el despacho dinámico, pero es imposible hacerlo en todos los casos.

No conozco ningún lenguaje dinámico que admita la sobrecarga, ya que en teoría podría introducir nuevos candidatos de sobrecarga a medida que el programa se ejecutaba. Me encantaría estar iluminado si existe ese lenguaje.

+0

Depende de lo que signifique "anular". AIUI, una función no virtual puede anularse, pero la función llamada se determina en tiempo de compilación. Probablemente también pueda hacer cosas divertidas como 'virtual void operator()();' ... –

+0

@ tc- Una función no virtual en C++ puede estar ** sobrecargada ** pero no ** anulada **. Intentar anular una función no virtual solo introduce una sobrecarga en la clase derivada. – templatetypedef

+3

@tc .: No. Las funciones no virtuales están ocultas, no anuladas. –

3

Para C++, la sobrecarga del operador se realiza a nivel del compilador mediante un proceso de creación de nombres que crea un identificador de nombre único para cada función para que el enlazador no se queje de las definiciones de funciones duplicadas. En C++, la sobrecarga del operador es posible porque las operaciones cargables como +, -, *, etc. son funciones reales que tienen el prefijo operator seguido del símbolo de la operación. Así, por ejemplo, una sobrecarga operator+ función con una firma de función como

my_type operator+(const my_type& lhs, const my_type& rhs); 

no entre en conflicto con otro operator+ función con una firma diferente, a pesar de que ambas funciones tienen el mismo nombre operator+, ya que cada versión de la función tendrá un nombre diferente en el nivel de lenguaje ensamblador una vez que se completa el proceso de creación de nombres del compilador C++. El mapeo de nombres tiene otro beneficio, ya que permite que el código compilado en C y C++ se use con el mismo enlazador, ya que dos funciones con el mismo nombre no existirán y causarán un error del enlazador.

Tenga en cuenta que en C, incluso si crea dos funciones con firmas diferentes, si tienen el mismo nombre, dado que el compilador C no hará ningún cambio de nombre, el enlazador se quejará de las definiciones duplicadas de la función .

+0

Downvoter: ¿Qué pasa con esta respuesta? Parece perfectamente razonable. – templatetypedef

+0

@templatetypedef Supongo que es porque la pregunta es sobre anulación y * sobrecarga del operador *, sin sobrecargar en el caso general. –

+0

De acuerdo, lo he editado para que sea específico para la sobrecarga del operador ... sigue siendo el mismo proceso que la sobrecarga de funciones ... – Jason

0

Python no está vinculado/compilado, se interpreta. Por lo tanto, la anulación normal se realiza cuando las fuentes de clase se analizan. Por supuesto, debido a la naturaleza dinámica, siempre puede anular durante el tiempo de ejecución también. Supongo que las implementaciones alternativas que usan la compilación byto-code lo hacen en tiempo de compilación.

También creo que lo anterior también es cierto para Ruby.

Cuestiones relacionadas