Respuestas:
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
Lo que puede salir mal son los errores de tiempo de ejecución :
También puede haber errores detectados por el propio programa:
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
.app
extensión? ¿O sucede al iniciar cada vez que el usuario inicia la aplicación?
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?
int x = 3/0
pero no hace nada con esta variable. No lo imprimimos ni nada. ¿Eso todavía se considerará un error de tiempo de ejecución?
( 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
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):
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)):
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).
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.
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.
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.
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.
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 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 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í
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.
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.
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
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
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.
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.
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 )
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í :
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.
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.
La principal diferencia entre el tiempo de ejecución y el tiempo de compilación es:
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.
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.
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:
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
Lista de compiladores https://en.wikipedia.org/wiki/List_of_compilers
;
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.
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.
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{
}
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.