¿Cuáles son las diferencias y similitudes entre varios términos como archivo de objeto, ejecutable, enlace dinámico, carga dinámica, tiempo de ejecución, tiempo de carga y tiempo de compilación?

Mientras escribo esta respuesta, supongo que el lector tiene conocimientos básicos de programación.

Algunas definiciones pueden no ser descriptivas, pero son lo suficientemente buenas para nuestros propósitos aquí:
Unidad central de procesamiento (o CPU, o procesador) es el término utilizado para indicar la pieza de silicio responsable del trabajo computacional. Principalmente se compone de interruptores electrónicos (llamados transistores) que son los bloques de construcción de las puertas lógicas. Estas puertas lógicas son la unidad básica de todos los módulos de cómputo en una CPU.
– Las instrucciones de la máquina son lo que la CPU entiende. Le permite a la CPU saber qué subunidades del procesador deben ser ‘invocadas’ y dónde (y cómo) leer los datos a ser ‘procesados’ por esas subunidades.
Scheduler es un componente de los sistemas operativos (SO, por ejemplo, Windows, Linux, Unix, VxWorks) que se encarga de proporcionar a la CPU las instrucciones de la máquina presentes en la memoria del sistema (RAM) para su consumo.
– El compilador convierte (traduce) las instrucciones de programación escritas por el programador (llamadas código fuente , generalmente escritas en lenguajes de programación basados ​​en inglés, por ejemplo, C / C ++) en instrucciones de máquina. Por lo general, el compilador funciona en cada ‘archivo’ de código fuente.
Linker es responsable de ‘fusionar’ la salida del compilador de varios archivos fuente en una sola salida, que puede ser utilizada por el Linker en etapas posteriores, o puede ser utilizada por el sistema operativo para ‘instruir’ al hardware.
Loader es lo que ayuda a un sistema operativo a leer las instrucciones de la máquina (de la salida del enlazador) y las almacena en la RAM para un acceso rápido por el programador del sistema operativo

