trabajen software sistemas qué que programas programación programacion partes paradigma operativos manera linkers ligadores ligador ligado juntas funcionamiento enlazadores enlazador ejemplos dinamico desarrollo depuradores controlan computador compilador codigo cargador actividad compiler-construction linker terminology loader

compiler construction - software - ¿Qué es el compilador, el enlazador, el cargador?



software de desarrollo enlazadores (14)

Quería saber en profundidad el significado y el funcionamiento del compilador, el enlazador y el cargador. Con referencia a cualquier idioma preferiblemente c ++.


Compilador:

Leerá el archivo fuente que puede ser de tipo .c o .cpp, etc. y lo traducirá a un archivo .o llamado archivo de objeto.

Enlazador:

Combina los diversos archivos .o que pueden generarse para múltiples archivos fuente en un archivo ejecutable (formato ELF en GCC). Hay dos tipos de enlaces:

  • enlace estático
  • enlace dinámico

Cargador:

Un programa que carga el archivo ejecutable a la memoria primaria de la máquina.

Para un estudio en detalle sobre estas tres etapas de ejecución del programa en Linux, lea esto .


*

explicado con respecto a los sistemas basados ​​en Linux / Unix, aunque es un concepto básico para todos los demás sistemas informáticos.

*

Enlazadores y cargadores de LinuxJournal explica este concepto con claridad. También explica cómo llegó el nombre clásico a.out. (salida del ensamblador)

Un resumen rápido,

c program --> [compiler] --> objectFile --> [linker] --> executable file (say, a.out)

tenemos el ejecutable, ahora dale este archivo a tu amigo o a tu cliente que necesita este software :)

cuando ejecuten este software, digíquenlo en la línea de comando ./a.out

execute in command line ./a.out --> [Loader] --> [execve] --> program is loaded in memory

Una vez que el programa se carga en la memoria, el control se transfiere a este programa haciendo que la PC (contador de programas) apunte a la primera instrucción de a.out


Compilador: es un programa que traduce un programa de lenguaje de alto nivel a un programa de lenguaje de máquina. Un compilador es más inteligente que un ensamblador. Comprueba todo tipo de límites, rangos, errores, etc. Pero el tiempo de ejecución del programa es mayor y ocupa una parte más grande de la memoria. Tiene velocidad lenta. Porque un compilador recorre todo el programa y luego traduce todo el programa en códigos de máquina. Si un compilador se ejecuta en una computadora y produce los códigos de máquina para la misma computadora, entonces se conoce como compilador automático o compilador residente. Por otro lado, si un compilador se ejecuta en una computadora y produce los códigos de la máquina para otra computadora, entonces se conoce como compilador cruzado.

Enlazador: en los lenguajes de alto nivel, se almacenan algunos archivos de encabezado integrados o bibliotecas. Estas bibliotecas están predefinidas y contienen funciones básicas que son esenciales para ejecutar el programa. Estas funciones están vinculadas a las bibliotecas por un programa llamado Linker. Si el vinculador no encuentra una biblioteca de una función, informa al compilador y luego el compilador genera un error. El compilador invoca automáticamente al enlazador como el último paso en la compilación de un programa. No está construido en bibliotecas, sino que también vincula las funciones definidas por el usuario a las bibliotecas definidas por el usuario. Por lo general, un programa más largo se divide en subprogramas más pequeños llamados módulos. Y estos módulos se deben combinar para ejecutar el programa. El proceso de combinación de los módulos lo realiza el vinculador.

Loader: Loader es un programa que carga códigos de máquina de un programa en la memoria del sistema. En Computación, un cargador es la parte de un sistema operativo que se encarga de cargar programas. Es una de las etapas esenciales en el proceso de comenzar un programa. Porque coloca los programas en la memoria y los prepara para su ejecución. Cargar un programa implica leer el contenido del archivo ejecutable en la memoria. Una vez que se completa la carga, el sistema operativo inicia el programa pasando el control al código del programa cargado. Todos los sistemas operativos que admiten carga de programa tienen cargadores. En muchos sistemas operativos, el cargador reside permanentemente en la memoria.


Compilador: es un software de sistema que corrige el error de programas, archivos de objetos, mensajes, etc.

Enlazador: es un software de sistema que combina Uno o más archivos de objetos y posible código de biblioteca en alguna biblioteca exicable o en una lista de errores

Loader: un programa que carga el archivo ejecutable a la memoria primaria de la máquina


Espero que esto te ayude un poco más.

Primero, repase este diagrama:

(img source->internet)

Usted hace una pieza de código y guarda el archivo (código fuente), luego

Preprocesamiento : como su nombre indica, no forma parte de la compilación. Instruyen al compilador para que haga el procesamiento previo requerido antes de la compilación real. Puede llamar a esta fase Sustitución de texto o interpretar directivas especiales de preprocesador denotadas por #.

Compilación : la compilación es un proceso en el que un programa escrito en un idioma se traduce a otro idioma de destino. Si hay algunos errores, el compilador los detectará e informará.

