Computación
Imagen de tres personas empujando cubos y otra empujando una esfera haciendo menos esfuerzo.

Eficiencia de los lenguajes de programación

No todos los lenguajes de programación ejecutan un mismo código en el mismo tiempo y con la misma cantidad de recursos. La estructura del lenguaje determina su eficiencia.


| Actualizado:
2.004

Es bien sabido que existen muchos lenguajes de programación, y con el tiempo este número aumentará, pero quizá no es tan evidente el motivo por el que existen. ¿Por qué no existe un único lenguaje de programación que permitiera generalizar todos los problemas a una única solución en código? En este artículo intentaremos dar respuesta a esta pregunta analizando la estructura de los lenguajes de programación.

¿Por qué existen múltiples lenguajes?

Cada lenguaje de programación tiene un propósito y es por ello que no todos los lenguajes de programación deberán tener la misma estructura interna.

Por ejemplo, nos puede interesar que un lenguaje de programación sea lo más eficiente posible. Sin embargo, esto puede conllevar que sea el programador el que se encargue de gestionar la memoria que usa el programa. En consecuencia, el tiempo a invertir en un programa hecho en este lenguaje será superior al de otro que no tenga la capacidad de gestionar la memoria. Además, aumentará considerablemente la probabilidad de que aparezcan errores (en este caso de memoria). C o C++ son dos lenguajes que permiten tener una gestión de la memoria como la que se ha descrito en este ejemplo.

Por otro lado, quizá nos interesa tener un lenguaje de programación sea muy tolerante a errores y que el tiempo a invertir para programar cierto algoritmo sea el menor posible. Ignorando características como la eficiencia de este. Un lenguaje con estas características podría ser JavaScript.

Finalmente, podemos tener la necesidad de hacer operaciones matemáticas muy rápidas para cálculo computacional, como por ejemplo un programa que se ejecute en un supercomputador y que tenga que realizar más de 1.000 billones de operaciones por segundo, como es el caso del MareNostrum 4, de Barcelona. En este caso, el lenguaje de programación tendrá que priorizar el hecho de tener más eficiencia en el cálculo de operaciones que en la gestión de la memoria. Un lenguaje que tiene una gran eficiencia a la hora de calcular operaciones es Python.

Por lo tanto, después de analizar diferentes ejemplos de lenguajes de programación, se puede concluir que cada lenguaje tiene unas características que lo hacen ser diferente de los demás. Según el tipo de programa o algoritmo que se necesite desarrollar, convendrá usar un lenguaje u otro.

En el ámbito profesional, es muy importante la eficiencia en el trabajo, es decir, que se intente minimizar al máximo el tiempo de desarrollo de los programas. Por ello, muchas veces se puede optar por lenguajes que no sean tan eficientes, pero que den menos problemas y sean más rápidos de desarrollar.

Ejemplificando este hecho, nos encontramos con el uso de JavaScript en el frontend de las páginas web. Además, de ser un lenguaje extremadamente permisivo, tiende a dar muy pocos errores porque está conceptualmente lejos de la memoria. Es decir, hay varias capas por encima que ya se encargan de hacer una gestión de la memoria. Por ello, su desarrollo es mucho más rápido que otros lenguajes como C y, además, en el ejemplo propuesto no se prioriza tanto la eficiencia del lenguaje.

En cambio, contraponiendo el ejemplo anterior, podemos encontrarnos que, a pesar de tener un desarrollo más largo y tedioso con la gestión de errores de memoria, un proyecto deba hacerse con un lenguaje más eficiente. Por ejemplo, dentro del mundo de los videojuegos es muy importante tener tiempos de ejecución muy cortos y que sean extremadamente eficientes con el uso de la memoria. Por ello, nos encontramos que el uso de C++ es muy elevado dentro de la programación de videojuegos.

Lenguajes compilados vs interpretados

Adicionalmente, hay que hacer una especial mención al apartado sobre cómo se ejecuta un programa según la estructura interna. Si bien es cierto que todo lo mencionado anteriormente influye en la etapa de planificación de un proyecto donde se decide con qué lenguaje se desarrollará, es importante tener en cuenta que la estructura de un lenguaje influye en su eficiencia. La gran mayoría de lenguajes de programación se pueden clasificar según su son lenguajes compilados o interpretados.

  • Lenguajes compilados: son todos aquellos lenguajes que deben de ser traducidos a un lenguaje entendible para una máquina (como podría ser el lenguaje object). Además, tienen la peculiaridad que solo deben ser traducidos una sola vez para ejecutarse tantas veces como se desee.
  • Lenguajes interpretados: son todos aquellos lenguajes que no son traducidos a un lenguaje intermedio o entendible para la máquina. Cada vez que se ejecuta el programa, la máquina deberá traducir su código y ejecutarlo. Es decir, interpretará en todo momento cada instrucción escrita en el código fuente (el código escrito en un lenguaje de programación).

Asimismo, según el tipo de lenguaje que sea, aparecerán entidades como el compilador (para los lenguajes compilados -C, C++, Java, etc.-) y el intérprete (para los lenguajes interpretados -JavaScript, Python, PHP, etc.-). Como ya se ha visto, el primero lo que permite es traducir el código y generar un único archivo en un lenguaje intermedio que la máquina sea capaz de ejecutar, mientras que el segundo lee cada secuencia y la ejecuta directamente leyendo el código fuente.

