Diseño del compilador: descripción general

Las computadoras son una mezcla equilibrada de software y hardware. El hardware es solo una pieza de dispositivo mecánico y sus funciones están controladas por un software compatible. El hardware comprende las instrucciones en forma de carga electrónica, que es la contraparte del lenguaje binario en la programación de software. El lenguaje binario tiene solo dos alfabetos, 0 y 1. Para instruir, los códigos de hardware deben estar escritos en formato binario, que es simplemente una serie de unos y ceros. Sería una tarea difícil y engorrosa para los programadores de computadoras escribir tales códigos, por eso tenemos compiladores para escribir tales códigos.

Sistema de procesamiento de idiomas

Hemos aprendido que cualquier sistema informático está hecho de hardware y software. El hardware comprende un lenguaje que los humanos no pueden entender. Por eso escribimos programas en un lenguaje de alto nivel, que nos resulta más fácil de entender y recordar. Estos programas luego se introducen en una serie de herramientas y componentes del sistema operativo para obtener el código deseado que la máquina puede utilizar. Esto se conoce como Sistema de procesamiento de idiomas.

El lenguaje de alto nivel se convierte en lenguaje binario en varias fases. UNAcompileres un programa que convierte lenguaje de alto nivel en lenguaje ensamblador. Del mismo modo, unassembler es un programa que convierte el lenguaje ensamblador a lenguaje de nivel de máquina.

Primero entendamos cómo se ejecuta un programa, usando el compilador C, en una máquina host.

  • El usuario escribe un programa en lenguaje C (lenguaje de alto nivel).

  • El compilador de C, compila el programa y lo traduce a programa ensamblador (lenguaje de bajo nivel).

  • Luego, un ensamblador traduce el programa ensamblador en código de máquina (objeto).

  • Se utiliza una herramienta de vinculación para vincular todas las partes del programa para su ejecución (código de máquina ejecutable).

  • Un cargador los carga todos en la memoria y luego se ejecuta el programa.

Antes de sumergirnos directamente en los conceptos de compiladores, debemos comprender algunas otras herramientas que funcionan en estrecha colaboración con los compiladores.

Preprocesador

Un preprocesador, generalmente considerado como parte del compilador, es una herramienta que produce entradas para los compiladores. Se ocupa del procesamiento de macros, el aumento, la inclusión de archivos, la extensión del idioma, etc.

Interprete

Un intérprete, como un compilador, traduce un lenguaje de alto nivel a un lenguaje de máquina de bajo nivel. La diferencia radica en la forma en que leen el código fuente o la entrada. Un compilador lee todo el código fuente a la vez, crea tokens, verifica la semántica, genera código intermedio, ejecuta todo el programa y puede involucrar muchas pasadas. Por el contrario, un intérprete lee una declaración de la entrada, la convierte en un código intermedio, la ejecuta y luego toma la siguiente declaración en secuencia. Si ocurre un error, un intérprete detiene la ejecución y lo informa. mientras que un compilador lee el programa completo incluso si encuentra varios errores.

Ensamblador

Un ensamblador traduce programas en lenguaje ensamblador a código de máquina. La salida de un ensamblador se llama archivo de objeto, que contiene una combinación de instrucciones de máquina, así como los datos necesarios para colocar estas instrucciones en la memoria.

Enlazador

Linker es un programa informático que vincula y fusiona varios archivos de objeto para crear un archivo ejecutable. Todos estos archivos pueden haber sido compilados por ensambladores separados. La tarea principal de un enlazador es buscar y ubicar módulos / rutinas referenciados en un programa y determinar la ubicación de la memoria donde se cargarán estos códigos, haciendo que la instrucción del programa tenga referencias absolutas.

Cargador

Loader es parte del sistema operativo y es responsable de cargar archivos ejecutables en la memoria y ejecutarlos. Calcula el tamaño de un programa (instrucciones y datos) y crea espacio de memoria para él. Inicializa varios registros para iniciar la ejecución.

Compilador cruzado

Un compilador que se ejecuta en la plataforma (A) y es capaz de generar código ejecutable para la plataforma (B) se denomina compilador cruzado.

Compilador de fuente a fuente

Un compilador que toma el código fuente de un lenguaje de programación y lo traduce al código fuente de otro lenguaje de programación se llama compilador fuente a fuente.