sábado, 30 de marzo de 2019

Paradigmas y tipos de lenguajes informáticos (1 de 3)

La informática es una carrera constante entre el software y el hardware pero no es una carrera competitiva, los avances de hardware, hace que queremos tener más servicios, más funcionalidad, mas automatización… provocan un desarrollo de las inquietudes con respecto al desarrollo de nuevas funcionalidades y la velocidad en la que somos capaces de desarrollarlo. Un cambio de paradigma, nuevas herramientas, y métodos en la construcción de software, provocan una obsolescencia en el hardware, Nuestros sistemas vistosos, amigables e interactivos, son cada vez más lentos, los que hace que necesitamos avanzar en nuevos dispositivos cada vez más potentes y versátiles.


La carrera de los lenguajes de programación no da enormes brincos pero si pasos constantes y rápidos, cada lenguaje es una evolución de los anteriores, una mejora sobre la forma y el proceso, por eso a veces es difícil poder catalogarlos. Cada lenguaje tiene características de los anteriores y se podría situar entre un tipo y otro, solo en casos muy específicos es posible una clasificación clara, en esta entrada (y las siguientes) a ver distintas formas de clasificar un lenguaje.

Según el “nivel”


El nivel, hace referencia a la “distancia” que tienen el lenguaje con respecto a al hardware. Un nivel más bajo implica instrucciones directas al hardware, un nivel más alto implica una abstracción (y desconocimiento) mayor con respecto al hardware en particular que corre nuestro hardware.


Lenguajes de bajo nivel


Los lenguajes de bajo nivel ejecutan instrucciones directamente en el hardware destino, y son extremadamente dependientes del mismo hardware, de forma que un lenguaje para un hardware, suele ser exclusivo para este (o para una familia de hardware en específico si así lo decide el fabricante).

En este punto está el código binario, instrucciones en unos y ceros que ejecuta el procesador directamente, y un poco por encima el lenguaje ensamblado. Hay que recordar que en su forma más primitiva el lenguaje ASM son solos nemotécnicos que son convertidos directamente en código binario. Cada procesador y arquitectura tiene su propio lenguaje ASM.

Ejemplos:

  • Assembly

Lenguajes medios


Son lenguajes que si tienen estructuras claras de control, y nos alejan de conceptos tales como registros y microprocesadores, pero todavía dependemos mucho de conceptos que tiene que ver más con como organiza la computadora la memoria, que con como diséñanos los algoritmos.

Estos lenguajes tienen las siguientes características:

  • Delegan la gestión de la memoria completamente al codificador, él debe reservar la memoria, y liberarla.
  • Además no existe ninguna restricción en cuanto al acceso de memoria, que generalmente es por punteros y libre (lo cual puede provocar que el programa falle).
  • No existe ningún control sobre si estamos asignando un tipo de valor correcto a una variable, ni siquiera si es esta variables se está almacenando en el lugar de memoria adecuado.
  • Generalmente los parámetros se pasan por valor (y no por referencia), para modifica parámetros (tener parámetros de salida) sería necesario pasar direcciones de memoria.

Ejemplos:

  • El ejemplo más representativo es C

Lenguajes de alto nivel


Son lenguajes más independientes de la estructura y características del hardware y mas asociados a la forma de pensar del programador o a las necesidades de negocio a resolver.

Tienen las siguientes características:

  • Una gestión de memoria automática, que suele contar con un recolector de basura.
  • Comprobación automática de tipos y de datos, de forma que es casi imposible compilar si se hay un error de asignación de tipos y en el caso que no se puede compilar el sistema generaría un error que haría que se detuviera (en los lenguajes anteriores el programa seguiría ejecutándose sin generar ninguna advertencia y trabajando con datos corruptos).
  • Tiene sentencias de control de errores claras y sencillas de usar
  • No solo se limita al uso de sentencias condiciones como “if”, sino que tiene estructuras complejas como bucles de diversa índole (for, foreach, while, do until).
  • Generalmente tienen algún mecanismo de reutilización sencilla de código, ya sea a través de los mismos archivos de código fuente (referenciándolos), algún tipo de librería (dll, jar), componentes de algún tipo (COM, ActiveX), o servicios de alguna índole (Servicios SOAP, REST, etc).
  • Lo más importante. Debido a que están más enfocados a facilitar la resolución de las necesidades operativa, se basan más en la implementación de algoritmos sin tener una relación en particular del hardware, lo que hace que sean sencillos de aprender y además, sin que los conozcamos, el análisis de un programa realizado en estos lenguajes es sencillo de comprender.

Ejemplos:

En la actualidad abundan los ejemplos de lenguajes de alto nivel, como los siguientes:

  • C#
  • Java
  • Ruby

Según la generación


En esta clasificación se crean generaciones, en la que se aprecia a través del tiempo, la evolución de los lenguajes. Cada generación es más abstracta (con respecto al hardware) y más sencilla de manejar, con “menos” hacemos “más”.

