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