UN compilador es un programa que traduce legible para humanos código fuente en código máquina ejecutable por computadora. Para hacer esto con éxito, el código legible por humanos debe cumplir con el 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 se compilará.
¿Qué sucede cuando compila el código?
La complejidad de un compilador depende de la sintaxis del lenguaje y de cuánta abstracción. ese lenguaje de programación 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 lee primero 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 ++:
int C = (A * B) +10;
podría analizarse como estos tokens:
- escriba "int"
- variable "C"
- es igual
- soporte 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 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:
- La variable local 'A' se utiliza sin ser inicializada.
Nunca debe ignorar las advertencias del compilador. Pueden descifrar su código de formas extrañas e inesperadas. Siempre arregle 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 la máquina. Pascal Es uno de esos idiomas. Muchos compiladores requieren al menos dos pases. A veces, se debe a declaraciones a futuro 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 releer el código fuente antes de generar el código de máquina correcto.
Generando código de máquina
Suponiendo que el compilador completa 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 desafiante
El escritor del compilador enfrenta desafíos cuando escribe 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 lazo se puede celebrar en el UPC caché, entonces ese ciclo se ejecuta mucho más rápido que cuando la CPU tiene que buscar instrucciones de la RAM principal. El 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 los datos en 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 la memoria caché antes de ejecutarlas. Si ocurre una rama condicional, la CPU tiene que volver a cargar la cola. El código debe generarse para minimizar esto.
Muchas CPU tienen partes separadas para:
- Aritmética de enteros (números enteros)
- Aritmética de coma flotante (números fraccionarios)
Estas operaciones a menudo pueden ejecutarse en paralelo para aumentar la velocidad.
Los compiladores generalmente generan código de máquina en archivos de objetos que luego son vinculado juntos por un programa de enlace.