runtime - proyecto - Tiempo de ejecución vs tiempo de compilación
tipos de compilacion (25)
¿Puede alguien, por favor, darme una buena comprensión de cuál es la diferencia entre el tiempo de ejecución y el tiempo de compilación?
En simplemente la diferencia de palabras b / w Compile time & Run time.
tiempo de compilación: el desarrollador escribe el programa en formato .java y lo convierte en el Bytecode que es un archivo de clase; durante esta compilación, cualquier error que ocurra puede definirse como error de tiempo de compilación.
Tiempo de ejecución: la aplicación utiliza el archivo .class generado para su funcionalidad adicional y la lógica resulta ser incorrecta y arroja un error que es un error de tiempo de ejecución
Tiempo de compilación:
Las cosas que se hacen en tiempo de compilación incurren (casi) sin costo cuando se ejecuta el programa resultante, pero pueden incurrir en un gran costo al construir el programa.
Tiempo de ejecución:
Más o menos exactamente lo contrario. Poco costo cuando construyes, más costo cuando el programa se ejecuta.
Desde el otro lado; Si algo se hace en tiempo de compilación, se ejecuta solo en su máquina y si algo es tiempo de ejecución, se ejecuta en la máquina de sus usuarios.
Pertinencia
Un ejemplo de dónde esto es importante sería un tipo de unidad de transporte. Una versión de 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 de punto flotante nativo, mientras que una versión de tiempo de ejecución tiene que empaquetar información sobre las unidades que un valor tiene en y realizar controles en ellos junto a cada operación. Por otro lado, las versiones de tiempo de compilación requieren que las unidades de los valores se conozcan en tiempo de compilación y no puedan manejar el caso en el que provienen de la entrada en tiempo de ejecución.
( edición : lo siguiente se aplica a C # y lenguajes de programación similares, fuertemente tipados. No estoy seguro de si esto te ayuda).
Por ejemplo, el compilador (en el momento de la compilación ) detectará el siguiente error antes de ejecutar un programa y generará un error de compilación:
int i = "string"; --> error at compile-time
Por otro lado, un compilador no puede detectar un error como el siguiente. Recibirá un error / excepción en tiempo de ejecución (cuando se ejecute 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
Aparte de lo que se dice más arriba, quiero agregar que a veces una imagen vale más que 1000 palabras:
- el orden de estos dos: primero es el tiempo de compilación y luego se 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 ;
CLR_diag compila el tiempo y luego runtime2
- busca en google y compara errores de tiempo de ejecución contra errores de compilación:
;
- En mi opinión, una cosa muy importante que se debe saber: 3.1 la diferencia entre compilación vs compilación y el ciclo de vida de la compilación https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html
3.2 la diferencia entre estas 3 cosas: compilar vs construir vs tiempo de ejecución
https://www.quora.com/What-is-the-difference-between-build-run-and-compile Fernando Padoan, un desarrollador que es solo un poco curioso para el diseño de lenguaje Respondido el 23 de febrero Estoy retrocediendo en relación a otras respuestas:
correr 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 si se compara con el código de la máquina), verificar su sintaxis, semántica, vincular bibliotecas, tal vez realizar una 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 byte, 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 las [...] binarias 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 de destino para la que está construyendo. Como ejemplo, al empaquetar una aplicación Java para Tomcat se generará un archivo .war. La creación de 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.
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 a un archivo de código de máquina , y luego se ejecuta el archivo de código de máquina"
Cuando introducimos un código de alto nivel / legible para humanos, ¡esto es, al principio, inútil! ¡Debe traducirse en una secuencia de "sucesos electrónicos" en su pequeña CPU! El primer paso hacia esto es la compilación.
En pocas palabras: un error de tiempo de compilación ocurre durante esta fase, mientras que un error de 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 preparada, en ejecución o en espera de un ciclo de vida de los programas, 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 un código de máquina que funcione.
Ejemplo de un error en tiempo de ejecución:
Quedarse sin memoria - ¡Una llamada a una función recursiva, por ejemplo, podría llevar a un desbordamiento de pila dada una variable de un grado particular! ¿Cómo puede esto 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
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 ofrecer resultados más rápidamente. 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 una calidad oportuna. Por lo tanto, uno debe considerar las mejoras en el tiempo de ejecución y en el tiempo de compilación solo cuando esté justificado por mejoras en la calidad y puntualidad general del producto.
Una gran fuente para leer más here :
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 solo pueden contener unos pocos 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 programa compilado puede ser abierto y ejecutado por un usuario. Cuando una aplicación se está ejecutando, se llama tiempo de ejecución.
Los términos "tiempo de ejecución" y "tiempo de compilación" son a menudo 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, es posible que todavía tenga errores que se producen mientras se ejecuta el programa. Los ejemplos incluyen funciones 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 ocurren en tiempo de ejecución.
Básicamente, si su compilador puede determinar lo que quiere decir o lo que un valor es "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 que se ejecutará más lento, por lo que si puede determinar algo en el momento de la 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 ahorra de realizar un cálculo en cada ejecución.
Como un complemento a las otras respuestas, así es como se lo explico a un lego:
Tu 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 encuentra un defecto mientras construye el barco, dejará de construirlo y le informará inmediatamente 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 ni siquiera estaba realmente flotando o usando sus motores. Se encontró el error porque impidió que la nave se hiciera.
Cuando tu código se compila, es como si el barco se completara. Construido y listo para funcionar. Cuando ejecutas tu código, es como lanzar el barco en un viaje. Los pasajeros son abordados, los motores están en marcha y el casco está en el agua, por lo que este es el tiempo de ejecución. Si su nave tiene un defecto fatal que la hunde en su viaje inaugural (o quizás algún viaje después de dolores de cabeza adicionales), entonces sufrió un error de tiempo de ejecución.
El tiempo de ejecución significa que algo sucede cuando ejecutas el programa.
El tiempo de compilación significa que algo sucede cuando compilas el programa.
Hmm, bueno, bueno, el tiempo de ejecución se usa para describir algo que ocurre cuando se ejecuta un programa.
El tiempo de compilación se utiliza para describir algo que ocurre cuando se está construyendo un programa (generalmente, por un compilador).
La diferencia entre el tiempo de compilación y el tiempo de ejecución es un ejemplo de lo que los teóricos de cabeza puntiaguda llaman distinción de fase . Es uno de los conceptos más difíciles de aprender, especialmente para personas sin conocimientos de programación. Para abordar este problema, me resulta útil preguntar.
- ¿Qué invariantes satisface el programa?
- ¿Qué puede salir mal en esta fase?
- Si la fase tiene éxito, ¿cuáles son las condiciones posteriores (qué sabemos)?
- ¿Cuáles son las entradas y salidas, si las hay?
Tiempo de compilación
- El programa no necesita satisfacer a los invariantes. De hecho, no necesita ser un programa bien formado en absoluto. Puedes alimentar este HTML al compilador y verlo barf ...
- ¿Qué puede salir mal en el momento de la compilación?
- Errores de sintaxis
- Errores de comprobación de tipo
- (Rara vez) el compilador se bloquea
- 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).
- ¿Cuáles son las entradas y salidas?
- La entrada era el programa que se estaba compilando, más cualquier archivo de encabezado, interfaces, bibliotecas u otro vudú que necesitaba importar para poder compilarlo.
- Se espera que la salida sea un código de ensamblaje o un código de objeto reubicable o incluso un programa ejecutable. O si algo sale mal, la salida es un conjunto de mensajes de error.
Tiempo de ejecución
- No sabemos nada acerca de las invariantes del programa, son lo que sea que el programador haya instalado. Rara vez los forzadores ejecutan las invariantes en tiempo de ejecución; Necesita ayuda del programador.
Lo que puede salir mal son los errores en tiempo de ejecución :
- División por cero
- Desreferenciación de un puntero nulo
- Quedarse sin memoria
También puede haber errores que son detectados por el propio programa:
- Tratando de abrir un archivo que no está ahí
- Intentar encontrar una página web y descubrir que una supuesta URL no está bien formada
- Si el tiempo de ejecución es satisfactorio, el programa finaliza (o continúa) sin fallar.
- Las entradas y salidas están totalmente a cargo del programador. Archivos, ventanas en la pantalla, paquetes de red, trabajos enviados a la impresora, nombre. Si el programa lanza misiles, eso es una salida, y ocurre solo en tiempo de ejecución :-)
La principal diferencia entre el tiempo de ejecución y el tiempo de compilación es:
- Si hay algún error de sintaxis y verificaciones de tipo en su código, entonces arroja un error de tiempo de compilación, tiempo de ejecución: lo verifica 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.
- El tiempo de compilación no busca el resultado de la funcionalidad proporcionada por su código, mientras que el tiempo de ejecución sí lo hace.
La traducción del código fuente a cosas que suceden en la [red | disco | red] puede ocurrir (aproximadamente) de dos maneras; Llámalos compilando e interpretando.
En un programa compilado (los ejemplos son c y fortran):
- El código fuente se alimenta a otro programa (generalmente llamado compilador - vaya figura), que produce un programa ejecutable (o un error).
- El ejecutable se ejecuta (haciendo doble clic en él o escribiendo su nombre en la línea de comandos)
Las cosas que suceden en el primer paso se dice que suceden en "tiempo de compilación", las cosas que suceden en el segundo paso se dice que suceden en "tiempo de ejecución".
En un programa interpretado (ejemplo: MicroSoft basic (on dos) y python (creo)):
- 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 más difícil de precisar, y mucho menos relevante para el programador o el usuario.
Java es un tipo de híbrido, donde el código se compila a 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 a bytecode y se ejecuta inmediatamente (como en awk o perl).
Lo pienso en términos de errores, y cuando pueden ser atrapados.
Tiempo de compilación:
string my_value = Console.ReadLine();
int i = my_value;
A un valor de cadena no se le puede asignar una variable de tipo int, por lo que el compilador sabe con seguridad 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 en un int, otros no. Esto solo se puede determinar en tiempo de ejecución
Mira en este ejemplo:
Prueba de clase pública {
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 compila correctamente, no hay error de sintaxis, es perfectamente válido. Pero en el tiempo de ejecución se produce 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 comprobado ciertos casos, después de ese tiempo de ejecución se han comprobado ciertos casos una vez que el programa cumple todas las condiciones en que se obtendrá una salida. De lo contrario, obtendrá tiempo de compilación o error de tiempo de ejecución.
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 esta una distinción útil para hacer? ¿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í misma está muy lejos de ser una explicación .
En general, es un problema difícil que los diseñadores de idiomas han tratado de evitar. A menudo solo dicen "aquí hay un compilador, hace cosas de 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 tienes el compilador disponible en tiempo de ejecución, o la capacidad de controlar fácilmente cuando se evalúa una expresión, tiendes a terminar con hacks en el lenguaje para falsificar usos comunes de macros, o los usuarios crean patrones de diseño para simular Tener construcciones más potentes. Definitivamente, un lenguaje simple de implementar puede ser un objetivo que vale la pena, pero eso no significa que sea el fin del diseño del lenguaje de programación. (No uso mucho EVAL-WHEN, 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 aún en gran parte inexplorado. Eso no quiere decir que SO sea el lugar adecuado para tener la discusión, 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 apuntar al inquisidor en la dirección correcta.
Desafortunadamente, no conozco ninguna buena referencia sobre esto. CLTL2 habla un poco sobre eso, pero no es bueno para aprender sobre eso.
Podemos clasificarlos en dos grupos diferentes: enlace estático y enlace dinámico. Se basa en cuando el enlace se realiza 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.
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 bien, pero en tiempo de ejecución, lanza una excepción.
Siempre lo he pensado en relación con la sobrecarga de procesamiento del programa y cómo afecta el rendimiento como se indicó anteriormente. Un ejemplo simple sería definir la memoria absoluta requerida para mi objeto en el código o no.
Un booleano definido toma x memoria, está entonces 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 acabo de definir un tipo de objeto genérico (es decir, una especie de marcador de posición indefinido o tal vez un puntero a algún 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, luego se debe evaluar y la asignación de memoria, etc. se manejará de forma dinámica en el 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.
Siguiendo de la respuesta anterior de una pregunta similar, ¿cuál es la diferencia entre el error en tiempo de ejecución y el error del compilador?
Compilación / Tiempo de compilación / Sintaxis / Errores semánticos: Los errores de compilación o tiempo de compilación son errores ocurridos debido a un error de escritura, si no seguimos la sintaxis y la semántica adecuadas de cualquier lenguaje de programación, el compilador genera errores de tiempo de compilación. No dejarán que tu programa ejecute una sola línea hasta que elimines todos los errores de sintaxis o hasta que depures los errores de tiempo de compilación.
Ejemplo: falta un punto y coma en C o se escribe int
como Int
.
Errores de tiempo de ejecución: los errores de tiempo de ejecución son los errores que se generan cuando el programa se encuentra en estado de ejecución. Estos tipos de errores causarán que su programa se comporte de manera inesperada o incluso pueden anular su programa. A menudo son referidos como Excepciones.
Ejemplo: Supongamos que está leyendo un archivo que no existe, se producirá un error de tiempo de ejecución.
Lea más sobre todos los errores de programación aquí
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 denomina tiempo de compilación.
Tiempo de ejecución: cuando una aplicación se está ejecutando, se denomina tiempo de ejecución.
Los errores de tiempo de compilación son esos errores de sintaxis, faltan errores de referencia de archivos. Los errores de tiempo de ejecución ocurren después de que el código fuente se haya compilado en un programa ejecutable y mientras el programa se está ejecutando. Algunos ejemplos son los bloqueos del programa, el comportamiento inesperado del programa o las características no funcionan.
Tiempo de compilación:
Las cosas que se hacen en tiempo de compilación incurren (casi) sin costo cuando se ejecuta el programa resultante, pero pueden incurrir en un gran costo al construir el programa. Tiempo de ejecución:
Más o menos exactamente lo contrario. Poco costo cuando construyes, más costo cuando el programa se ejecuta.
Desde el otro lado; Si algo se hace en tiempo de compilación, se ejecuta solo en su máquina y si algo es tiempo de ejecución, se ejecuta en la máquina de sus usuarios.
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 está ejecutando su software.
¿Necesita una definición más clara?
Tiempo de ejecución vs tiempo de compilación
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.
El tiempo de compilación es la instancia en la que el código que ingresó se convierte en ejecutable, mientras que el tiempo de ejecución es la instancia en la que se ejecuta el ejecutable.
Los términos "tiempo de ejecución" y "tiempo de compilación" a menudo son utilizados por los programadores para referirse a diferentes tipos de errores también.
La verificación en tiempo de compilación ocurre durante el tiempo de compilación. Los errores de tiempo de compilación se producen debido a un error de escritura, si no seguimos la sintaxis y la semántica adecuadas de cualquier lenguaje de programación, el compilador genera errores de tiempo de compilación. No dejarán que tu programa ejecute una sola línea hasta que elimines todos los errores de sintaxis o hasta que depures los errores de tiempo de compilación.
Los siguientes son errores de tiempo de compilación habituales:
Errores de sintaxis
Errores de comprobación de tipo
El compilador se bloquea (Raramente)
La verificación de tipos en tiempo de ejecución ocurre durante el tiempo de ejecución de los programas. Los errores de tiempo de ejecución son los errores que se generan cuando el programa se encuentra en estado de ejecución. Estos tipos de errores causarán que su programa se comporte de manera inesperada o incluso pueden anular su programa. A menudo son referidos como Excepciones. los
Los siguientes son algunos errores de tiempo de ejecución habituales:
División por cero
Desreferenciación de un puntero nulo
Quedarse sin memoria