Saltar a contenido

Lenguajes de programación

¿Qué es un lenguaje? Un lenguaje es un protocolo de comunicación.

¿y qué es un protocolo? Un protocolo es un conjunto de normas consensuadas.

Así que, si logramos que un Lenguaje que pueda ser comprendido, tanto por el humano como por la computadora, obtendremos lo que buscamos: una comunicación efectiva.

Al principio, el lenguaje elegido era el que la máquina conocía y, en el mejor de los casos, todo se expresaba con una colección de órdenes primitivas conocidas por el procesador a la que llamamos Lenguaje Ensamblador (Assembler). Pero eso se hacía difícil.

Había que intentar salvar la diferencia entre las dos puntas de la comunicación en un punto medio, idealmente más cerca del programador. Se hizo evidente la necesidad de emplear otra clase de lenguaje.

¿cuál podría ser? ¿Cómo debería ser?

Lenguajes no formales

Un lenguaje no formal sería aquel que tiene una fuerte polisemia, es decir que sus elementos pueden tener múltiples significados.

Ejemplos de esta clase de lenguajes son los cuadros, las películas, las composiciones musicales o los emojis. Son todos de interpretación abierta.

Lenguajes formales

Un Lenguaje de Programación está dentro del grupo de los lenguajes formales. Estos son lenguajes que tienen un conjunto acotado y definido de elementos válidos (tokens1 o palabras clave) y reglas de construcción específicas de sentencias u oraciones válidas (reglas de sintaxis).

Ejemplos de esta clase de lenguajes son los idiomas o lenguas vivas, el lenguaje matemático, el de las partituras musicales, etc.

Partiendo al medio la distancia entre el programador y computadora, se diseñan y emplean lenguajes formales con una cantidad muy limitada de tokens válidos y reglas muy claras de generación de los mismos y una cantidad bien definida de reglas de sintaxis para armar sentencias, acompañados de una serie concreta de reglas de interpretación de expresiones confusas (reglas de desambiguación).

La evolución o mutación (cambios, agregados o eliminaciones de elementos y formas válidas) de estos lenguajes está controlada y supervisada por organizaciones con más éxito que la Real Academia Española.

Si ese lenguaje está diseñado para escribir algoritmos que se limiten al procesamiento de datos, puede ser un Lenguaje de Programación.

Pero no alcanza con tener un lenguaje, porque si escribo un programa con cualquier tipo de lenguaje formal la computadora podría de todas formas no entender nada, no reconocer ninguna orden (lo mismo que si una persona me pide un vaso de agua en chino; es un lenguaje pero yo quizás no puedo traducirlo sin las herramientas adecuadas de traducción). Será necesario traducirle a la computadora esas órdenes en código máquina. Un Lenguaje diseñado con todas las condiciones que hemos definido (formal, sin ambigüedades, acotado) facilita la traducción automática empleando programas traductores.

Estos programas tomarán sentencias y, sin tener en cuenta cualquier ambigüedad, ejecutarán lo pedido en las instrucciones.

Pensemos que el mundo de la computadora es simple y sin grises: si o no. Es difícil charlar con una máquina y comentarle: "El programa estalló", y esperar que no interprete que hubo destrucción masiva del equipo.

Aquí te dejo buenos ejemplos de cómo una computadora interpreta nuestras instrucciones sin pensar al respecto, sin tener sentido común y sin ambigüedades:

También te comparto el chiste de que la mamá de Juanito le dice: "andá al mercado. Trae un litro de leche, y si hay papas, traé 4", entonces Juanito vuelve con 4 litros de leche; porque había papas.

¡Para recordar!

La computadora es extremadamente literal al momento de leer nuestras instrucciones.

Usar un lenguaje de programación, en lugar de expresarnos con lenguaje coloquial (un lenguaje informal, familiar, con el que nos comunicaríamos con nuestros amigos y amigas, por ejemplo), hará nuestro trabajo más complicado, ya que tiene reglas estrictas que respetar y no admite ninguna clase de errores o sobreentendidos.