A quien ocurre un curioso fenómeno, el “conservadurismo” del programador, personas que se afianzaron en una generación (o tecnología) en particular, ensalzando las virtudes de sus lenguajes y rechazando los avances que les sigue porque son “poco óptimos”, a saber "Es mejor programar en ensamblador, porque C es lento”, después “Es mejor programar en C, porque C++ es lento” , “el mejor lenguaje para programar aplicaciones empresariales es COBOL”, posteriormente “Java es el mejor lenguaje de programación empresarial y siempre va a ser vigente”, y esto se va repetir para los lenguajes actuales y los futuros. Hay que comprender que nuestro mercado es cambiante, abarca multitud de actividades humanas y seguramente en el futuro próximo abarque más todavía. Es necesario el cambio y la adaptación, si hay algo mejor, no podemos quedarnos en nuestra zona de confort, necesitamos actualizarnos y adaptarnos, para poder suplir con suficiente rapidez las necesidades de nuestro negocio.

A continuación las diferentes generaciones (las fechas con aproximadas):

Lenguaje de primera generación (años 40 y 50)


Aquí tenemos elementos programables, a través de ceros y unos, código máquina. Las primeras computadoras programables (que no se programaban desplazando elementos hardware), recibían instrucciones a través de códigos en binario, y se programaba directamente hacia el hardware.

Evidentemente cada computadora tenía su propia secuencia de ceros y unos y cada secuencia hacia una cosa diferente, debido a que realmente estas máquinas no podían hacer muchas cosas (Según nuestra perspectiva actual) dicho conjunto de instrucciones era más o menos manejable. Y limitado.


Lenguajes de segunda generación (a partir de los años 50)


La potencia de las computadoras aumento, así como su diversificación, manejar y comprender toda esa secuencia de unos y ceros, se convierte en una tarea colosal, y mantener un programa en una odisea inmensa, llena de dificultades.

Se crea un lenguaje basado en mnemotécnicos llamado ensamblador, cada sentencia corresponde directamente a una secuencia de ceros y uno que comprende el procesador. Así tenemos por un lado un lenguaje basando en sentencias comprensibles por los programadores, y por otro lado fácilmente traducible a código máquina.


Lenguajes de tercera generación (Desde finales de los 50)


Repitamos esto:

“La potencia de las computadoras aumento así como su diversificación, manejar y comprender toda esa secuencia enorme de nemotécnicos, se convierte en una tarea colosal, y mantener un programa en una odisea inmensa llena de dificultades.”

Solo cambiamos algunas palabras, pero el enfoque sigue siendo lo mismo, el hardware puede hacer más, el software lo debe aprovechar.

Aquí tenemos lenguajes ya más alejados de las sentencias propias de una computadora y mucho más cercanos a una forma de resolver problemas más “humana”.


Las características son:

  • Lenguajes más comprensibles, incluso aunque no se conozca el lenguaje en sí, muy parecidos al inglés.
  • Una mayor estructuración del código, se comienza a dividir el código en segmentos que son reusables.
  • Los lenguajes suelen tener un propósito general.
  • Al ser más alejados de las instrucciones de la CPU, es más sencillo crear lenguajes que son más fácilmente traducibles entre plataformas distintas.

Algunos ejemplos son:

  • Pascal
  • C
  • Fortran
  • COBOL
  • C++

Lenguajes de 4 Generación (A partir de los 70, pero con un impacto realmente importante a partir de mediados de los 90)


Se acentúa las necesidades comerciales y diarias con respecto al desarrollo de software y la automatización de cualquier mercado imaginable. La informática llega a nuestros hogares y empresas.

Es necesario crear software, crearlo adaptable y funcional pero sobre todo rápido.


Los lenguajes en esta generación tienen las siguientes características:

  • Frecuentemente, aunque pueden (y suelen) tener la etiqueta multipropósito, si tienen un propósito en específico, como la creación de software empresarial. Cuando este propósito es muy específico, tal que solo sirven para atacar un ámbito en particular, se llaman Domain Specific Languages (DSL)

    Los DSL son por ejemplo SQL (para la generación de consultas), HTML o CSS (para la generación de páginas de internet)… en su momento JavaScript, podría considerarse un DSL (para agregar dinamismo a una página estática), pero ha evolucionado tanto y se puede usar de formas tan variadas, que sería un error colocarlo como DSL.

  • Hay realmente un énfasis especial en el software empresarial, como tal hay también un gran auge en la conexión y uso de bases de datos.
  • El reusó de los componentes es extremadamente común y pueden ser componentes gráficos en muchas ocasiones, complementándose con poderosos IDE. Además suelen estar disponibles por diversos medios y ser fácilmente accesibles (como por MAVEN, gemas de Ruby o NuGet).
  • Se delegan en arquitecturas basadas en servicios, en los que hay una aplicación consumidora y un servidor que procesa las peticiones.
  • Se cuenta con multitud de herramientas que generan código automáticamente.
  • Los lenguajes suelen ser multiplaforma, independientes de la arquitectura de las maquinas donde corren.

Ejemplos

  • La arquitectura .NET (C#, VB.NET).
  • SQL
  • HTML, CSS (Si, aunque te parezca extraño son DSL)




Si te ha gustado la entrada, ¡Compártela! ;-)

Nota: Puedes encontrar todo el código fuente de este artículo en https://github.com/jbautistamartin/ParadigmasTiposLenguajes