Ensamblar : - El código ensamblado se traduce a código máquina. Puede llamar al ensamblador un tipo especial de compilador.

Vinculación : si este fragmento de código necesita algún otro archivo de origen para vincularse, el vinculador los vincula para convertirlo en un archivo ejecutable.

Hay muchos procesos que suceden después. Sí, lo has adivinado aquí viene el papel del cargador:

Cargador : carga el código ejecutable en la memoria; Se crean el programa y la pila de datos, el registro se inicializa.

Poco información adicional: - http://www.geeksforgeeks.org/memory-layout-of-c-program/ , puede ver el diseño de la memoria allí.


Sistema operativo: un sistema operativo (SO) es un software de sistema que administra los recursos de hardware y software de la computadora y proporciona servicios comunes para los programas de computadora. El sistema operativo es un componente del software del sistema en un sistema informático. Los programas de aplicación generalmente requieren un sistema operativo para funcionar.

Compilador: un compilador es un programa de computadora (o un conjunto de programas) que transforma el código fuente escrito en un lenguaje de programación (el idioma de origen) en otro lenguaje informático (el idioma de destino), y este último a menudo tiene una forma binaria conocida como objeto código.

Intérprete: intérprete es un programa de computadora que ejecuta directamente, es decir realiza, instrucciones escritas en un lenguaje de programación o guiones, sin compilarlas previamente en un programa de lenguaje de máquina.

Ensamblador: Un ensamblador es un programa que toma instrucciones básicas de la computadora y las convierte en un patrón de bits que el procesador de la computadora puede usar para realizar sus operaciones básicas.

Cargador: un cargador es la parte de un sistema operativo que se encarga de cargar programas y bibliotecas. Es una de las etapas esenciales en el proceso de iniciar un programa, ya que coloca los programas en la memoria y los prepara para su ejecución.

Linker: linker es un programa que combina módulos de objeto para formar un programa ejecutable.

Preprocesador: el preprocesador es una herramienta de sustitución de texto que ordena al compilador realizar el procesamiento previo requerido antes de la compilación real.


Un compilador es un programa de software que compila los archivos de código fuente del programa en un programa ejecutable. Se incluye como parte del entorno de desarrollo integrado IDE con la mayoría de los paquetes de software de programación. El compilador toma los archivos de código fuente que están escritos en un lenguaje de alto nivel, como C, BASIC o Java, y compila el código en un lenguaje de bajo nivel, como el código de máquina o el código de ensamblaje. Este código se crea para un tipo de procesador específico, como Intel Pentium o PowerPC. El programa puede ser reconocido por el procesador y ejecutarse desde el sistema operativo.

Loader es una utilidad de sistema operativo que copia programas desde un dispositivo de almacenamiento a la memoria principal, donde se pueden ejecutar. Además de copiar un programa en la memoria principal, el cargador también puede reemplazar direcciones virtuales con direcciones físicas. La mayoría de los cargadores son transparentes, es decir, no se pueden ejecutar directamente, pero el sistema operativo los usa cuando es necesario.

Enlazador Es un programa que ajusta dos o más segmentos del programa de máquina de modo que puedan cargarse y ejecutarse simultáneamente como una unidad. También llamado editor de enlaces y encuadernador, un engarce es un programa que combina módulos de objeto para formar un programa ejecutable. Muchos lenguajes de programación le permiten escribir diferentes pedazos de código, llamados módulos, por separado. Esto simplifica la tarea de programación porque puede dividir un programa grande en piezas pequeñas y más manejables. Eventualmente, sin embargo, necesitas unir todos los módulos. Este es el trabajo del enlazador.


Un compilador es un programa especial que procesa declaraciones escritas en un lenguaje de programación particular y las convierte en lenguaje de máquina o "código" que usa el procesador de una computadora.


Wikipedia debería tener una buena respuesta, aquí están mis pensamientos:

  • Compilador: lee algo.c fuente, escribe algo.o objeto.
  • Linker: une varios archivos * .o en un programa ejecutable.
  • Loader: código que carga un ejecutable en la memoria y lo inicia en ejecución.

los cambios en el compilador verifican su código fuente en busca de errores y lo cambia a código objeto. Este es el código que ejecuta el sistema operativo.

A menudo no escribe un programa completo en un solo archivo, por lo que el vinculador vincula todos los archivos de código objeto.

su programa no se ejecutará a menos que esté en la memoria principal


Un compilador traduce líneas de código del lenguaje de programación al lenguaje de la máquina.

Un Enlazador crea un enlace entre dos programas.

Un cargador carga el programa en la memoria en la base de datos principal, programa, etc.


