¿Que es un lenguaje gráfico de programación?


¿Qué es un lenguaje de programación?

Cualquier lenguaje en sí supone un sistema de comunicación; y no difiere en el mundo digital, un lenguaje de programación es básicamente un sistema estructurado de comunicación, conformado por conjuntos de palabras claves, símbolos y reglas sintácticas y semánticas que permiten un entendimiento entre el programador y la máquina.

Hablamos del conjunto de instrucciones que se agrupan con motivo de una orden específica que pasamos a cierto dispositivo en pos de obtener un resultado coherente a estas acciones ejecutadas.




Por ejemplo cuando en una calculadora sumamos dos número estamos programando la ejecución de una operación aritmética, cuya ejecución se dispara cuando presionamos la tecla de igual (=) y el resultado se nos muestra en pantalla. De igual manera ocurre con un lenguaje de programación:var operando1 = 10 var operando2 = 5 let resultado = operando1 + operando2 print(resultado)


…en estas líneas hemos declarado dos variables, una llamada operando1 que hemos igualado con el valor 10 y otra llamada operando2 con el valor de 5, luego creamos una constante de nombre resultado, donde acto seguido igualamos con la suma de las dos variables antes mencionada, por último imprimimos el valor ya almacenado en la constante resultado, que en este caso será el valor 15.

Este código es interpretado y validado en un proceso llamado compilación (del cual hablaremos más adelante) para obtener finalmente todas estas ordenes agrupadas en un módulo que estaría ya listo para ejecutarse, una acción que puede llevarse a cabo dando doble click (en dependencia del tipo de aplicación) sobre ella. Esta acción sería equivalente a presionar la tecla igual (=) en una calculadora. Obteniendo el valor 15 en pantalla.
Definición de lenguaje de programación

Aquí ocurre la primera confusión habitual y es que debemos distinguir entre lenguaje de programación y lenguaje informático. Todos los lenguajes de programación son a la vez informáticos, pero no todos los lenguajes informáticos son de programación. Por ejemplo como sucede con HTML, que es un lenguaje de maquetación web, pero no de programación.

Sin querer entrar en tecnicismos, ya que muchas veces estos terminan por decir bien poco al estudiante o al interesado neófito, digamos que un lenguaje de programación está compuesto por una serie de instrucciones (similares a las que acabamos de ver) que tras introducirlas en un máquina, se traducirán en una consecución de operaciones ejecutadas por dicho equipo.

Esas acciones suponen órdenes muy precisas y concretas que persiguen un resultado específico, por ejemplo: sumar dos números enteros, controlar la temperatura de una caldera, el tratamiento de datos de un ordenador personal, etc.
Tipos de lenguaje de programación

Las máquinas o más concretamente sus procesadores, solo entienden un único lenguaje, el que conocemos como código binario. Este código está compuesto por unos y ceros y podría compararse al código morse (rayas y puntos), para que comprendas su versatilidad, a pesar de su sencillez.

Este código binario, conocido también como lenguaje máquina, resultaba un poco tedioso, sobre todo porque las órdenes que damos a un procesador son cada vez más complejas, lo que supone dedicar horas y horas a la introducción de líneas compuestas únicamente por unos y ceros. Es por eso que se han buscado formas intermedias de codificar estas órdenes binarias para agilizar los procesos.

Ahora diferenciaremos los tipos de lenguaje en dos grupos principales: de bajo nivel y de alto nivel, según estemos hablando del lenguaje más cercano al lenguaje máquina o del más próximo al empleado por un programador, respectivamente.
Lenguajes de programación de bajo nivel

Los lenguajes de bajo nivel son aquellos que se encuentran mucho más cerca del microprocesador, y con esto lo que intento decir es que su diseño está enfocado en acceder a registros y leer, escribir y mover bytes, está bien lejos de esas operaciones que hacemos en lenguajes de alto nivel donde tomamos una foto y la almacenamos en la nube.

Me refiero al lenguaje máquina o al lenguaje ensamblador. Mediante estos se programan los drivers de tu tarjeta de vídeo o de tu webcam, y esto aplica no solo a ordenadores personales, también se programa todo aquello que con un microcontrolador programable, ya sea un dispositivo móvil, un ordenador, un Raspberry Pi, la computadora interna de un carro o un brazo robótico Siemens.

Las instrucciones que componen estos lenguajes ejercen un control directo sobre el equipo y su estructura física, creando un vínculo inseparable entre el hardware y el software donde estos lenguajes servirían de interfaz.
Lenguaje máquina

Pero a estos niveles todo no es color de rosa, ya que existen muchos fabricantes y cada uno establece sus pautas, las cuales tenemos que respetar si deseamos trabajar con sus dispositivos. Para los programadores esto se traduce en que tenemos que aprender el lenguaje máquina de cada plataforma, viéndonos en la situación que nuestro código solo serviría para una única familia de procesadores o dispositivos.

