¿Cómo funciona un compilador? [cerrado]

17

Nota: Me sorprende que esto no se haya preguntado antes, y si lo hubiera hecho, no podría encontrarlo en una búsqueda.

He estado en toneladas de sitios web, he leído toneladas de artículos y he escuchado toneladas de explicaciones. La mayoría de ellos eran buenos, pero todos eran demasiado amplios o demasiado complicados o simplemente malos. Entonces mi pregunta es, ¿cómo funciona un compilador?

Si esta es una pregunta difícil y amplia, por favor dígame. Pero si no, por favor responda la pregunta.

Dinámica
fuente
44
Demasiado amplio, al menos la parte "Cómo funciona". Hay libros enteros escritos sobre ese tema.
Oded
1
en.wikipedia.org/wiki/Compiler sería el enlace de Wikipedia que es trivial de encontrar, ¿qué se pregunta específicamente? La pregunta es lo suficientemente amplia como para tentarme a dar la respuesta alec inteligente de "Los compiladores traducen el código de un idioma a otro", ya que esa es la idea general que tiene muchos matices una vez que uno comienza a mirar ¿Qué implica eso realmente?
JB King
1
Sí, y creo que se ha respondido bastante bien.
Jeremy
1
Cualquier explicación de cómo funciona un compilador será demasiado amplia o demasiado complicada. Es un tema complicado, y las clases de compiladores fueron los cursos más difíciles relacionados con la computadora que tomé.
David Thornley
1
@David Por supuesto, los compiladores son complicados y no puedes explicar todos los detalles de cómo funcionan aquí. Sin embargo, estoy seguro de que tenía una comprensión básica de alto nivel de lo que es un compilador o cómo funciona antes de tomar su curso de compilador.
Dima

Respuestas:

24

Un compilador es un programa que traduce el código fuente de otro programa de un lenguaje de programación a código ejecutable.

El código fuente está típicamente en un lenguaje de programación de alto nivel (por ejemplo, Pascal, C, C ++, Java, Perl, C #, etc.). El código ejecutable puede ser una secuencia de instrucciones de máquina que la CPU puede ejecutar directamente, o puede ser una representación intermedia que es interpretada por una máquina virtual (por ejemplo, código de bytes Java).

En resumen, un compilador convierte un programa de un formato legible por humanos a un formato legible por máquina.

En cuanto a cómo funciona un compilador, eso es realmente complicado. Hay libros y cursos universitarios sobre el tema. Intentaré describir brevemente las etapas principales del proceso, pero esta será una visión general muy superficial.

  1. Lexing: divide el texto del programa en "tokens". Los tokens son las "palabras" del lenguaje de programación, como identificadores (palabras clave, nombres de variables, nombres de funciones, etc.) u operadores (=, *, &, etc.).
  2. Análisis: convierte la secuencia de tokens en un árbol de análisis, que es una estructura de datos que representa varias construcciones de lenguaje: declaraciones de tipo, declaraciones de variables, definiciones de funciones, bucles, condicionales, expresiones, etc.
  3. Optimización: evalúe expresiones constantes, optimice las variables no utilizadas o el código inalcanzable, desenrolle los bucles si es posible, etc.
  4. Traduzca el árbol de análisis a las instrucciones de la máquina (o el código de bytes JVM).

Nuevamente, enfatizo que esta es una descripción muy breve. Los compiladores modernos son muy inteligentes y, en consecuencia, muy complicados.

Dima
fuente
2
En realidad, transforma un idioma en otro. El compilador temprano de C ++ compiló a C. Lo mismo ocurre con el compilador Vala. El compilador de Java se compila en bytecode que no es ejecutable sin un compilador JIT de JVM.
deadalnix
1
@deadalnix En mi humilde opinión, el punto es que pasas de código no ejecutable a código ejecutable. Yo diría que C-front no fue un compilador sino un front-end para el compilador de C. O una etapa en el proceso de compilación, por así decirlo. Las máquinas virtuales desdibujan el límite entre "ejecutable" y "no ejecutable", por supuesto. Aquí simplemente consideraría que el código ejecutable es lo que entra en la máquina virtual, como el código de bytes, y abstrae lo que sucede dentro de la máquina virtual, como JIT.
Dima
1
@Dima, no tiene que ser de código no ejecutable a código ejecutable. Por ejemplo, no puede ejecutar el código de bytes JVM directamente en máquinas con Windows.
1
@ Thorbjørn Ravn Andersen: pero el código de bytes es ejecutable por la JVM. ¿No tiene el sentido de una "máquina virtual" parecer una máquina real para el programador?
Dima
2
Yo diría que tradicionalmente un compilador convirtió un programa de un formato legible por humanos a un formato legible por máquina, tal como dijo Dima. Las variaciones como Cfront que convierte C ++ a C o javac que convierte Java a bytecode son temas más avanzados que probablemente deberían dejarse hasta después de explicar el concepto básico y tradicional a alguien que no esté familiarizado con él.
Carson63000
5

Un compilador es un programa de computadora (o conjunto de instrucciones) que transforma el código fuente escrito en un lenguaje de programación (el idioma fuente) en otro lenguaje de computadora (el idioma de destino, que a menudo tiene una forma binaria conocida como código objeto). La razón más común para querer transformar el código fuente es crear un programa ejecutable.

Los compiladores conectan los programas fuente en lenguajes de alto nivel con el hardware subyacente. Un compilador requiere:

  1. Determinar la corrección de la sintaxis de los programas.
  2. Generando código objeto correcto y eficiente
  3. Organización en tiempo de ejecución
  4. Formato de salida de acuerdo con las convenciones de ensamblador y / o enlazador.
Mario Stylianou
fuente