=====> COMPILATION PROCESS <====== | |----> Input is Source file(.c) | V +=================+ | | | C Preprocessor | | | +=================+ | | ---> Pure C file ( comd:cc -E <file.name> ) | V +=================+ | | | Lexical Analyzer| | | +-----------------+ | | | Syntax Analyzer | | | +-----------------+ | | | Semantic Analyze| | | +-----------------+ | | | Pre Optimization| | | +-----------------+ | | | Code generation | | | +-----------------+ | | | Post Optimize | | | +=================+ | |---> Assembly code (comd: cc -S <file.name> ) | V +=================+ | | | Assembler | | | +=================+ | |---> Object file (.obj) (comd: cc -c <file.name>) | V +=================+ | Linker | | and | | loader | +=================+ | |---> Executable (.Exe/a.out) (com:cc <file.name> ) | V Executable file(a.out)

Preprocesador C:

El preprocesamiento C es el primer paso en la compilación. Lo maneja:

  1. #define declaraciones.
  2. #include declaraciones.
  3. Declaraciones condicionales.
  4. Macros

El propósito de la unidad es convertir el archivo fuente C en el archivo de código Pure C.

Compilación de C:

Hay seis pasos en la unidad:

1) Analizador léxico:

Combina caracteres en el archivo fuente, para formar un "TOKEN". Un token es un conjunto de caracteres que no tiene ''espacio'', ''tab'' y ''nueva línea''. Por lo tanto, esta unidad de compilación también se llama "TOKENIZER". También elimina los comentarios, genera la tabla de símbolos y las entradas de la tabla de reubicación.

2) Analizador sintáctico:

Esta unidad verifica la sintaxis en el código. Por ejemplo:

{ int a; int b; int c; int d; d = a + b - c * ; }

El código anterior generará el error de análisis porque la ecuación no está equilibrada. Esta unidad verifica esto internamente al generar el árbol del analizador de la siguiente manera:

= / / d - / / + * / / / / a b c ?

Por lo tanto, esta unidad también se llama PARSER.

3) Analizador semántico:

Esta unidad verifica el significado en las declaraciones. Por ejemplo:

{ int i; int *p; p = i; ----- ----- ----- }

El código anterior genera el error "Asignación de tipo incompatible".

4) Pre-Optimización:

Esta unidad es independiente de la CPU, es decir, hay dos tipos de optimización

  1. Preoptimización (independiente de CPU)
  2. Postoptimización (dependiente de la CPU)

Esta unidad optimiza el código en las siguientes formas:

  • I) Eliminación del código muerto
  • II) Eliminación de subcódigo
  • III) optimización de bucle

I) Eliminación del código muerto:

Por ejemplo:

{ int a = 10; if ( a > 5 ) { /* ... */ } else { /* ... */ } }

Aquí, el compilador conoce el valor de ''a'' en tiempo de compilación, por lo tanto, también sabe que la condición if siempre es verdadera. Por lo tanto, elimina la parte else en el código.

II) Eliminación del código secundario:

Por ejemplo:

{ int a, b, c; int x, y; /* ... */ x = a + b; y = a + b + c; /* ... */ }

se puede optimizar de la siguiente manera:

{ int a, b, c; int x, y; /* ... */ x = a + b; y = x + c; // a + b is replaced by x /* ... */ }

III) Optimización de bucle:

Por ejemplo:

{ int a; for (i = 0; i < 1000; i++ ) { /* ... */ a = 10; /* ... */ } }

En el código anterior, si ''a'' es local y no se usa en el ciclo, entonces se puede optimizar de la siguiente manera:

{ int a; a = 10; for (i = 0; i < 1000; i++ ) { /* ... */ } }

5) Generación de código:

Aquí, el compilador genera el código de ensamblaje para que las variables más frecuentemente usadas se almacenen en los registros.

6) Pos-optimización:

Aquí la optimización depende de la CPU. Supongamos que si hay más de un salto en el código, entonces se convierten a uno como:

----- jmp:<addr1> <addr1> jmp:<addr2> ----- -----

El control salta directamente hacia el.

Entonces la última fase es Linking (que crea el ejecutable o la biblioteca). Cuando se ejecuta el ejecutable, las bibliotecas que requiere están cargadas.


  • Un compilador lee, analiza y traduce el código en un archivo de objeto o en una lista de mensajes de error.
  • Un enlazador combina uno o más archivos de objeto y posible código de biblioteca en algún ejecutable, alguna biblioteca o una lista de mensajes de error.
  • Un cargador lee el código ejecutable en la memoria, realiza alguna traducción de direcciones e intenta ejecutar el programa, lo que da como resultado un programa en ejecución o un mensaje de error (o ambos).

Representación ASCII:

[Source Code] ---> Compiler ---> [Object code] --* | [Source Code] ---> Compiler ---> [Object code] --*--> Linker --> [Executable] ---> Loader | | [Source Code] ---> Compiler ---> [Object code] --* | | | [Library file]--* V [Running Executable in Memory]


  • Compilador : que convierte el formato entendible humano en formato comprensible de la máquina
  • Enlazador : Qué formato de máquina comprensible de conversión en formato comprensible del sistema operativo
  • Loader : es una entidad que realmente carga y ejecuta el programa en RAM

Linker & Interpreter son intérpretes mutuamente excluyentes que obtienen el código línea por línea y lo ejecutan línea por línea.