Pasando a los términos solicitados en cuestión ahora:
– los archivos de objetos (en lenguajes basados ​​en compiladores, por ejemplo, C / C ++) son la salida del compilador. Estos contienen principalmente las instrucciones de la máquina generadas al ‘descomponer’ la fuente del lenguaje de programación de alto nivel en instrucciones de la máquina.
Como se señaló anteriormente, el compilador funciona en archivos fuente únicos (llamados ‘unidades’). Para evitar la complejidad al escribir el código fuente, es preferible dividir el código fuente en unidades que están “agregadas lógicamente”. Sin embargo, es muy posible que una unidad se refiera (o utilice la funcionalidad de) una parte del código fuente escrito en otra unidad. Para facilitar este comportamiento, el compilador permite (con un cierto conjunto de reglas) que el programador ‘omita’ alguna parte del código. Una buena analogía sería cómo un autor agregaría una nota al pie / cita / referencias cruzadas a cierto párrafo en un libro – hasta que el libro esté encuadernado e impreso, los ‘números de página’ de la nota al pie y el párrafo no están finalizados . Del mismo modo, el compilador genera las instrucciones de máquina ‘incompletas’, que tienen las construcciones para indicar ‘referencias’. Es el trabajo de Linker resolver estas ‘referencias’ de manera apropiada mientras se fusionan los objetos. Después de la resolución de las referencias, un Linker puede generar un ‘objeto reubicable’ (que Linker puede usar simplemente como si fuera generado por el compilador), un ‘ejecutable’ o un ‘objeto dinámico’
– Un ejecutable contiene las instrucciones de la máquina que el sistema operativo puede ‘enviar’ a la CPU. Un ejecutable puede estar enlazado estáticamente o enlazado dinámicamente.
Un ejecutable vinculado estáticamente tiene el conjunto completo de instrucciones de máquina que necesitaría el planificador del sistema operativo mientras ‘despacha’ el ejecutable a la CPU. Todo lo que el sistema operativo (planificador) debe hacer es leer las instrucciones (de la (s) ubicación (es) de memoria relativa (s) especificadas dentro del ejecutable) y entregarlas a la CPU para procesarlas cuando sea necesario.
Para comprender un ejecutable vinculado dinámicamente , es importante comprender los objetos dinámicos , que son como ejecutables vinculados estáticamente en estructura, pero con una diferencia importante: otros ejecutables pueden ‘pedir’ que este tipo especial de objeto ‘se ejecute sus instrucciones de máquina ‘cuando el ejecutable lo solicita.
Una buena analogía será cocinar: si necesita puré de tomate mientras prepara un plato, puede lavar + picar + mezclar los tomates usted mismo, o puede ‘pedir’ a alguien más que lo prepare para usted y se lo dé cuando lo necesitas mientras te concentras en tu plato. Sería instructivo pensar en un “objeto dinámico” como una ayuda doméstica que prepara puré, puré de papas, muele especias, etc. para usted y se los entrega “a pedido” mientras se concentra en preparar los platos. Al igual que dos (o más) chefs pueden aprovechar una sola ayuda doméstica mientras preparan platos separados, varios ejecutables diferentes pueden pedirle al sistema operativo que ejecute instrucciones de máquina desde objetos dinámicos cuando así lo requieran. Esto reduce considerablemente el esfuerzo que un programador debe hacer para escribir un programa, ya que puede usar la funcionalidad común de los objetos dinámicos. Dichos ejecutables, que dependen de instrucciones de máquina presentes en objetos dinámicos, se denominan ejecutables vinculados dinámicamente.
La carga dinámica es una característica especial que proporciona un módulo Loader del sistema operativo: permite que los ejecutables vinculados dinámicamente carguen / descarguen objetos dinámicos dentro / fuera de la memoria del sistema cuando sea necesario. Esto ayuda a mantener el uso de la memoria del sistema de un ejecutable vinculado dinámicamente a un valor inferior al que habría sido necesario si todos los objetos dinámicos necesarios para el ejecutable se cargaran en la memoria del sistema a la vez.
Compilar / Cargar / Tiempo de ejecución define varias etapas en las que se define / crea una determinada construcción de programación.
Como analogía, considere unas vacaciones en un país extranjero.
Si planifica su itinerario mucho antes de que comiencen sus vacaciones (incluido qué comer, cuándo y dónde), sería equivalente a definir una construcción de programación (por ejemplo, una rama de código) en tiempo de compilación , ya que sabe qué rama de código para tomar en el momento de la creación ejecutable (antes de que comiencen sus vacaciones, según la analogía). La desventaja de tal estrategia es que, a veces, el usuario del ejecutable puede querer controlar el comportamiento del ejecutable según sus ‘deseos’; por ejemplo, puede que le guste un lugar turístico más de lo que esperaba y desearía quedarse más tiempo lo habrías planeado, pero un itinerario rígido no te permitiría hacerlo sin afectar el resto de tus planes para el día.
Si bien la definición de los componentes de programación en tiempo de compilación tiene sus ventajas, por lo general, los programas (código fuente) escritos de esta manera serán los más rápidos. La definición de todas las construcciones de programación posibles en tiempo de compilación afecta gravemente la usabilidad de un ejecutable. Por lo tanto, se recomienda que algunas construcciones de programación se definan en tiempo de carga y / o tiempo de ejecución . Esto permite que las construcciones de programación adquieran valores cuando sus instrucciones de máquina se copian en la memoria del sistema ( tiempo de carga ) o mientras el programador del sistema operativo ( tiempo de ejecución ) las programa. En nuestra analogía de vacaciones, esto significa ‘diferir’ algunas decisiones que se tomarán una vez que comiencen las vacaciones (tiempo de carga), o cuando esté EN vacaciones (tiempo de ejecución).
Por lo general, hacer que una construcción de programación sea configurable en tiempo de compilación logra tiempos de ejecución más rápidos, con la configuración de tiempo de ejecución más lenta (y el tiempo de carga en algún punto intermedio). Por el contrario, por lo general, la definición de construcciones en tiempo de ejecución permite una configuración más flexible, mientras que la definición de construcción en tiempo de compilación no es configurable en absoluto (de nuevo, siendo el tiempo de carga intermedio). Dependiendo del uso previsto de un ejecutable, se definen diferentes construcciones de programación al compilar / cargar / tiempo de ejecución para lograr un equilibrio perfecto entre la velocidad de ejecución y la configurabilidad.

More Interesting

¿Los trabajadores de la industria financiera serán reemplazados por IA (aprendizaje automático)?

¿De qué sirve una cámara en una máquina?

¿El aprendizaje automático para IoT será mayor que PNL en los próximos 5 años?

¿Por qué la inducción es más omnipresente que cualquier otra técnica de prueba en informática y lógica matemática?

¿Puede un modelo de aprendizaje automático utilizar múltiples algoritmos como la regresión logística, las redes neuronales y los árboles de decisión al mismo tiempo?

¿Cuáles son los últimos desafíos de la informática de alto rendimiento?

¿Cuál es la necesidad de la computación paralela?

¿Vale la pena la escuela de verano Wolfram si no te gusta el libro "Un nuevo tipo de ciencia"?

¿Quiénes son los mejores investigadores en aprendizaje profundo y / o aprendizaje de refuerzo que trabajan principalmente en una universidad (no en la industria)?

¿Cuándo surgirá el anti-nube (almacenamiento local infinito ... vas a la nube solo para obtener información del sensor en tiempo real)?

¿Cómo es tomar una clase en línea de Stanford CS, como ml-class o ai-class?

¿Alguien ha integrado Scrum con un método de cascada tradicional como PRINCE2 o PMP? ¿Qué tan exitosos han sido tus intentos?

¿Cómo ocurre la segunda violación de contraseña en Yahoo después de la primera? ¿Yahoo pierde su popularidad?

¿Para qué sirve un bus de expansión en la arquitectura de bus?

¿Cuál es la relación entre Big Data, Cloud computing y NOSQL?