Aunque cada vez los lenguajes de programación se aproximan más a los lenguajes coloquiales, en el sentido de que podemos decir más con menos sentencias, los lenguajes de programación siguen siendo protocolos de comunicación y no lenguajes coloquiales. Y aunque el nivel de complejidad de las instrucciones que empleamos es cada vez mayor (complejidad porque resuelven cosas más complejas), sigue siendo mejor que volver a utilizar el lenguaje Ensamblador (Assembler).

Traductores

Un lenguaje de programación con las características que definimos previamente (formal, sin ambigüedades, acotado), se identifica como un Lenguaje de Alto Nivel.

Un lenguaje como Assembler, más cercano al código máquina, se identifica como Lenguaje de Bajo Nivel.

La traducción de un programa escrito en un lenguaje de alto nivel a su versión en Assembler, es realizada por otro lenguaje especializado.

Como un ordenador puede interpretar y ejecutar sólo el código máquina, existen programas especiales, denominados traductores, que traducen programas escritos en un lenguaje de programación al lenguaje máquina de la computadora.

Un traductor es un metaprograma que toma como entrada un programa (o parte de un programa) escrito en lenguaje simbólico -alejado de la máquina- denominado programa fuente y proporciona como salida otro programa semánticamente equivalente y escrito en un lenguaje comprensible por el hardware de la computadora que recibe el nombre de programa objeto.

Hay dos tipos de traductores de lenguajes de alto nivel que vamos a considerar:

  • los compiladores
  • los intérpretes

Compiladores

Con la técnica de compilación, se lee y posteriormente traduce completamente un programa y, sólo entonces, puede ser ejecutado. Un compilador traduce completamente en programa fuente, con lo que genera un programa objeto (semánticamente equivalente) escrito en lenguaje máquina. El programa fuente suele estar contenido en un archivo, y el programa objeto puede almacenarse como otro archivo en una unidad o medio de almacenamiento para ser ejecutado más adelante, sin necesidad de volver a realizar la traducción. Una vez traducido un programa, su ejecución es independiente de su compilación.

Intérpretes

Un intérprete permite que un programa fuente escrito en un determinado lenguaje sea traducido y ejecutado directamente sentencia a sentencia por la computadora. El intérprete capta una sentencia fuente, la analiza y la interpreta, lo que da lugar a su ejecución inmediata. En este caso no se crea ningún archivo o programa objeto almacenable en una unidad o medio de almacenamiento para posibles ejecuciones futuras.

Programa fuente

Los programas escritos en lenguaje de alto nivel se denominan programas fuente porque desde allí parten los traductores para generar una versión ejecutable.

Un programa fuente es un archivo de instrucciones. Esas instrucciones, aunque respetan la sintaxis del lenguaje de programación en que fue escrito, no dejan de ser texto sencillo, sin controles de formateo o alguna otra cosa especial. Por eso podemos editar un programa fuente con cualquier editor, por muy básico que sea.

Una vez escrito y guardado, levantamos el programa fuente desde un programa intérprete para que gestione la traducción y ejecución de este.

Para mayor comodidad del programador, así como tenemos aplicaciones para editar documentos de texto que nos permiten hacer algunos trabajos con imágenes o tablas de datos, por ejemplo, podemos trabajar durante todo el ciclo de vida de un programa (escribimos, probamos, corregimos, volvemos a probar, y así hasta que la versión nos conforme y podamos liberarla) con herramientas integradas en una única app que cubre todas las necesidades de trabajo que puedan surgir.

Abrimos esa herramienta y desde allí cubrimos todos los momentos y necesidades de la actividad de programación. Las aplicaciones que permiten hacer esto se denominan Ambientes Centrados en Lenguajes o Entornos de Desarrollo.

