Como hemos visto, las órdenes que nosotros escribimos (lo que se conoce como "programa fuente") deben convertirse a lo que el ordenador comprende (obteniendo el "programa ejecutable").
Si elegimos un lenguaje de bajo nivel, como el ensamblador (en inglés Assembly, abreviado habitualmente como Asm), la traducción es sencilla, y de hacer esa traducción se encargan unas herramientas llamadas ensambladores (en inglés Assembler).
Cuando el lenguaje que hemos empleado es de alto nivel, la traducción es más complicada, y a veces implicará también recopilar varios fuentes distintos o incluir otras posibilidades que se encuentran en bibliotecas adicionales, que no hemos preparado nosotros. Las herramientas encargadas de todo esto son los compiladores.
El programa ejecutable obtenido con un compilador o un ensamblador se podría hacer funcionar en otro ordenador similar al que habíamos utilizado para crearlo, sin necesidad de que ese otro ordenador tenga instalado el compilador o el ensamblador.
Por ejemplo, en el caso de Windows (y de MsDos), y del programa que nos saluda en lenguaje Pascal, tendríamos un fichero fuente llamado SALUDO.PAS. Este fichero no serviría de nada en un ordenador que no tuviera un compilador de Pascal. En cambio, después de compilarlo obtendríamos un fichero SALUDO.EXE, capaz de funcionar en cualquier otro ordenador que tuviera el mismo sistema operativo, aunque no tenga un compilador de Pascal instalado.
Un intérprete es una herramienta parecida a un compilador, con la diferencia de que en los intérpretes no se crea ningún "programa ejecutable" capaz de funcionar "por sí solo", de modo que si queremos distribuir nuestro programa a alguien, deberemos entregarle el programa fuente y deberá tener también el intérprete que es capaz de entenderlo, o no le servirá de nada. Cuando ponemos el programa en funcionamiento, el intérprete de encarga de convertir el programa en lenguaje de alto nivel a código máquina, orden por orden, justo en el momento en que hay que procesar cada una de las órdenes.
Para algunos lenguajes, es frecuente encontrar compiladores pero no suele existir intérpretes. Es el caso del lenguaje C, de Pascal y de C++, por ejemplo. En cambio, para otros lenguajes, lo habitual es trabajar con intérpretes y no con compiladores, como ocurre con Python, Ruby y PHP.
Además, hoy en día existe algo que parece intermedio entre un compilador y un intérprete: Existen lenguajes que no se compilan para obtener un ejecutable para un ordenador concreto, sino un ejecutable "genérico", que es capaz de funcionar en distintos tipos de ordenadores, a condición de que en ese ordenador exista una "máquina virtual" capaz de entender esos ejecutables genéricos. Esta es la idea que se aplica en Java: los fuentes son ficheros de texto, con extensión ".java", que se compilan a ficheros ".class". Estos ficheros ".class" se podrían llevar a cualquier ordenador que tenga instalada una "máquina virtual Java" (las hay para la mayoría de sistemas operativos). Esta misma idea se sigue en el lenguaje C#, que se apoya en una máquina virtual llamada "Dot Net Framework" (algo así como "plataforma punto net").