Un compilador es un programa que traduce el código fuente legible por humanos en código máquina ejecutable por computadora. Para hacer esto con éxito, el código legible por humanos debe cumplir con las reglas de sintaxis 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á.
La complejidad de un compilador depende de la sintaxis del lenguaje y de cuánta abstracción proporcione ese lenguaje de programación. Un compilador de C es mucho más simple que un compilador para C ++ o C #.
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:
La salida léxica va a la parte del analizador sintáctico del compilador, que usa las reglas gramaticales para decidir si la entrada es válida o no. A menos que las variables A y B se hayan declarado previamente y estén dentro del alcance, el compilador podría decir:
Si fueron declarados pero no inicializados. el compilador emite una advertencia:
Nunca debe ignorar las advertencias del compilador. Pueden descifrar su código de formas extrañas e inesperadas. Siempre arregle las advertencias del compilador.
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 directas 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.
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.