Tiempo de ejecución vs. tiempo de compilación


370

¿Cuál es la diferencia entre tiempo de ejecución y tiempo de compilación?


He dado un ejemplo muy pequeño pero claro ... No intimida con grandes detalles. Después de eso, todas las respuestas pueden pasar. Son increíbles ...
sankar banerjee

Respuestas:


479

La diferencia entre el tiempo de compilación y el tiempo de ejecución es un ejemplo de lo que los teóricos puntiagudos llaman la distinción de fase . Es uno de los conceptos más difíciles de aprender, especialmente para personas sin mucha experiencia en lenguajes de programación. Para abordar este problema, me resulta útil preguntar

  1. ¿Qué invariantes satisface el programa?
  2. ¿Qué puede salir mal en esta fase?
  3. Si la fase tiene éxito, ¿cuáles son las condiciones posteriores (qué sabemos)?
  4. ¿Cuáles son las entradas y salidas, si hay alguna?

Tiempo de compilación

  1. El programa no necesita satisfacer a ninguna invariante. De hecho, no tiene por qué ser un programa bien formado. Puede alimentar este HTML al compilador y verlo barf ...
  2. Qué puede salir mal en tiempo de compilación:
    • Errores de sintaxis
    • Errores de comprobación de tipo
    • (Raramente) el compilador se bloquea
  3. Si el compilador tiene éxito, ¿qué sabemos?
    • El programa estaba bien formado, un programa significativo en cualquier idioma.
    • Es posible comenzar a ejecutar el programa. (El programa puede fallar inmediatamente, pero al menos podemos intentarlo).
  4. ¿Cuáles son las entradas y salidas?
    • La entrada era el programa que se estaba compilando, además de los archivos de encabezado, interfaces, bibliotecas u otro vudú que necesitaba importar para poder compilarse.
    • La salida es, con suerte, código de ensamblaje o código de objeto reubicable o incluso un programa ejecutable. O si algo sale mal, la salida es un montón de mensajes de error.

Tiempo de ejecución

  1. No sabemos nada acerca de los invariantes del programa: son lo que sea que el programador haya puesto. Los invariantes en tiempo de ejecución rara vez son aplicados solo por el compilador; Necesita ayuda del programador.
  2. Lo que puede salir mal son los errores de tiempo de ejecución :

    • División por cero
    • Desreferenciar un puntero nulo
    • Quedando sin memoria

    También puede haber errores detectados por el propio programa:

    • Intentando abrir un archivo que no está allí
    • Intentando encontrar una página web y descubriendo que una supuesta URL no está bien formada
  3. Si el tiempo de ejecución tiene éxito, el programa finaliza (o continúa) sin fallar.
  4. Las entradas y salidas dependen totalmente del programador. Archivos, ventanas en la pantalla, paquetes de red, trabajos enviados a la impresora, lo que sea. Si el programa lanza misiles, eso es una salida, y ocurre solo en tiempo de ejecución :-)

13
Muy buena respuesta para lo que cubre (+1), sin embargo, ni siquiera toca los aspectos de metaprogramación del tiempo de compilación frente al tiempo de ejecución y, en mi humilde opinión, es la parte más interesante. De acuerdo, dado que esta respuesta fue aceptada, bien podría estar fuera de lo que estaba buscando el OP.
BCS

44
Bien, si alguien me pregunta sobre eso durante mis conferencias, usaré tu respuesta :-)
e-satis

12
Esta es una muy buena respuesta. Es bastante claro y comprensible. No es fácil encontrar tantas respuestas claras en Google.
Tarik

77
Incluso si has programado un tiempo, aún no es fácil de conseguir ... no es solo un hombre novato. Buena pregunta de la OP.
PositiveGuy

11
"No es necesario que el programa satisfaga a los invariantes. De hecho, no tiene por qué ser un programa bien formado. Podrías alimentar este HTML al compilador y verlo barf ..." No tengo idea de lo que estás diciendo aquí. ¿Puede explicar esto en términos simples, no congestionados con toda esta basura técnica?
PositiveGuy

