Introducción al diseño del compilador

El compilador es un software que convierte un programa escrito en un lenguaje de alto nivel (Lenguaje de origen) a un lenguaje de bajo nivel (Objeto/Objetivo/Lenguaje de máquina/0’s, 1’s). 

  • Compilador cruzado que se ejecuta en una máquina ‘A’ y produce un código para otra máquina ‘B’. Es capaz de crear código para una plataforma diferente a la que se ejecuta el compilador.
  • El compilador o transcompilador de fuente a fuente es un compilador que traduce el código fuente escrito en un lenguaje de programación al código fuente de otro lenguaje de programación.

Sistemas de procesamiento de lenguaje (usando Compiler): Sabemos que una computadora es un ensamblaje lógico de software y hardware. El hardware conoce un lenguaje que nos cuesta comprender, por lo que tendemos a escribir programas en un lenguaje de alto nivel, que nos resulta mucho menos complicado de comprender y mantener en mente. Ahora, estos programas pasan por una serie de transformaciones para que las máquinas puedan usarlos fácilmente. Aquí es donde los sistemas de procedimientos lingüísticos resultan útiles. 

Un traductor o procesador de lenguaje es un programa que traduce un programa de entrada escrito en un lenguaje de programación a un programa equivalente en otro lenguaje. El compilador es un tipo de traductor, que toma un programa escrito en un lenguaje de programación de alto nivel como entrada y lo traduce a un programa equivalente en lenguajes de bajo nivel como lenguaje de máquina o lenguaje ensamblador. El programa escrito en un lenguaje de alto nivel se conoce como programa fuente, y el programa convertido a un lenguaje de bajo nivel se conoce como programa objeto (o destino). Además, el compilador rastrea los errores en el programa fuente y genera el informe de errores. Sin compilación, no se puede ejecutar ningún programa escrito en un lenguaje de alto nivel. Después de la compilación, solo el programa en lenguaje máquina se carga en la memoria para su ejecución. Para cada lenguaje de programación, tenemos un compilador diferente; sin embargo, las tareas básicas realizadas por cada compilador son las mismas.

  • Lenguaje de alto nivel: si un programa contiene directivas #define o #include como #include o #define, se denomina HLL. Están más cerca de los humanos pero lejos de las máquinas. Estas etiquetas (#) se denominan directivas de preprocesador. Dirigen al preprocesador sobre qué hacer.
  • Preprocesador: el preprocesador elimina todas las directivas #include al incluir los archivos denominados inclusión de archivos y todas las directivas #define mediante la expansión de macros. Realiza inclusión de archivos, aumento, macroprocesamiento, etc.
  • Lenguaje ensamblador: No está en forma binaria ni de alto nivel. Es un estado intermedio que es una combinación de instrucciones de máquina y algunos otros datos útiles necesarios para la ejecución.
  • Ensamblador: Para cada plataforma (Hardware + SO) tendremos un ensamblador. No son universales ya que para cada plataforma tenemos uno. La salida del ensamblador se denomina archivo de objeto. Traduce lenguaje ensamblador a código máquina.
  • Intérprete: un intérprete convierte el lenguaje de alto nivel en lenguaje de máquina de bajo nivel, al igual que un compilador. Pero son diferentes en la forma en que leen la entrada. El compilador de una sola vez lee las entradas, procesa y ejecuta el código fuente, mientras que el intérprete hace lo mismo línea por línea. Un compilador escanea todo el programa y lo traduce como un todo en código de máquina, mientras que un intérprete traduce el programa una declaración a la vez. Los programas interpretados suelen ser más lentos con respecto a los compilados.
  • Código de máquina reubicable: se puede cargar en cualquier punto y se puede ejecutar. La dirección dentro del programa será de tal manera que coopere con el movimiento del programa.
  • Loader/Linker: convierte el código reubicable en código absoluto e intenta ejecutar el programa, lo que genera un programa en ejecución o un mensaje de error (o, a veces, ambos pueden ocurrir). Linker carga una variedad de archivos de objetos en un solo archivo para que sea ejecutable. Luego, el cargador lo carga en la memoria y lo ejecuta.

Fases de un compilador:
hay dos fases principales de compilación, que a su vez tienen muchas partes. Cada uno de ellos toma entrada de la salida del nivel anterior y trabaja de forma coordinada. 

Fase de análisis: se crea una representación intermedia a partir del código fuente dado: 

  1. Analizador léxico
  2. Analizador de sintaxis
  3. Analizador semántico
  4. Generador de código intermedio

El analizador léxico divide el programa en «tokens», el analizador de sintaxis reconoce «oraciones» en el programa usando la sintaxis del lenguaje y el analizador semántico verifica la semántica estática de cada construcción. El generador de código intermedio genera código «abstracto». 

Fase de síntesis: se crea un programa de destino equivalente a partir de la representación intermedia. Tiene dos partes: 

  1. Optimizador de código
  2. Generador de códigos

El Optimizador de código optimiza el código abstracto y el Generador de código final traduce el código intermedio abstracto en instrucciones de máquina específicas. 

Preguntas de GATE CS Corner 

Practicar las siguientes preguntas te ayudará a poner a prueba tus conocimientos. Todas las preguntas se han hecho en GATE en años anteriores o en pruebas simuladas de GATE. Es muy recomendable que los practiques. 

  1. GATE CS 2011, Pregunta 1
  2. GATE CS 2011, Pregunta 19
  3. GATE CS 2009, Pregunta 17
  4. GATE CS 1998, pregunta 27
  5. GATE CS 2008, Pregunta 85
  6. GATE CS 1997, Pregunta 8
  7. GATE CS 2014 (Conjunto 3), Pregunta 65
  8. GATE CS 2015 (Conjunto 2), Pregunta 29

Publicación traducida automáticamente

Artículo escrito por Rajesh_Kr_Jha y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *