Lenguajes de programación
hace 3 años · Actualizado hace 3 años
Si estás aquí, tal vez sepas lo que son los lenguajes de programación o estés interesad@ en aprender uno. Si es así, o simplemente tienes curiosidad, seguro que te interesa lo que te voy a contar.
Hablaremos en términos generales qué es un lenguaje de programación, los diferentes tipos de lenguajes que hay, para qué se utilizan y algunos de los más utilizados o recomendados para empezar.
Si quieres aprender algo de lenguajes de programación, ¡Quédate y échale un ojo a este artículo!
¿Qué son los lenguajes de programación?
De forma genérica, un lenguaje nos permite comunicarnos y expresarnos con las personas que hablan el mismo idioma que nosotros. Asimismo, los diferentes idiomas o lenguajes existentes, tienen semejanzas y diferencias entre ellos. En algunas ocasiones, el conocimiento que tenemos sobre un idioma nos permite acelerar el aprendizaje de otro.
De una manera similar, los lenguajes de programación son aquellos que nos permiten comunicarnos con un ordenador y decirle lo que queremos que haga y cómo queremos que lo haga. A diferencia de un idioma, los lenguajes utilizados para programar no pueden dar pie a confusión durante el proceso de comunicación, ya que se basan en sentencias claras y concisas.
Existe una gran variedad de lenguajes con los que podemos programar, pero generalmente todos comparten ciertas sentencias básicas que forman las bases de la programación. Estas sentencias básicas están implementadas en todos los lenguajes de programación de uso cotidiano, y las trataré en profundidad en un futuro tutorial sobre la programación.
¿Cómo se puede utilizar un lenguaje de programación?
Como he comentado, un lenguaje de programación nos sirve para comunicarnos con la máquina. Sin embargo, es necesario resaltar que existen diferentes formas de hacerlo y diferentes situaciones en las que necesitaremos comunicarnos de una manera u otra. Por eso, existen varios tipos de lenguajes. Os los voy a separar en dos secciones: la primera en base a la forma de uso del lenguaje, y la segunda en base al nivel de implementación del lenguaje.
Tipos de paradigmas de lenguajes de programación
Cuando hablo del uso del lenguaje a lo que me refiero es que hay tipos de programación diferentes y estos tipos se adecuan a un uso específico, por normal general, conocemos este concepto como paradigma de programación. Estas diferencias se basan principalmente en la forma de tratar los datos y de operar.
Aunque se hable de diferentes tipos de paradigmas de programación, varios de los lenguajes más utilizados a día de hoy hacen uso de más de uno de estos paradigmas. Esta práctica facilita en gran medida que todo sea mucho más cómodo a la hora de programar y además, añade diferentes formas de solucionar el problema que tenemos delante. Los paradigmas de programación son el imperativo, el declarativo, programación orientada a objetos y reactiva.
La programación imperativa
Este tipo de programación se compone de las diferentes técnicas que he comentado anteriormente, en su punto más básico. Está construido utilizando estas operaciones básicas y la forma de utilizarlo es secuencialmente. Se utilizan sentencias para especificar las diferentes tareas a realizar. Cada sentencia se especifica en una línea diferente y se ejecutan una tras otra, desde la primera hasta la última línea (top-down) del fichero. El conjunto completo de estas sentencias que llegan a un fin, se denomina algoritmo.
Dentro de la programación imperativa existen diferentes enfoques: la programación estructurada, procedimental y modular.
Programación estructurada
Dentro de este tipo de programación se encuentran las estructuras secuenciales ya descritas, así como otras que nos permiten añadirle dinamismo a los cómputos: las estructuras selectivas o lógicas y las repetitivas. Las estructuras selectivas son las que nos permiten decidir entre una sentencia u otra en base a un valor lógico.
En el código que vemos a continuación vemos un ejemplo de este tipo de estructuras selectivas en forma de .
En este caso, se tiene una variable llamada lluvia. Lluvia puede tener el valor "verdadero" o "falso". Comprobamos el valor de la variable lluvia mediante la estructura lógica "IF-THEN-ELSE", que ejecuta la primera sentencia (print ("Está lloviendo")) si el valor obtenido es verdadero y la segunda (print ("No está lloviendo")) si este es falso.
IF lluvia IS true THEN:
print («Está lloviendo»)
ELSE:
print («No está lloviendo»)
Las estructuras repetitivas son aquellas que se repiten un número definido o indefinido de veces antes de pasar a la siguiente sentencia. De la misma manera que en el caso anterior, pongo un ejemplo hipotético en el que se utiliza una estructura repetitiva.
Para explicar un poco el ejemplo, empezaremos en el momento en el que la variable día tiene el valor 1. Entramos en la secuencia repetitiva WHILE, que tiene como condición de continuidad en el bucle repetitivo que la variable día sea menor o igual de 30 (que sería cuando termina el mes). Dentro de la estructura repetitiva mostramos por pantalla (con la sentencia print) que estamos en mayo (por poner un ejemplo). Posteriormente, vamos sumando días de uno en uno, y en el momento en el que la variable día sea mayor de 30 (es decir, no sea menor o igual) tendremos que salir del bucle y se mostrará por pantalla que hemos cambiado de mes a Junio.
dia = 1
WHILE dia <= 30:
print( «Estamos en Mayo»)
dia = dia + 1
END_WHILE
print («Estamos en Junio»)
dia = 1
Con este tipo de lenguaje de programación se pueden generar programas de varias líneas de código que solucionen diferentes tareas. Los programas creados mediante este tipo de programación tienen ciertas ventajas, como que son mucho más fáciles de entender que otros. Esto hace que las pruebas para testear que todo esté bien implementado también sean más sencillas. En general, utilizar lenguajes de programación estructurados permite aumentar la productividad y al tener más facilidades de implementación, también es más fácil documentar el código.
Programación procedimental
Se trata de la creación de procedimientos que suelen repetirse. Por ejemplo, volviendo al caso anterior del bucle WHILE, si quisiéramos utilizar ese bloque de código para todos los meses, lo ideal sería crear una función que englobe ese comportamiento, como podría ser:
FUNCTION mes()
dia = 1
WHILE dia <= 30:
print( «Estamos en Mayo»)
dia = dia + 1
END_WHILE
print («Estamos en Junio»)
dia = 1
END_FUNCTION
De esta manera, si quisiéramos utilizar ese bloque de código en más de una zona de nuestro programa (en este caso, una vez por mes, por ejemplo), no tendríamos que especificar la implementación varias veces, simplemente llamaríamos a esta función llamada mes(). Este tipo de prácticas es muy habitual. Además es muy útil para facilitar y agilizar el trabajo. En este ejemplo habría que retocar un poco la función para que se especifique el cambio de mes, pero ya miraremos eso en más detalle en futuros tutoriales.
Programación modular
La idea de la programación modular sigue la base de lo que acabamos de explicar, y se centra en subdividir nuestro código en diferentes partes o módulos, de forma que sea mucho más cómodo y manejable. Dentro de cada uno de estos módulos puede haber diferentes procedimientos o funciones que subdividan el código de cada módulo. Este tipo de prácticas son necesarias cuando estamos trabajando con una buena cantidad de líneas de código.
Por ejemplo, si quisiéramos implementar una calculadora podríamos crear un módulo que contenga las funciones de lectura de los datos entrantes y escritura de los resultados obtenidos. Otro módulo que contenga las operaciones implementadas, una función por cada una de estas operaciones. De esta manera todo queda perfectamente modulado, y si en el futuro quisiéramos utilizar el módulo de las operaciones, sería totalmente directo usarlo.
La programación declarativa
Este paradigma se basa en la descripción del problema en lugar de la creación de un algoritmo para solucionarlo. Se trata de un tipo de programación más compleja conceptualmente que la anterior, pero ampliamente utilizada.
La mayor ventaja de este tipo de lenguajes es su similitud con el lenguaje matemático, así que si estamos familiarizados con esta manera de declarar razonamientos, tendremos más facilidad para utilizar este paradigma.
Utilizar el paradigma declarativo nos permite escribir programas que son mucho más optimizados que los algoritmos imperativos. De hecho, no es lo mismo describir el problema (mucho más directo) que buscar una solución a este y aplicarla (puede haber varias y no todas igual de óptimas).
Los lenguajes de programación englobados en este paradigma se dividen en dos tipos de programación: lógica y funcional.
Programación lógica
Los lenguajes de programación lógica se basan en el uso de predicados y la relación entre diferentes predicados. Por ejemplo, si tenemos los predicados:
1. Tengo una mascota que se llama Pepe
2. Sólo tengo una mascota
3. Tengo un perro como mascota
Entonces, podremos deducir que mi perro se llama Pepe. Los programas escritos utilizando lenguajes de programación lógica siguen este tipo de estructuras, y pueden llegar a ser muy complejos de entender en problemas extensos.
Programación funcional
La utilización de lenguajes de programación funcional, como su propio nombre indica, se basa en funciones matemáticas. El centro principal de este tipo de programación es el cálculo lambda así como el uso de la en dichas funciones. Por ejemplo, imaginemos que queremos tener un temporizador para X segundos, tenemos el siguiente pseudocódigo utilizando este tipo de programación:
FUNCTION contador (X):
IF X IS 0 THEN:
SALIR DE FUNCION
ELSE:
ESPERAR 1 SEGUNDO
LLAMAR A contador(X-1)
END_FUNCTION
La condición de parada la encontramos en la primera parte de la función, donde comprobamos que el valor X sigue siendo mayor de cero. Obviamente habría que comprobar previamente que el valor inicial X sea mayor de 0, si no estaría iterando infinitamente. En la parte ELSE de la función podemos ver como la función se llama recursivamente a sí misma, haciendo el mismo proceso pero con el valor X-1.
Imaginemos que queremos hacer un contador de 3 segundos. X tendría el valor de 3. El proceso sería el siguiente:
contador(3):
IF 3 IS 0 THEN:
SALIR DE FUNCION
ELSE:
ESPERAR 1 SEGUNDO
LLAMAR A contador(2)
contador(2):
IF 2 IS 0 THEN:
SALIR DE FUNCION
ELSE:
ESPERAR 1 SEGUNDO
LLAMAR A contador(1)
contador(1):
IF 1 IS 0 THEN:
SALIR DE FUNCION
ELSE:
ESPERAR 1 SEGUNDO
LLAMAR A contador(0)
contador(0):
IF 0 IS 0 THEN:
SALIR DE FUNCION
Mediante este proceso, la función se llama tres veces a sí misma, hasta que se encuentra en el criterio de parada.
La programación orientada a objetos
Los lenguajes de programación orientados a objetos, intentan crear una representación más basada en el mundo real. Se basan en la separación de los diferentes componentes de los programas computacionales para poder reutilizar la mayor parte de código. Algo que se aprende cuando estás programando es a no reinventar la rueda y reutilizar todo lo que podamos para avanzar más rápido.
Estos lenguajes están basados en la creación de objetos (que son lo que vamos a manejar) que constan de una cantidad de atributos y métodos asociados a dicho objeto. Por ejemplo, imaginemos el objeto ordenador. Un ordenador puede tener unos atributos variables que se asocian a cada una de las máquinas, como puede ser el procesador, la GPU, la resolución de pantalla, etc. Mientras que tiene unos métodos que pueden estar asociados al ordenador, como encenderse o apagarse.
La programación orientada a objetos, es una de las más utilizadas a día de hoy y desde hace varios años. El ejemplo que he puesto es muy sencillo, ya que este tipo de lenguajes de programación tienen asociados una serie de comportamientos como pueden ser la herencia o el polimorfismo. Pero estos temas los trataré en un post futuro porque si no esto se va a hacer eterno.
La programación reactiva
Creada en el 2010, una de las más recientes formas de programar. Se creó debido a la necesidad de un sistema más escalable frente a las necesidades de entonces. Se enfoca en trabajar con flujos de datos de forma asíncrona. Para entenderlo mejor, vamos a poner un ejemplo.
Supongamos que tenemos una aplicación web. Esta aplicación tiene la necesidad de utilizar los datos que están almacenados en un servidor externo. Estos datos suelen cambiar constantemente, y las páginas web que puedan estar abiertas por diferentes usuarios han de estar actualizadas. Para ello, debe haber una comunicación entre el servidor y todas las personas que estén utilizando la web en cada momento.
Con tecnologías antiguas, el servidor tendría que notificar a cada una de las webs de los cambios, provocando que fuera totalmente inviable cuando hay muchas personas utilizando esta página web. Actualmente, gracias a los lenguajes de programación que incluyen el paradigma reactivo, se mantiene una estructura donde las páginas web son observadoras y cuando se aplica un cambio en el servidor, piden la actualización. De esta manera se ahorra mucho tiempo y recursos en comunicaciones.
Tipos de lenguajes de programación en base al nivel de implementación
De la misma manera que podemos dividir los diferentes lenguajes de programación según la forma que tenemos de utilizarlos, también podemos clasificarlos en cuanto a su nivel de implementación. Cuanto más bajo sea el nivel de implementación, más se aproxima a la forma de funcionar el computador, que sería en binario, comunicándonos utilizando 0's y 1's.
Un lenguaje de programación puede ser de bajo nivel o de alto nivel.
Lenguaje de programación de bajo nivel
Esta sección engloba principalmente el lenguaje máquina, basado en escribir nuestros programas únicamente con 0'1 y 1's, y el lenguaje ensamblador, enfocado en la forma más básica de escribir código con las variables más primitivas a las que se les pueden asociar valores.
El lenguaje máquina es prácticamente ilegible, mientras que el lenguaje ensamblador es algo más fácilmente comprensible pero únicamente permite utilizar las operaciones más básicas para implementar nuestros programas. Un ejemplo de las operaciones que se utilizan son la suma, la resta, el desplazamiento (offset) de los valores binarios para ejecutar otras operaciones, etc.
SUM $1, $2, $3 <- suma en el registro $1, los valores almacenados en $2 y $3.
El lenguaje ensamblador nos permite utilizar una especie de variables denominadas registros, pero estas son muy limitadas (no se puede usar más de unas pocas) y las operaciones también lo son. Se suele utilizar esta forma de programación para sistemas que requieren optimizar al máximo las operaciones y la memoria. Como podría ser por ejemplo, el sistema almacenado en los semáforos que especifican el tiempo de espera para cambiar cuando se pulsa un botón.
Lenguaje de programación de alto nivel
El lenguaje de programación de alto nivel es un concepto cambiante. Ya que nos referimos a los lenguajes que nos facilitan las cosas a la hora de programar nuestros algoritmos. Sin embargo, es normal que según va pasando el tiempo surjan nuevas técnicas y mejoras de las existentes. No obstante, se puede dividir por generaciones o fases.
- Primera generación. Aunque pueda parecer contradictorio, cuando no existían los lenguajes de programación actuales que tanto nos facilitan la vida, los lenguajes de alto nivel eran el lenguaje máquina y el ensamblador.
- Segunda generación. Cuando surgieron estos lenguajes eran una forma de hacerlo todo más fácil. Son los lenguajes que se empezaron a utilizar cuando explotó el tema de los sistemas automáticos y muchas entidades siguen manteniendo sus sistemas en estos lenguajes dada la dificultad para hacer el cambio, como es el caso de los bancos. En este caso podemos destacar el lenguaje COBOL.
- Tercera generación. A estas alturas fue cuando empezaron a surgir los primeros lenguajes de programación imperativos. Algunos de ellos siguen usándose a día de hoy, pero otros sólo se utilizan con fines didácticos, como es el caso de PASCAL en la mayor parte de sus usos. Aquí se encuentran lenguajes que a día de hoy se consideran obsoletos pero nos permiten hacer algoritmos más complejos que en las generaciones anteriores.
- Cuarta generación. Según fue avanzando la informática, se empezó a necesitar una manera de almacenar datos de forma segura y normalizada. En este punto aparecen algunas aplicaciones y/o librerías de manejo y gestión de datos, como es el conocido SQL. Este paso es algo vital y ampliamente utilizado en la mayor parte de aplicaciones actuales con un tamaño medio-grande.
- Quinta generación. Esta generación es la que consideramos más de alto nivel actualmente. Está formado por los lenguajes más avanzados y pensados para la generación de métodos de inteligencia artificial o procesamiento de lenguaje natural. Los algoritmos que utiliza google son un ejemplo de aplicaciones implementadas con lenguajes de programación de quinta generación.
Lenguajes de programación más usados
El lenguaje que más se ha utilizado en los últimos años es JAVA
Existen varias clasificaciones disponibles de los lenguajes de programación. Todas tienen a tener la misma información, así que yo he optado por poner el índice de la página TIOBE. Aquí podemos ver que el lenguaje que más se ha utilizado en los últimos años es JAVA, seguido de C. JAVA es un lenguaje de programación orientado a objetos, obviamente el más usado; mientras que C se trata de un lenguaje de más bajo nivel, imperativo y que nos permite un control de la memoria prácticamente ilimitado.
Python es el lenguaje multiparadigma más utilizado
Sin embargo, a mi me gustaría resaltar en la gráfica la línea negra que representa a Python. Python es un lenguaje multiparadigma, que nos permite implementar de forma imperativa, declarativa y orientado a objetos. No es de extrañar entonces que haya ganado tantísima popularidad. Además, con la inteligencia artificial (IA) emergiendo, y las facilidades que proporciona Python para implementar programas de IA no hacen más que potenciar más esa popularidad. Esto me lleva al siguiente, y último, punto de este post.
Mejor lenguaje de programación para empezar
Como puedes imaginar, aquí no puedo hacer otra cosa más que recomendarte Python para empezar. Es un lenguaje con un montón de documentación y tutoriales por internet, un montón de ejemplos y una barbaridad de aplicaciones implementadas en GitHub y similares. Por no hablar de la cantidad enorme de librerías que tiene a su disposición. Como ya he comentado anteriormente, reutilizar código ya implementado es lo más útil que podemos hacer a la hora de programar.
Las librerías proporcionan eso precisamente, funciones implementadas que nos sirven para resolver ciertos fragmentos de nuestro programa. La disponibilidad de una cantidad de librerías muy amplia es muy útil para facilitar la tarea de cualquier programador. Por eso Python tiene un potencial enorme.
Además, el hecho de que sea el lenguaje multiparadigma más utilizado también es un factor a tener en cuenta. Se trata de un lenguaje de programación con el que podemos extraer todas las ventajas de los diferentes paradigmas y aplicarlo en un mismo programa. Por ejemplo, en un sistema que esté principalmente implementado de forma imperativa, podríamos añadir las útiles funciones lambda para algunas operaciones concretas. De esta forma simplificamos decenas de líneas en una única línea.
Por otra parte, para la gente que se quiera iniciar en el mundo de la programación, se trata de un lenguaje con una curva de aprendizaje muy buena y que además nos va a permitir experimentar con todos los paradigmas.
El hecho de que aprendas a manejar un lenguaje de programación, te va a ayudar enormemente para aprender los siguientes. Por eso considero que empezar con uno que sea tan dinámico y amplio, es un buen comienzo.
Espero que hayas disfrutado leyendo este artículo, si es así deja un comentario!! Si crees que me he olvidado de algo importante, también puedes ponérmelo en un comentario 🙂 Nos vemos en el siguiente!
Deja una respuesta
Otras Entradas Relacionadas