Por ejemplo, si hacemos un programa en lenguaje máquina para un microprocesador IBM este no se ejecutará en un dispositivo con microprocesador Intel o ARM, básicamente por la misma razón por la que un driver de una tarjeta gráfica de AMD no sirve para una tarjeta gráfica de NVIDIA, ambos GPU son distintos, y de igual manera estos microprocesadores cuentan con interrupciones distintas, no son compatibles.

Cada tipo de CPU entiende su propio lenguaje de máquina y por ende tendríamos que crear versiones distintas de nuestro programa para cada uno de estos equipos.




Las instrucciones en lenguaje de máquina son números almacenados como bytes en memoria. Cada instrucción tiene su propio y único código llamado código de operación u opcode. Algo que dificulta grandemente la programación en este lenguaje, y es entendible ya que descifrar el significado de instrucciones codificadas numéricamente es tedioso para los humanos.

Por ejemplo, la instrucción que suma los registros EAX y EBX y almacena el resultado en EAX está codificada por los siguientes códigos hexadecimales:03 C3


Esto claramente no es obvio y prácticamente no dice nada sin su contexto. Afortunadamente, el lenguaje ensamblador puede ayudarnos a realizar este tortuoso trabajo por nosotros.
Lenguaje Ensamblador

Un programa Escrito en lenguaje ensamblador es almacenado como texto (tal como programas de alto nivel). Cada instrucción representa exactamente una instrucción de la máquina. Por ejemplo, la instrucción de suma descrita arriba podría ser representada en lenguaje ensamblador como:add eax, ebx


Acá el significado de la instrucción es mucho más claro que el código máquina. La palabra add es el mnemónicopara la instrucción de suma. Vamos que hubo un salto cualitativo entre el lenguaje máquina y el lenguaje ensamblador, ahora ya es mucho más fácil para los programadores desarrollar sus herramientas o drivers, al mismo tiempo que resulta más rápido interpretar el código escrito por otros.
Lenguajes de programación de alto nivel

Luego de haber visto con ejemplos básicos los lenguajes de bajo nivel, es entendible la existencia de este grupo, donde nos enfocamos más en el ser humano, en la optimización del tiempo y en la industria del software.

Los lenguajes de alto nivel son más cercanos al programador o el lenguaje natural, como puedan ser el castellano, el inglés o el francés. A este nivel ya no interactuamos con instrucciones del microprocesador y sí con macroinstrucciones (como copiar archivo o leer archivo) que desencadenan en el sistema operativo y el procesador toda una serie de reacciones y codificaciones cuyo resultado es justo la acción que el programador solicita.

De esta forma, ya no sería necesario escribir todas esas líneas que habría supuesto una sencilla orden en lenguaje máquina o ensamblador.

Estos lenguajes están orientados a una serie de procesos determinados, como el procesamiento de imágenes, la interacción con el usuario y la inserción de datos, el procesamiento de esta información y su almacenamiento en bases de datos, o también cálculos científico-matemáticos.

A diferencia de los lenguajes de bajo nivel con estos sí que podríamos migrar los programas de una máquina a otra, aunque en algunos casos fueran necesarias algunas modificaciones.

Las ventajas de los lenguajes de programación de alto nivel son:
Reducen el tiempo de programación y por ende facilitan el cumplimiento de las metas de un proyecto.
Son mucho más fáciles de aprender que los de bajo nivel y en la mayoría de los casos cuentan con una muy buena documentación.
Nos permiten desarrollar proyectos relativamente fáciles de escalar y mantener. Aunque estas características puedan estar más asociadas a la arquitectura del proyecto, el lenguaje juega un factor importante.
Permiten al programador abstraerse del funcionamiento interno de la máquina.

Esta forma de lenguaje informático ha supuesto un gran avance en el tipo de programas que pueden implementarse, haciendo más accesible la programación a muchas más personas y agilizando los procesos de desarrollo.

Los programas que creamos con estos lenguajes nada más estén disponibles ya pueden ejecutarse en millones de dispositivos alrededor del mundo gracias a capas de abstracción creadas por plataformas como .NET de Microsoft, la JVM (Java Virtual Machine) de Oracle o Qt actualmente en propiedad de The Qt Company (antiguamente era de Nokia).

Mediante .NET tenemos aplicaciones corriendo en ordenadores con sistema operativo Windows, aplicaciones web y también aplicaciones móviles mediante Xamarin, mientras que en el caso de Java su JVM (Máquina Virtual de Java) permite la ejecución de aplicaciones en sistemas operativos Windows, Linux y macOS, siendo así una solución de lenguajes multiplataforma (Java, Scala, Kotlin… etc.), también podemos correr sus aplicaciones sobre tostadoras, cajeros automáticos, y móviles como en el caso de las aplicaciones para Android.

Por último las aplicaciones en Qt también son multiplataforma, se desarrollan usando el lenguaje C++ y también cuentan con soluciones para equipos embebidos.

