Hay numerosos y diferentes lenguajes de programación pero solo una docena tienen una cuota de uso significativa. Muchos comparten características y algunos lenguajes las van incorporando a medida que se demuestra que sus beneficios son mayores que la complejidad que pueden añadir. Veamos algunas de sus propiedades.
Hay cantidad de lenguajes de programación, algunas diferencias entre ellos se encuentran su propósito (general o específico para cierto tipo de tareas), en la sintaxis, el sistema de tipos, por los paradigmas de programación que soporta (POO, imperativo, funcional, …), otras diferencias están en la librerías disponibles, frameworks o comunidad, sin embargo, la mayoría comparten algunas características por las que se pueden catalogar los lenguajes. En este artículo comentaré algunas de estas características por las que podemos catalogar y agrupar los lenguajes de programación.
Describiré brevemente cada una de las características ya que están muy bien explicadas en cada una de sus páginas de la wikipedia.
Compilado
En un lenguaje compilado el código fuente fuente antes de ser ejecutado es convertido a lenguaje máquina (C, C++) aunque también puede ser convertido a representación intermedia que posteriormente es interpretada y convertida a lenguaje máquina JIT (Java, C#). El compilador puede detectar una gran cantidad de errores que en un lenguaje interpretado o de tipado dinámico se descubrirían en tiempo de ejecución. Wikipedia.
Interpretado
En un lenguaje interpretado el código fuente es compilado a código máquina en el momento de su ejecución (Python, Ruby, PHP, JavaScript). Wikipedia.
Orientado a objetos
Parte del éxito de los lenguajes orientado a objetos se debe a conceptos como la herencia que es una forma de reutilizar el código de la clase de la que se hereda, el polimorfismo con la que un mismo método puede estar implementado de diferente forma en función de la clase que lo implementa en la jerarquía de clases construida con la herencia, la sobrecarga usar un mismo método con diferentes parámetros y también igual o más importante la encapsulación con la que se ocultan los detalles internos del funcionamiento de la clase siendo únicamente posible manejar la clase a través de la interfaz (métodos) que ofrece.
Tipado estático
En un lenguaje de tipado estático las comprobaciones de tipos se realizan en tiempo de compilación (C, C++, Java). Los tipos pueden ser declarados de forma explícita o de forma inferida según el análisis del código fuente que realiza el compilador. Wikipedia.
Tipado dinámico
Por el contrario el tipado dinámico comprueba los tipos en el momento de ejecución del programa (PHP, Python, Groovy, JavaScript). A esos lenguajes se les conoce como lenguajes dinámicos. Wikipedia.
The Inconvenient Truth About Dynamic vs. Static Typing
Fuertemente y débilmente tipado
En un lenguaje fuertemente tipado un dato con un tipo no puede ser usado como si fuese de otro. Aunque algunos lenguajes como Java se dicen que son fuertemente tipado tienen algunas laxitudes. Por ejemplo, en Java un float puede usarse como si fuese un double y en otros lenguajes con menor grado de tipificación como PHP un string puede ser usado como un dato numérico. Wikipedia
Lenguajes fuertemente, débilmente, estáticamente y dinámicamente tipados
Otras características que se suelen mencionar al hablar de lenguajes de programación.
Inferencia de tipos
En base al análisis del código fuente se puede inferir el tipo de las variables evitando que el programador los declare explícitamente continuamente. Wkipedia.
Closures y Lambdas
Un closure es una referencia a una función que puede referenciar las variables del contexto en el que está definida. Una lambda es simplemente una referencia a una función anónima. En Java las lambdas puede referenciar variables declaradas como final, esto es, sean constantes. Wikipedia.
Defaults methods y Traits
Un trait define una colección de métodos posiblemente incluyendo también su implementación, además, pueden definir propiedades. Los defaults methods de Java pueden definir implementaciones en algunos métodos de interfaces. Wikipedia.
High Order Functions
Las funciones de orden superior son funciones que toman como argumentos una o más funciones o devuelven como resultado otra función. Wikipedia.
Currying
La currificación consiste en transformar una función con al menos dos argumentos en una función con al menos un argumento menos. Wikpedia.
Duck typing
Este concepto es usado en los lenguajes de tipado dinámico tratando a las variables no por su tipo o herencia sino en base a las propiedades y métodos que soporta (Python, PHP, Groovy, JavaScript). Wikipedia.
Intersection types y Union types
Ceylon tiene un sistema de tipos más avanzado (y complejo) que Java, una expresión es asignable a un intersection typesX & Y si esa expresión es asignable a X e Y individualmente. Una expresión es asignable a un union typeX | Y si es asignable a X o Y.
Union, intersection, and enumerated types
Named arguments
Cuando invocamos un método con argumentos, los argumentos se asignan a los parámetros de la función según el orden en que son declarados. Los named arguments permiten asignar los argumentos a los parámetros de la función por sus nombres. Wikipedia.
Destructuring assignment
La asignación desestructurada permite extraer datos de arrays y objetos usando una sintaxis réplica de la construcción de arrays y literales de objetos. MDN.
Tuples
Las tuplas son una estructura de datos formada por varios tipos, en Java 8 puede usarse la librería Javaslang que añade esto y otras funcionalidades interesantes. En algunos lenguajes puede combinarse con la asignación desestructurada. Ceylon Tuples.
Referencia:
Novedades y nuevas características de Java 8
10 razones para seguir usando Java