es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Qué significa decir “Las llamadas a funciones se resuelven en tiempo de compilación”?

Estoy tratando de entender el significado del dicho “Las llamadas a funciones se resuelven en tiempo de compilación”. Conozco el concepto de polimorfismo y sé que las funciones “virtuales” se llaman (o se resuelven, o cualquier otra frase correcta que desconozco) durante la ejecución.

Quiero saber qué significa decir “tiempo de compilación” o “tiempo de ejecución” en este contexto de llamada a funciones.

A continuación, se muestra un ejemplo y una explicación de mi comprensión actual, que probablemente sea incorrecta.

const int n = 10; //DECLARACIÓN 1

void func(int x)
{
    //..
}

int main()
{
   int p = 0; //esta es una inicialización dinámica.

   func(p); //DECLARACIÓN 2
}

Según mi comprensión actual,

1) En la declaración 1, “n” es una expresión constante y se conoce en tiempo de compilación. Por lo tanto, el compilador puede reemplazar todas las apariciones de “n” por “10”. Sin embargo, no está obligado a hacerlo (reemplazar todas las apariciones). ¿Es correcta mi explicación de esta declaración?

2) Solía pensar que “p” se pasa en tiempo de ejecución (lo que sea que eso signifique), pero luego leí a alguien decir que todas las llamadas a funciones se resuelven en tiempo de compilación. Y me confundí. Así que no estoy seguro si esta función se llama/resuelve en tiempo de ejecución o en tiempo de compilación. Creo que la razón por la que me confundí es porque

a) No sé la diferencia fundamental entre tiempo de compilación y tiempo de ejecución.

b) No sé la diferencia entre la frase “función resuelta” y “p se pasa en tiempo de ejecución”.

Entonces, ¿alguien puede aclarar estos conceptos y proporcionar enlaces necesarios para que pueda aprender más sobre ellos?

3) La inicialización dinámica ocurre en tiempo de ejecución y la inicialización estática ocurre en tiempo de compilación. 2) Tiempo de compilación significa “hardcodeado/incorporado” en el ejecutable. Pero luego, cuando escribí “int p = 0;”, que es una inicialización dinámica y ocurre en tiempo de ejecución. Pero, ¿de dónde proviene el literal entero “0” para que se pueda usar para inicializar la variable “p” en tiempo de ejecución? ¿El “0” también se codificó en el binario y, de ser así, por qué no se pudo realizar esta declaración (es decir, “p” puede inicializarse estáticamente) en tiempo de compilación?

La pregunta puede ser muy amplia, por lo que agradeceré (daré un voto positivo) si alguien puede responder alguna de las preguntas.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    En el contexto de las llamadas a funciones, “tiempo de compilación” y “tiempo de ejecución” se refieren a los momentos en los que el compilador y el programa procesan las llamadas a funciones, respectivamente.

    Cuando se compila un programa, el compilador genera código ejecutable que contiene instrucciones sobre cómo ejecutar el programa. Estas instrucciones incluyen cualquier llamada a función realizada por el programa. En tiempo de compilación, el compilador resuelve las llamadas a función generando código de máquina que sabe exactamente qué función llamar, basándose en el nombre de la función, los parámetros y el tipo de retorno. Esto es lo que se entiende por “las llamadas a funciones se resuelven en tiempo de compilación”.

    En contraste, en tiempo de ejecución, el programa realmente ejecuta y corre el código de máquina generado. Cuando se encuentra una llamada a función durante la ejecución, el programa sigue las instrucciones generadas en tiempo de compilación para ejecutar el código apropiado para esa función. Esto se conoce como “llamar a la función en tiempo de ejecución”.

    Para responder a tus preguntas específicas:

    1. Tu comprensión de const int n es correcta. El valor de n se conoce en tiempo de compilación y el compilador puede reemplazar todas las apariciones de n con 10. Sin embargo, como mencionaste, el compilador no está obligado a hacer esta sustitución.
    2. En el código de ejemplo que proporcionaste, el valor de p se conoce en tiempo de compilación porque se inicializa estáticamente. La llamada a la función func(p) también se resuelve en tiempo de compilación porque el valor de p es constante y se conoce en tiempo de compilación. Sin embargo, si p se inicializara dinámicamente en tiempo de ejecución (por ejemplo, int p = some_func()), la llamada a la función tendría que resolverse dinámicamente en tiempo de ejecución también. En el contexto de las llamadas a funciones, “resuelto” significa que el compilador genera código de máquina que sabe exactamente qué función llamar y con qué parámetros, mientras que “pasado en tiempo de ejecución” significa que el valor del argumento se determina durante la ejecución del programa.
    3. Sí, la inicialización dinámica ocurre en tiempo de ejecución mientras que la inicialización estática ocurre en tiempo de compilación. El litera entero 0 utilizado para inicializar p se guarda en la sección de datos del programa, que es una parte del ejecutable compilado. Por lo tanto, el valor de 0 está efectivamente “codificado” en el binario. Sin embargo, no es necesario que el compilador inicialice p en tiempo de ejecución; el valor podría determinarse en tiempo de compilación e insertarse en el ejecutable como valor predeterminado para p. Esto daría lugar a que p se inicializara estáticamente, en lugar de dinámicamente.

Comments are closed.