1.4. Lenguajes de programación
En el corazón de un ordenador, su procesador, conviven millones de pequeños transistores (podemos pensar en estos como interruptores) que son los encargados de realizar los cálculos de nuestros algoritmos. Estos transistores operan con una lógica binaria, por lo que únicamente pueden apagarse o encenderse, adoptar el valor de 1 o 0. Combinando muchos de estos valores binarios podemos representar todo tipo de valores y operaciones, por ejemplo, el número 500 lo podemos representar en valores binarios como 111110100. En los albores de la programación, los programas se podían almacenar en tarjetas perforadas (perforación = 0, no perforación = 1). Por suerte para nosotros, los tiempos de tener que programar en lenguaje binario (lenguaje máquina) han quedado atrás y ahora disponemos de distintos lenguajes de programación con los que podemos escribir nuestro código en un lenguaje más «natural» que más tarde será «traducido» para que lo entienda el ordenador. La primera categorización dentro de los lenguajes de programación sería entonces la que diferencia entre los lenguajes de bajo nivel (que dependen de cada máquina) y los de alto nivel, que más tarde se traducen a lenguaje máquina.
La manera en la que se produce esta traducción marca otra de las principales diferencias entre distintos lenguajes de programación. Estos pueden ser compilados o interpretados. Antes de ejecutar un programa escrito en un lenguaje compilado (C, C++, Swift, etc.), se necesita un paso previo, la compilación, que convierte el programa a lenguaje máquina. Sin embargo, en los lenguajes interpretados (Javascript, Python, Ruby, etc.), la traducción a lenguaje máquina se realiza a medida que se ejecuta el programa. También hay otros casos, como el de Java o C#, en los que el código se traduce primero a un lenguaje intermedio que luego es interpretado.
De manera muy general, podríamos decir que los lenguajes compilados están más optimizados y son más rápidos en su ejecución, con la contrapartida de ser más complejos, mientras que los interpretados facilitan la labor del programador, pero no alcanzan el rendimiento de los compilados. Igualmente, la brecha entre unos y otros en los últimos años se está estrechando.