175

Pienso en términos de errores y cuándo pueden ser atrapados.

Tiempo de compilación:

string my_value = Console.ReadLine();
int i = my_value;

No se puede asignar una variable de tipo int a un valor de cadena, por lo que el compilador sabe con certeza en el momento de la compilación que este código tiene un problema

Tiempo de ejecución:

string my_value = Console.ReadLine();
int i = int.Parse(my_value);

Aquí el resultado depende de qué cadena fue devuelta por ReadLine (). Algunos valores se pueden analizar a un int, otros no. Esto solo se puede determinar en tiempo de ejecución


59
Ahora esto es algo que todos podemos entender. No hay palabras técnicas generales de basura aquí. Agradable.
PositiveGuy

Para una aplicación de iPhone: ¿Es el tiempo de compilación la primera vez que el desarrollador compila el código en una .appextensión? ¿O sucede al iniciar cada vez que el usuario inicia la aplicación?
Miel

1
@Honey es compilado por primera vez por el desarrollador en un .app
maytham-ɯɐɥʇʎɐɯ

2
Esta es una excelente respuesta final que cubre la diferencia entre compilar y ejecutar conceptualmente. Aprecio la respuesta académica y docente que se eligió también, pero esta es clara y concisa. Después de leer esta respuesta, puedo regresar y leer la respuesta elegida, y tiene más sentido. Gracias
mojave

72

Tiempo de compilación: el período de tiempo en el que usted, el desarrollador, está compilando su código.

Tiempo de ejecución: el período de tiempo durante el cual un usuario ejecuta su software.

¿Necesitas alguna definición más clara?


12
@BCS: El OP puede haber tenido una introducción extremadamente simple a la programación usando un lenguaje interpretado o compilación de bytes y luego ejecutar en un solo paso para que la distinción nunca sea necesaria. La pregunta es ingenua, pero no tonta.
dmckee --- ex-gatito moderador

@dmckee: Creo que esta respuesta ni siquiera sería útil para su usuario, ya que no tiene más contenido de información que la pregunta original. Cualquiera que haga la pregunta que responde esta respuesta no tiene programación de negocios (y no creo que el OP lo haya preguntado).
BCS

Tengo una pregunta rápida. Cuando alguien dice que un error de tiempo de ejecución típico se divide por cero, pero qué pasa si tiene una variable, digamos int x = 3/0pero no hace nada con esta variable. No lo imprimimos ni nada. ¿Eso todavía se considerará un error de tiempo de ejecución?
Robben

Para una aplicación de iPhone: ¿Es el tiempo de compilación la primera vez que el desarrollador compila el código en una extensión .app? ¿O sucede al iniciar cada vez que el usuario inicia la aplicación? Si es el momento de compilación para el que se está compilando el código del desarrollador, ¿por qué me importaría? Quiero decir que esto no afectará la experiencia del usuario, ¿verdad? Como mataría a los desarrolladores, ¡solo tiempo!
Miel

1
@Robben asumo que tienes tu respuesta después de todo este tiempo, pero la responderé por otros. Sí, sería un error de tiempo de ejecución incluso si no la usas
فربد ضروري

22