Por lo tanto, viendo estas características, ya se puede presuponer que habrá lenguajes que tendrán un tiempo de ejecución mucho más bajo que otros. Concretamente, todos los lenguajes compilados, por el simple hecho de no tener que leer el código fuente cada vez que se ejecute (porque ya están compilados) tendrán un tiempo de ejecución mucho más bajo que los interpretados, que tienen que abrir el código fuente cada vez que se quieren ejecutar. De hecho, dentro del proceso de compilación o interpretación del código fuente, una de las operaciones que requiere más tiempo es la de la apertura y lectura del código fuente. Por lo tanto, es normal que un lenguaje que ya esté compilado tenga un tiempo de ejecución muy inferior al de un lenguaje interpretado.

Es decir, nos podemos encontrar situaciones donde exactamente el mismo algoritmo, dependiendo del lenguaje en el que esté escrito, tenga un tiempo de ejecución diferente en la misma máquina (importante que sea en la misma máquina y bajo la misma carga del procesador, ya que si no influyen otros aspectos).

Por ejemplo, supongamos el siguiente código en C:


#include <stdio.h>

#define MAX_LOOP	100

int main()
{
	for (int i = 0; i < MAX_LOOP; i++)
		printf("Iteration %d\n", (i+1));
	
	return 0;
}

Y ahora el siguiente código en JavaScript:


const MAX_LOOP = 100

for (let i = 0; i < MAX_LOOP; i++)
{
	console.log("Iteration " + (i+1));
}

Claramente, ambos códigos hacen lo mismo: muestran por la consola el número de iteración en el que se encuentra el bucle. No obstante, el proceso por el cual mostrarían esa información es bien diferente. El primer programa, escrito en C, se compilaron una sola vez al lenguaje objeto y se ejecutaría tantas veces como se quisiera desde ese programa escrito en object. Sin embargo, el segundo directamente se ejecutaría (sin compilar) y se tendría que interpretar secuencia a secuencia. Haciendo que el tiempo de ejecución del primer programa sea bastante más bajo que el del segundo.

Siguiendo el hilo argumental del artículo, os proponemos un paper en el que se hacen comparaciones entre múltiples lenguajes, incluyendo gráficas que certifican todo lo que se ha explicado en este mismo artículo. Este paper tiene múltiples autores y podéis encontrar sus nombres dentro del mismo.

Eficiencia energética

Finalmente, es importante destacar que la elección de un lenguaje de programación u otro, puede influir en el coste energético del programa que se va a ejecutar. Es decir, se podría afirmar que hay algoritmos que contaminan menos que otros. Formalmente, si un algoritmo está más tiempo en ejecución que otro y encima utiliza más recursos de la máquina que otro, estará usando más electricidad para poder ejecutarse y, en consecuencia, estará contaminando más el medio ambiente. Por ejemplo, un lenguaje que no haga un uso eficiente de la memoria y que requiere sea traducido (interpretado) cada vez que se ejecuta, estará consumiendo más recursos que otro que gestiona debidamente la memoria y ya está compilado.

Por lo tanto, debe ser responsabilidad de cada empresa y de cada desarrollador el hecho de elegir el lenguaje de programación que sea menos contaminante dentro de las posibilidades que existen en un proyecto. Si bien es cierto que eso no siempre es posible, ya que desarrollar el frontend en lenguajes más eficientes que JavaScript es, a día de hoy, inviable, es un aspecto importante a tener en cuenta y que cada vez está más presente debido a la situación climática actual.

Dentro de este ámbito, existe el concepto de programación verde, que es ese código que intenta reducir el impacto medioambiental buscando la máxima eficiencia. Donde, además de contaminar menos, el programa será más eficiente, lo tanto más rápido, y se ofrecerá una mejor solución para el cliente.

Conclusión

Todo lenguaje tiene un propósito por el cual fue creado y, dependiendo de las necesidades que tenga un proyecto, se tendrá que desarrollar en un lenguaje u otro. Por ello, es muy importante que todo proyecto tenga una fase de planificación donde se haga un estudio de las necesidades que se tendrán que cubrir. Asimismo, habrá que tener en cuenta la viabilidad que tendrá desarrollarlo en un lenguaje u otro en función del tiempo estimado.

En un ámbito más abstracto, se han analizado los dos tipos de lenguajes que existen según su estructura a la hora de ejecutarse: lenguajes compilados e interpretados. No existe un lenguaje que sea mejor que otro, sino que existe un lenguaje adecuado según el escenario en el que se encuentre el proyecto. Por ejemplo, C++ tiene una gestión más eficiente de la memoria que JavaScript, tal como se ha visto. Pero las urgencias temporales y el tipo de tecnología que se quiera usar, puede hacer más viable el proyecto si se desarrolla en JavaScript, dejando a un segundo plano la eficiencia de este.

Por lo tanto, es importante tener una visión general y tener conocimiento de varios lenguajes de programación (al menos a nivel conceptual) para poder tener la capacidad elegir entre uno u otro según el contexto e incluso valorar qué lenguaje tendría un coste energético superior a otro.

Más información

Si te ha gustado este artículo de proponemos unos enlaces con los que profundizar sobre las diferencias entre compilador e intérprete y sobre el concepto de programación verde, que busca la eficiencia energética mejorando la complejidad del algoritmo.

Si consideras que hay algún error en este artículo háznoslo saber mediante nuestro correo [email protected].


Comparte este artículo:
Foto de perfil de Carles Gallel

Carles Gallel

TaLeR

Computer scientist y profesor de la UOC (Universitat Oberta de Catalunya). Fundador de Last2, Undefined World, Erandic y Recursivity. Estudiante del máster en ingeniería informática en la UOC.