Los lenguajes de alto nivel han contribuido sin dudas a mejorar la industria, y han potenciado aun más la usabilidad / utilidad de muchos equipos electrónicos y digitales de cara al usuario final. Con esto lo que quiero decir es que sin los lenguajes de alto nivel difícilmente tuviéramos tantas aplicaciones disponibles para nuestros ordenadores, termostatos compatibles con HomeKit o para nuestros teléfonos inteligentes.
Tipos de programación

Existen diferentes tipos de programación o distintas maneras de enfocar el desarrollo de software. Siempre en dependencia de ciertos entornos de desarrollo y librerías, el proyecto que necesitemos construir, del momento histórico y también de cierto nivel de preferencia personal. Aquí nos centraremos en las más comunes y básicas, aunque existen más opciones.

Programación estructurada (PE): Es un paradigma de programación encaminado a optimizar el tiempo de depuración y mantenimiento de un programa, siendo estos cada vez más eficaces.

También se disminuye considerablemente la posibilidad de tener errores, ya que hablamos de un número cada vez más limitado de estructuras. Sus principales ventajas son la simplicidad y facilidad para el programador, con la consecuente reducción del tiempo dedicado..

Este tipo de programación englobaría las siguientes características:
Diseño descendente o descomposición del problema en estructuras jerárquicas (top-dow).
Recursos abstractos que descomponen las acciones complejas en otras más sencillas o simples para resolverlas con mayor facilidad.
Estructuras básicas de tres tipos: secuenciales, selectivas y repetitivas.

Programación Orientada a Objetos (POO). Como su propio nombre indica, su elemento principal es el objeto y esto supone una mejora sustancial en el proceso de desarrollo, sobre todo gracias a la re-utilización de código. Un objeto es un conjunto de datos en relación a su propia naturaleza, dicho de otra forma, un grupo de procedimientos que comparten un estado.

Un ejemplo pudiera ser un avión que modelaríamos con el objeto avión y con procedimientos como despegar, navegar y aterrizar y propiedades como la cantidad de asientos, la cantidad de turbinas, y resto de elementos que lo componen.

Este tipo de programación supone quizás un esfuerzo para cambiar nuestros parámetros de pensamiento, aunque se parece mucho a la forma de expresarnos en la vida real. Con él dividiríamos los programas en clases de objetos, pudiendo escribirlos, mantenerlos o reutilizarlos con mucha más facilidad.

Por ejemplo, la turbina del avión sería otro objeto, un objeto como propiedad o característica de otro, como un objeto en sí (similar al de la realidad) dada su complejidad de funcionamiento y los distintos tipos de turbinas que hay. También fungiría como otro objeto los asientos del avión con sus propiedades asociadas a su forma, a los materiales, al ángulo de reclinado, funcionalidades embebidas, etc.

Podríamos considerar que en este paradigma se gestionan grandes bloques de código y entidades lógicas como colecciones de objetos, pudiendo a su vez establecer diferentes jerarquías entre ellos, conectadas por relaciones de herencia, y con herencia me refiero a que todos los aviones heredan las características básicas y físicas que lo hacen volar, que lo hacen ser lo que es, dígase: las alas, los trenes de aterrizajes, el timón de cola y otras características comunes que varían con cada modelo pero que siempre están presentes.

Un objeto Avión o Aircraft (así nos evitamos la tilde) fungiría como un molde o un template, por ende con un objeto de este tipo, con todos sus procedimientos y propiedades, podemos crear muchos otros aviones, incluso modelos distintos siempre que hereden las características básicas que ya hemos comentado.

Programación Orientada a Protocolos (POP). Cuando hablamos de protocolos nos referimos a plantillas que empleamos para normalizar una especificación, ya sea una comunicación de red o un modelo de dato cualquiera. La programación orientada a protocolos se ha convertido prácticamente en un estándar a la hora de crear grandes proyectos de software y es el eje central del lenguaje Swift, de la programación en las plataformas Apple y de los frameworks que la conforman.

Para que se entienda mejor digamos que un protocolo Avión sería aquél blueprint donde se especifican los procedimientos y propiedades que debe tener un avión con tal de poder volar, con esto normalizamos el concepto de avión y su función. Luego cada vez que creemos objetos en representación de un avión tenemos que validarlos forzándolos a ajustarse con este protocolo.




El tema de la programación orientada a protocolos es compleja ya que para poder entenderla del todo nos obliga a dominar otros conceptos técnicos que van más allá de la intención de este artículo.

Si deseas profundizar más te recomendamos los artículos donde hablamos sobre los protocolos en el lenguaje de programación Swift y el otro donde debatimos sobre la herencia, asociada a la programación orientada a objetos, y la composición como elección dentro de la programación orientada a protocolos.

Como les acabo de comentar el lenguaje Swift acoge esta filosofía desde sus inicios, si deseas conocer más sobre él agrego esta última recomendación a las anteriores: El Lenguaje de Programación Swift.








Comentarios

Entradas populares de este blog

Tipos de Algoritmos