( editar : lo siguiente se aplica a C # y lenguajes de programación similares, fuertemente tipados. No estoy seguro de si esto le ayuda).

Por ejemplo, el compilador detectará el siguiente error (en tiempo de compilación ) antes de ejecutar un programa y generará un error de compilación:

int i = "string"; --> error at compile-time

Por otro lado, el compilador no puede detectar un error como el siguiente. Recibirá un error / excepción en tiempo de ejecución (cuando se ejecuta el programa).

Hashtable ht = new Hashtable();
ht.Add("key", "string");
// the compiler does not know what is stored in the hashtable
// under the key "key"
int i = (int)ht["key"];  // --> exception at run-time

Excepciones Hashtable fue uno, pero encontré que el paso más grande fue .net 1.1 a .net 2.0, pasando de conjuntos de datos sin tipo a tipos (y ahora linq). ¡Intentar solucionar problemas de un formulario roto con una base de datos dudosa utilizada para ponerme muy triste!
Spence

19

La traducción del código fuente a cosas que suceden en la [pantalla | disco | red] puede ocurrir de dos maneras (aproximadamente); llámalos compilando e interpretando.

En un programa compilado (los ejemplos son c y fortran):

  1. El código fuente se alimenta a otro programa (generalmente llamado compilador, vaya a la figura), que produce un programa ejecutable (o un error).
  2. El ejecutable se ejecuta (haciendo doble clic en él o escribiendo su nombre en la línea de comando)

Se dice que las cosas que suceden en el primer paso suceden en el "tiempo de compilación", las cosas que suceden en el segundo paso se suceden en el "tiempo de ejecución".

En un programa interpretado (ejemplo MicroSoft basic (en dos) y python (creo)):

  1. El código fuente se alimenta a otro programa (generalmente llamado intérprete) que lo "ejecuta" directamente. Aquí el intérprete sirve como una capa intermedia entre su programa y el sistema operativo (o el hardware en computadoras realmente simples).

En este caso, la diferencia entre el tiempo de compilación y el tiempo de ejecución es bastante difícil de precisar y mucho menos relevante para el programador o usuario.

Java es una especie de híbrido, donde el código se compila en bytecode, que luego se ejecuta en una máquina virtual que generalmente es un intérprete para el bytecode.

También hay un caso intermedio en el que el programa se compila en bytecode y se ejecuta inmediatamente (como en awk o perl).


11

Básicamente, si su compilador puede determinar qué quiere decir o qué valor tiene "en tiempo de compilación", puede codificar esto en el código de tiempo de ejecución. Obviamente, si su código de tiempo de ejecución tiene que hacer un cálculo cada vez, se ejecutará más lentamente, por lo que si puede determinar algo en tiempo de compilación, es mucho mejor.

P.ej.

Plegado constante:

Si escribo

int i = 2;
i += MY_CONSTANT;

El compilador puede realizar este cálculo en tiempo de compilación porque sabe qué es 2 y qué es MY_CONSTANT. Como tal, se salva de realizar un cálculo en cada ejecución.


Y es más fácil mantener el código de tiempo de compilación que el código enlazado en tiempo de ejecución. En el momento de la compilación, puede usar el compilador para verificar algunas cosas. Las mismas cosas en tiempo de ejecución requieren más tiempo para verificar porque implican pruebas.
user1154664

10

Hmm, está bien, el tiempo de ejecución se usa para describir algo que ocurre cuando se ejecuta un programa.

El tiempo de compilación se usa para describir algo que ocurre cuando un programa está siendo construido (generalmente, por un compilador).


8

Tiempo de compilación:

Las cosas que se hacen en tiempo de compilación no tienen costo (casi) sin costo cuando se ejecuta el programa resultante, pero pueden generar un costo alto cuando se crea el programa.

Tiempo de ejecución:

Más o menos exactamente lo contrario. Bajo costo cuando construye, más costo cuando se ejecuta el programa.

Desde el otro lado; Si se hace algo en tiempo de compilación, solo se ejecuta en su máquina y si algo es en tiempo de ejecución, se ejecuta en la máquina de sus usuarios.

Relevancia

Un ejemplo de dónde esto es importante sería un tipo de transporte de unidades. Una versión en tiempo de compilación (como Boost.Units o mi versión en D ) termina siendo tan rápida como resolver el problema con el código nativo de punto flotante, mientras que una versión en tiempo de ejecución termina teniendo que reunir información sobre las unidades que son un valor en y realizar controles en ellos junto con cada operación. Por otro lado, las versiones en tiempo de compilación requieren que las unidades de los valores se conozcan en tiempo de compilación y no pueden tratar el caso de donde provienen de la entrada en tiempo de ejecución.


8

Siguiendo la respuesta anterior similar de la pregunta ¿Cuál es la diferencia entre el error en tiempo de ejecución y el error del compilador?

Errores de compilación / tiempo de compilación / sintaxis / semántica: los errores de tiempo de compilación o compilación son errores producidos debido a un error de escritura, si no seguimos la sintaxis y la semántica adecuadas de cualquier lenguaje de programación, el compilador arroja los errores de tiempo de compilación. No permitirán que su programa ejecute una sola línea hasta que elimine todos los errores de sintaxis o hasta que depure los errores de tiempo de compilación.
Ejemplo: Falta un punto y coma en C o escribe mal intcomo Int.

Errores de tiempo de ejecución: los errores de tiempo de ejecución son los errores que se generan cuando el programa está en estado de ejecución. Este tipo de errores hará que su programa se comporte de forma inesperada o incluso pueda matarlo. A menudo se les conoce como excepciones.
Ejemplo: supongamos que está leyendo un archivo que no existe, dará como resultado un error de tiempo de ejecución.

Lea más sobre todos los errores de programación aquí


7

Como complemento de las otras respuestas, así es como se lo explicaría a un laico:

Su código fuente es como el plano de un barco. Define cómo se debe hacer el barco.

Si entrega su plano al astillero, y encuentran un defecto mientras construyen el barco, dejarán de construirlo y se lo informarán de inmediato, antes de que el barco haya abandonado el dique seco o haya tocado agua. Este es un error en tiempo de compilación. La nave nunca estuvo flotando o usando sus motores. El error se encontró porque impidió que incluso se hiciera el barco.

Cuando tu código se compila, es como si se completara la nave. Construido y listo para funcionar. Cuando ejecutas tu código, es como lanzar el barco en un viaje. Los pasajeros están abordados, los motores están funcionando y el casco está en el agua, así que este es el tiempo de ejecución. Si su barco tiene un defecto fatal que lo hunde en su viaje inaugural (o tal vez algún viaje posterior por dolores de cabeza adicionales), entonces sufrió un error de tiempo de ejecución.


5

Por ejemplo: en un lenguaje fuertemente tipado, un tipo podría verificarse en tiempo de compilación o en tiempo de ejecución. En tiempo de compilación significa que el compilador se queja si los tipos no son compatibles. En tiempo de ejecución significa que puede compilar su programa muy bien, pero en tiempo de ejecución arroja una excepción.


4

Simplemente en la diferencia de palabras b / w Tiempo de compilación y tiempo de ejecución.

tiempo de compilación: el desarrollador escribe el programa en formato .java y lo convierte en Bytecode, que es un archivo de clase; durante esta compilación, cualquier error se puede definir como error de tiempo de compilación.

Tiempo de ejecución: la aplicación utiliza el archivo .class generado por su funcionalidad adicional y la lógica resulta ser incorrecta y arroja un error que es un error de tiempo de ejecución


4

Aquí hay una cita de Daniel Liang, autor de 'Introducción a la programación JAVA', sobre el tema de la compilación:

"Un programa escrito en un lenguaje de alto nivel se llama programa fuente o código fuente. Debido a que una computadora no puede ejecutar un programa fuente, un programa fuente debe traducirse al código de máquina para su ejecución . La traducción se puede hacer usando otra herramienta de programación llamada un intérprete o un compilador ". (Daniel Liang, "Introducción a la programación JAVA" , p8).

...Él continúa...

"Un compilador traduce todo el código fuente en un archivo de código de máquina , y luego se ejecuta el archivo de código de máquina"

Cuando introducimos código de alto nivel / legible para humanos, ¡esto es, al principio, inútil! ¡Debe traducirse en una secuencia de 'acontecimientos electrónicos' en su pequeña y pequeña CPU! El primer paso hacia esto es la compilación.

En pocas palabras: un error en tiempo de compilación ocurre durante esta fase, mientras que un error en tiempo de ejecución ocurre más tarde.

Recuerde: el hecho de que un programa se compile sin errores no significa que se ejecutará sin errores.

Se producirá un error en tiempo de ejecución en la parte lista, en ejecución o en espera del ciclo de vida de un programa, mientras que se producirá un error en tiempo de compilación antes de la etapa 'Nueva' del ciclo de vida.

Ejemplo de un error en tiempo de compilación:

Un error de sintaxis: ¿cómo se puede compilar su código en instrucciones a nivel de máquina si son ambiguas? Su código debe ajustarse al 100% a las reglas sintácticas del lenguaje; de ​​lo contrario, no se puede compilar en el código de máquina de trabajo .

Ejemplo de un error en tiempo de ejecución:

Quedarse sin memoria: una llamada a una función recursiva, por ejemplo, puede provocar un desbordamiento de la pila dada una variable de un grado particular. ¿Cómo puede ser anticipado por el compilador? no puede.

Y esa es la diferencia entre un error en tiempo de compilación y un error en tiempo de ejecución


2

El tiempo de ejecución significa que algo sucede cuando ejecuta el programa.

El tiempo de compilación significa que algo sucede cuando compila el programa.


2

Tiempo de compilación:

Las cosas que se hacen en tiempo de compilación no tienen costo (casi) sin costo cuando se ejecuta el programa resultante, pero pueden generar un costo alto cuando se crea el programa. Tiempo de ejecución:

Más o menos exactamente lo contrario. Bajo costo cuando construye, más costo cuando se ejecuta el programa.

Desde el otro lado; Si se hace algo en tiempo de compilación, solo se ejecuta en su máquina y si algo es en tiempo de ejecución, se ejecuta en la máquina de sus usuarios.


2

Tiempo de compilación: el tiempo necesario para convertir el código fuente en un código de máquina para que se convierta en un ejecutable se llama tiempo de compilación.

Tiempo de ejecución: cuando una aplicación se está ejecutando, se llama tiempo de ejecución.

Los errores de tiempo de compilación son aquellos errores de sintaxis, errores de referencia de archivos faltantes. Los errores de tiempo de ejecución ocurren después de que el código fuente se ha compilado en un programa ejecutable y mientras el programa se está ejecutando. Los ejemplos son bloqueos del programa, comportamiento inesperado del programa o características que no funcionan.


2

Imagina que eres un jefe y tienes un asistente y una criada, y les das una lista de tareas para hacer, el asistente (tiempo de compilación) tomará esta lista y hará un chequeo para ver si las tareas son comprensibles y si no escribió en ningún idioma o sintaxis incómoda, por lo que entiende que desea asignar a alguien para un trabajo, por lo que lo asigna a usted y entiende que quiere un café, por lo que su papel terminó y la criada (tiempo de ejecución) comienza a ejecutar esas tareas, así que ella va a prepararte un café, pero de repente no encuentra ningún café que hacer, así que deja de hacerlo o actúa de manera diferente y te prepara un poco de té (cuando el programa actúa de manera diferente porque encontró un error )


1

Aquí hay una extensión de la respuesta a la pregunta "¿diferencia entre tiempo de ejecución y tiempo de compilación?" - ¿Diferencias en los gastos generales asociados con el tiempo de ejecución y el tiempo de compilación?

El rendimiento en tiempo de ejecución del producto contribuye a su calidad al entregar resultados más rápido. El rendimiento en tiempo de compilación del producto contribuye a su puntualidad al acortar el ciclo de edición-compilación-depuración. Sin embargo, tanto el rendimiento en tiempo de ejecución como el rendimiento en tiempo de compilación son factores secundarios para lograr la calidad oportuna. Por lo tanto, uno debe considerar las mejoras en el rendimiento en tiempo de ejecución y en tiempo de compilación solo cuando se justifique por mejoras en la calidad y puntualidad general del producto.

Una gran fuente para leer más aquí :


1

Siempre lo he pensado en relación con la sobrecarga de procesamiento del programa y cómo afecta a la ejecución como se indicó anteriormente. Un ejemplo simple sería definir la memoria absoluta requerida para mi objeto en código o no.

Un booleano definido toma x memoria, esto se encuentra en el programa compilado y no se puede cambiar. Cuando el programa se ejecuta, sabe exactamente cuánta memoria asignar para x.

Por otro lado, si solo defino un tipo de objeto genérico (es decir, un tipo de marcador de posición indefinido o tal vez un puntero a un blob gigante), la memoria real requerida para mi objeto no se conoce hasta que se ejecuta el programa y le asigno algo , por lo tanto, debe evaluarse y la asignación de memoria, etc., se manejará dinámicamente en tiempo de ejecución (más sobrecarga de tiempo de ejecución).

La forma en que se maneja dinámicamente dependería del idioma, el compilador, el sistema operativo, su código, etc.

En esa nota, sin embargo, realmente dependerá del contexto en el que esté utilizando el tiempo de ejecución frente al tiempo de compilación.


1

podemos clasificarlos en diferentes grupos amplios de enlace estático y enlace dinámico. Se basa en cuándo se realiza el enlace con los valores correspondientes. Si las referencias se resuelven en tiempo de compilación, entonces es un enlace estático y si las referencias se resuelven en tiempo de ejecución, entonces es un enlace dinámico. La unión estática y la unión dinámica también se denominan unión temprana y unión tardía. A veces también se les conoce como polimorfismo estático y polimorfismo dinámico.

Joseph Kulandai.


1

La principal diferencia entre el tiempo de ejecución y el tiempo de compilación es:

  1. Si hay errores de sintaxis y verificaciones de tipo en su código, arroja un error de tiempo de compilación, donde-como tiempo de ejecución: comprueba después de ejecutar el código. Por ejemplo:

int a = 1 int b = a/0;

aquí la primera línea no tiene un punto y coma al final ---> error de tiempo de compilación después de ejecutar el programa mientras se realiza la operación b, el resultado es infinito ---> error de tiempo de ejecución.

  1. El tiempo de compilación no busca la salida de la funcionalidad proporcionada por su código, mientras que el tiempo de ejecución sí lo hace.

1

Aquí hay una respuesta muy simple:

El tiempo de ejecución y el tiempo de compilación son términos de programación que se refieren a diferentes etapas del desarrollo de programas de software. Para crear un programa, un desarrollador primero escribe el código fuente, que define cómo funcionará el programa. Los programas pequeños pueden contener solo unos cientos de líneas de código fuente, mientras que los programas grandes pueden contener cientos de miles de líneas de código fuente. El código fuente debe compilarse en código máquina para convertirse en un programa ejecutable. Este proceso de compilación se conoce como tiempo de compilación (piense en un compilador como un traductor)

Un usuario puede abrir y ejecutar un programa compilado. Cuando se ejecuta una aplicación, se llama tiempo de ejecución.

Los términos "tiempo de ejecución" y "tiempo de compilación" suelen ser utilizados por los programadores para referirse a diferentes tipos de errores. Un error de tiempo de compilación es un problema como un error de sintaxis o una referencia de archivo faltante que impide que el programa se compile correctamente. El compilador produce errores de tiempo de compilación y generalmente indica qué línea del código fuente está causando el problema.

Si el código fuente de un programa ya se ha compilado en un programa ejecutable, aún puede tener errores que ocurren mientras el programa se está ejecutando. Los ejemplos incluyen características que no funcionan, comportamiento inesperado del programa o bloqueos del programa. Estos tipos de problemas se denominan errores de tiempo de ejecución ya que se producen en tiempo de ejecución.

La referencia


0

En mi humilde opinión, necesita leer muchos enlaces, recursos para hacer una idea sobre la diferencia entre tiempo de ejecución vs tiempo de compilación porque es un tema muy complejo. Tengo una lista a continuación de algunas de estas imágenes / enlaces que recomiendo.

Además de lo que se dijo anteriormente, quiero agregar que a veces una imagen vale más que 1000 palabras:

  1. el orden de estos dos: primero es el tiempo de compilación y luego ejecuta Un usuario puede abrir y ejecutar un programa compilado. Cuando una aplicación se está ejecutando, se llama tiempo de ejecución: tiempo de compilación y luego tiempo de ejecución1 tiempo de compilación y luego tiempo de ejecución1;

CLR_diag tiempo de compilación y luego runtime2  CLR_diag tiempo de compilación y luego runtime2

 from Wiki  

https://en.wikipedia.org/wiki/Run_time https://en.wikipedia.org/wiki/Run_time_(program_lifecycle_phase)

El tiempo de ejecución, el tiempo de ejecución o el tiempo de ejecución pueden referirse a:

Informática

Tiempo de ejecución (fase del ciclo de vida del programa) , el período durante el cual se ejecuta un programa de computadora

Runtime Library , una biblioteca de programas diseñada para implementar funciones integradas en un lenguaje de programación.

Sistema de tiempo de ejecución , software diseñado para soportar la ejecución de programas de computadora

Ejecución de software, el proceso de realizar instrucciones una por una durante la fase de tiempo de ejecución

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí Lista de compiladores https://en.wikipedia.org/wiki/List_of_compilersingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

  • busque en google y compare los errores de tiempo de ejecución frente a los errores de compilación:

errores de tiempo de ejecución

errores de compilación ;

  1. En mi opinión, es algo muy importante que debe saber: 3.1 la diferencia entre compilar vs compilar y Build Lifecycle https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html

3.2 la diferencia entre estas 3 cosas: compilación vs compilación vs tiempo de ejecución

https://www.quora.com/What-is-the-difference-between-build-run-and-compile Fernando Padoan, un desarrollador que es un poco curioso por el diseño del lenguaje Respondió el 23 de febrero Voy hacia atrás en relación a otras respuestas:

ejecutar es conseguir que un ejecutable binario (o un script, para lenguajes interpretados) sea, bueno ... ejecutado como un nuevo proceso en la computadora; compilar es el proceso de analizar un programa escrito en un lenguaje de alto nivel (más alto en comparación con el código de máquina), verificar su sintaxis, semántica, vincular bibliotecas, tal vez hacer algo de optimización y luego crear un programa ejecutable binario como salida. Este ejecutable puede estar en forma de código de máquina, o algún tipo de código de bytes, es decir, instrucciones dirigidas a algún tipo de máquina virtual; la construcción generalmente implica verificar y proporcionar dependencias, inspeccionar el código, compilar el código en binario, ejecutar pruebas automatizadas y empaquetar los archivos binarios resultantes y otros activos (imágenes, archivos de configuración, bibliotecas, etc.) en algún formato específico de archivo desplegable. Tenga en cuenta que la mayoría de los procesos son opcionales y algunos dependen de la plataforma específica para la que está creando. Como ejemplo, empaquetar una aplicación Java para Tomcat generará un archivo .war. Construir un ejecutable Win32 a partir de código C ++ podría generar el programa .exe o también podría empaquetarlo dentro de un instalador .msi.


0

Mira este ejemplo:

public class Test {

    public static void main(String[] args) {
        int[] x=new int[-5];//compile time no error
        System.out.println(x.length);
    }}

El código anterior se compiló correctamente, no hay error de sintaxis, es perfectamente válido. Pero en el tiempo de ejecución, arroja el siguiente error.

Exception in thread "main" java.lang.NegativeArraySizeException
    at Test.main(Test.java:5)

Al igual que cuando en tiempo de compilación se han verificado ciertos casos, después de ese tiempo de ejecución se han verificado ciertos casos una vez que el programa cumple con todas las condiciones, obtendrá un resultado. De lo contrario, obtendrá un error de tiempo de compilación o tiempo de ejecución.


0

clase pública RuntimeVsCompileTime {

public static void main(String[] args) {

    //test(new D()); COMPILETIME ERROR
    /**
     * Compiler knows that B is not an instance of A
     */
    test(new B());
}

/**
 * compiler has no hint whether the actual type is A, B or C
 * C c = (C)a; will be checked during runtime
 * @param a
 */
public static void test(A a) {
    C c = (C)a;//RUNTIME ERROR
}

}

class A{

}

class B extends A{

}

class C extends A{

}

class D{

}


0

Puede comprender la estructura de compilación del código al leer el código real. La estructura del tiempo de ejecución no está clara a menos que comprenda el patrón que se utilizó.


-1

No es una buena pregunta para SO (no es una pregunta de programación específica), pero no es una mala pregunta en general.

Si crees que es trivial: ¿qué pasa con el tiempo de lectura frente al tiempo de compilación, y cuándo es una distinción útil? ¿Qué pasa con los idiomas donde el compilador está disponible en tiempo de ejecución? Guy Steele (no ficticio, él) escribió 7 páginas en CLTL2 sobre EVAL-WHEN, que los programadores de CL pueden usar para controlar esto. 2 oraciones son apenas suficientes para una definición , que en sí es muy corta para una explicación .

En general, es un problema difícil que los diseñadores de idiomas han intentado evitar. A menudo solo dicen "aquí hay un compilador, hace cosas en tiempo de compilación; todo después de eso es tiempo de ejecución, diviértete". C está diseñado para ser simple de implementar, no el entorno más flexible para la computación. Cuando no tiene el compilador disponible en tiempo de ejecución, o la capacidad de controlar fácilmente cuando se evalúa una expresión, tiende a terminar con hacks en el lenguaje para falsificar los usos comunes de las macros, o los usuarios crean patrones de diseño para simular teniendo construcciones más poderosas. Definitivamente, un lenguaje fácil de implementar puede ser un objetivo valioso, pero eso no significa que sea el final del diseño del lenguaje de programación. (No uso EVAL-WHEN mucho, pero no puedo imaginar la vida sin él).

Y el espacio de problemas en torno al tiempo de compilación y el tiempo de ejecución es enorme y todavía está en gran parte inexplorado. Eso no quiere decir que SO sea el lugar adecuado para debatir, pero aliento a las personas a explorar más este territorio, especialmente a aquellos que no tienen nociones preconcebidas de lo que debería ser. La pregunta no es simple ni tonta, y al menos podríamos señalar al inquisidor en la dirección correcta.

Desafortunadamente, no conozco buenas referencias sobre esto. CLTL2 habla un poco sobre eso, pero no es genial para aprender sobre eso.


44
amigo, lo que no es una buena pregunta de programación es relativo. Pensé que era una excelente pregunta y algo sobre lo que quería aprender más. Sí, conozco el "concepto" general y qué tiempo de compilación y tiempo de ejecución son, pero quiero saber las intrincaciones que suceden realmente en el tiempo de ejecución frente al tiempo de compilación. Son esas intrigas las que importan cuando se programa y deben ser conscientes. No es muy concreto, por eso pregunta. Odio cuando las personas se sientan aquí y dicen que preguntas generales como esta no tienen ningún valor cuando son algunas de las preguntas más importantes para cualquier desarrollador.
PositiveGuy

1
Si no ve valor en una pregunta, ese es su problema. Si es general, hay una razón para ello. El hecho de que no te gusten las preguntas generales no significa que el mundo gira en torno a lo que crees que es útil. Tiene una cierta intención de preguntar esto y quiere una variedad de respuestas para comprender mejor y definir ambas. ¿Consíguelo?
PositiveGuy
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.