Tal como hemos planteado, el abismo entre los programas diseñados por el programador y la realidad de quien tiene que ejecutarlos (la computadora), es cada vez mayor. El gap existe y es real, pero no se sortea por arte de magia. En el mundo de la informática moderna la posibilidad de solución de problemas de todo tipo y complejidad se apoya sobre una gran cantidad de capas de software (layers) que se montan sobre la capacidad mínima de comprensión de una computadora y que van resolviendo problemas específicos y brindando servicio a las capas superiores; administradores de dispositivos, transmisores de información, administradores de recursos propios, organizadores de tareas, sistemas operativos, graficadores, traductores, compresores, ambientes de diseño, entre otros, van resolviendo problemas puntuales y encargándose de determinadas tareas para que las aplicaciones de niveles más altos puedan abordar la resolución de problemas cada vez más complejos y abstractos, despreocupándose de detalles o problemas recurrentes.

Referencias


Su estructura está completamente adaptada a los circuitos de la máquina y muy alejada de la forma de expresión y análisis de los problemas propios de los humanos. La programación en este lenguaje es complicada, de manera que se requiere un profundo conocimiento de la arquitectura física del ordenador.

Contenido complementario
Sin embargo, el código máquina hace posible que el programador utilice la totalidad de los recursos que ofrece el ordenador, con lo que se obtienen programas muy eficientes en tiempo de ejecución y en ocupación de memoria, dado que aprovechan al máximo los recursos existentes.

El lenguaje ensamblador y casi todos los lenguajes simbólicos de alto nivel resuelven estas limitaciones.

Lenguaje ensamblador

Contenido complementario
El lenguaje ensamblador constituye el primer intento de sustitución del lenguaje por uno más cercano al utilizado por los humanos.

No obstante, el lenguaje ensamblador presenta la mayoría de los inconvenientes que tiene el lenguaje máquina: un repertorio muy reducido de instrucciones, el rígido formato de las instrucciones, la baja portabilidad y la fuerte dependencia del hardware.

Este tipo de lenguajes hacen corresponder a cada instrucción en ensamblador una instrucción en código máquina. Esta traducción la lleva a cabo un programa traductor denominado ensamblador. Dado que el lenguaje ensamblador está fuertemente condicionado por la arquitectura del ordenador que soporta, los programadores no suelen escribir programas de tamaño considerable en ensamblador, sino que utilizan este lenguaje para afinar partes importantes de programas escritos en lenguajes de más alto nivel.

El lenguaje ensamblador sigue siendo importante, ya que ofrece al programador el control total de la máquina y como resultado genera un código compacto, rápido y eficiente.

Lenguajes de alto nivel

Contenido complementario
Tal como tuvimos ocasión de ver en el apartado de la evolución del software, la siguiente generación de los lenguajes de programación tenían como objetivo facilitar el trabajo del programador permitiéndole desarrollar aplicaciones independientes de la máquina, lo cual dio lugar a la aparición de los lenguajes de programación de alto nivel.

Contenido complementario
Estos lenguajes más evolucionados utilizan unas instrucciones más fáciles de entender y proporcionan facilidades para expresar alteraciones del flujo de control de una forma más intuitiva.

En la actualidad hay una gran cantidad de lenguajes de alto nivel en uso y se han desarrollado diferentes versiones de algunos de ellos. Esta heterogeneidad constituye el principal problema que presentan estos lenguajes.

Los lenguajes de alto nivel, a diferencia de los lenguajes máquina y ensamblador, no permiten aprovechar completamente los recursos internos de la máquina.

Todas estas características ponen de manifiesto un acercamiento a las personas y un alejamiento de la máquina. Por esta razón, los programas escritos en lenguaje de alto nivel no pueden ser interpretados directamente por la computadora, por lo que es necesario realizar previamente su traducción a lenguaje máquina.


  1. Token: En programación, este es el componente básico del código fuente. También llamado componente léxico es una cadena de caracteres que tiene un significado coherente de acuerdo con las reglas en cierto lenguaje de programación.