La definición y el propósito de un compilador
ANDRZEJ WOJCICKI / Getty Images
A compilador es un programa que traduce legible por humanos código fuente en código de máquina ejecutable por computadora. Para hacer esto con éxito, el código legible por humanos debe cumplir con los sintaxis reglas de cualquier lenguaje de programación en el que esté escrito. El compilador es solo un programa y no puede arreglar su código por usted. Si comete un error, debe corregir la sintaxis o no compilará.
¿Qué sucede cuando compilas el código?
La complejidad de un compilador depende de la sintaxis del lenguaje y de cuánta abstracción ese lenguaje de programacion proporciona. Un compilador de C es mucho más simple que un compilador para C++ o C#.
Análisis léxico
Al compilar, el compilador primero lee una secuencia de caracteres de un archivo de código fuente y genera una secuencia de tokens léxicos. Por ejemplo, el código C++:
|_+_||_+_|podría analizarse como estos tokens:
- escriba 'int'
- variable 'c'
- es igual
- corchete izquierdo
- variable 'A'
- veces
- variable 'B'
- soporte derecho
- más
- literal '10'
Análisis sintáctico
La salida léxica va a la parte del analizador sintáctico del compilador, que usa las reglas de la gramática para decidir si la entrada es válida o no. A no ser que Variables A y B se declararon previamente y estaban dentro del alcance, el compilador podría decir:
- 'A' : identificador no declarado.
Si fueron declarados pero no inicializados. el compilador emite una advertencia:
- variable local 'A' usada sin ser inicializada.
Nunca debe ignorar las advertencias del compilador. Pueden descifrar su código de formas extrañas e inesperadas. Corrija siempre las advertencias del compilador.
¿Un pase o dos?
Algunos lenguajes de programación están escritos para que un compilador pueda leer el código fuente solo una vez y generar el código de máquina. Pascal es uno de esos lenguajes. Muchos compiladores requieren al menos dos pasadas. A veces, se debe a declaraciones anticipadas de funciones o clases.
En C++, una clase puede declararse pero no definirse hasta más tarde. El compilador no puede calcular cuánta memoria necesita la clase hasta que compila el cuerpo de la clase. Debe volver a leer el código fuente antes de generar el código de máquina correcto.
Generación de código de máquina
Suponiendo que el compilador complete con éxito los análisis léxicos y sintácticos, la etapa final es generar código de máquina. Este es un proceso complicado, especialmente con las CPU modernas.
La velocidad del compilado. ejecutable El código debe ser lo más rápido posible y puede variar enormemente según la calidad del código generado y la cantidad de optimización solicitada.
La mayoría de los compiladores le permiten especificar la cantidad de optimización, generalmente conocida por compilaciones de depuración rápida y optimización completa para el código publicado.
La generación de código es un desafío
El escritor del compilador enfrenta desafíos al escribir un generador de código. Muchos procesadores aceleran el procesamiento utilizando
- Canalización de instrucciones
- Interno cachés .
Si todas las instrucciones dentro de un código círculo se puede celebrar en el UPC caché, entonces ese bucle se ejecuta mucho más rápido que cuando la CPU tiene que obtener instrucciones de la RAM principal. La memoria caché de la CPU es un bloque de memoria integrado en el chip de la CPU al que se accede mucho más rápido que a los datos de la RAM principal.
Cachés y colas
La mayoría de las CPU tienen una cola de búsqueda previa donde la CPU lee las instrucciones en el caché antes de ejecutarlas. Si ocurre una bifurcación condicional, la CPU tiene que recargar la cola. El código debe generarse para minimizar esto.
Muchas CPU tienen partes separadas para:
- Aritmética entera (números enteros)
- Aritmética de punto flotante (números fraccionarios)
Estas operaciones a menudo pueden ejecutarse en paralelo para aumentar la velocidad.
Los compiladores suelen generar código de máquina en archivos de objetos que luego se vinculado juntos por un programa enlazador.