En 1954 se empezó a desarrollar un lenguaje que permitía escribir fórmulas matemáticas de manera traducible por un ordenador; le llamaron FORTRAN (FORmulae TRANslator).
Este desarrollo de FORTRAN estaba muy influenciado por la máquina objeto en la que iba a ser implementado.
[cita requerida] Los primeros compiladores se realizaron programándolos directamente en lenguaje máquina o en ensamblador.
Existen herramientas que facilitan la tarea de escribir compiladores o intérpretes informáticos.
El análisis léxico constituye la primera fase, aquí se lee el programa fuente de izquierda a derecha y se agrupa en componentes léxicos (tókenes), que son secuencias de caracteres que tienen un significado.
Sin embargo, un analizador léxico también es la parte del traductor que maneja la entrada del código fuente, y puesto que esta entrada a menudo involucra un importante gasto de tiempo, el analizador léxico debe funcionar de manera tan eficiente como sea posible.
En esta fase los caracteres o componentes léxicos se agrupan jerárquicamente en frases gramaticales que el compilador utiliza para sintetizar la salida.
Se comprueba si lo obtenido de la fase anterior es sintácticamente correcto (obedece a la gramática del lenguaje).
Por lo general, las frases gramaticales del programa fuente se representan mediante un árbol de análisis sintáctico.
Un factor para determinar la división es si una construcción del lenguaje fuente es inherentemente recursiva o no.
Normalmente, se reconocen los identificadores por el simple examen del flujo de entrada, esperando hasta encontrar un carácter que no sea ni letra ni dígito, y agrupando después todas las letras y dígitos encontrados hasta ese punto en un componente léxico llamado identificador.
Por otra parte, esta clase de análisis no es suficientemente poderoso para analizar expresiones o proposiciones.
Aquí, el compilador verifica si cada operador tiene operandos permitidos por la especificación del lenguaje fuente.
Después de los análisis sintáctico y semántico, algunos compiladores generan una representación intermedia explícita del programa fuente.
Existe una forma intermedia llamada «código de tres direcciones», similar al lenguaje ensamblador, en la que cada instrucción lleva a cabo una sola operación.
Sin embargo, hay optimizaciones sencillas que mejoran sensiblemente el tiempo de ejecución del programa objeto sin retardar demasiado la compilación.
El escritor del compilador se esfuerza por implementar estos algoritmos de una manera tan eficaz como sea posible, sin aumentar demasiado la complejidad.
En la mayoría de los lenguajes el analizador léxico solo necesita generar un token a la vez.
En este caso se puede utilizar una variable global simple para mantener la información del token.
En otros casos (cuyo ejemplo más notable es FORTRAN), puede ser necesario un arreglo (o vector) de tókenes.
El árbol entero puede entonces conservarse como una variable simple que apunta al nodo raíz.
Sin embargo, hay optimizaciones sencillas que mejoran sensiblemente el tiempo de ejecución del programa objeto sin retardar demasiado la compilación.
Al principio las computadoras no tenían la suficiente memoria para guardar un programa completo durante la compilación.
Con todo, los compiladores ocasionalmente encuentran útil generar archivos intermedios durante alguna de las etapas del procesamiento.