Mucha gente piensa: «¿Para qué, por qué debo aprender otro lenguaje de programación?». Para ellos es un esfuerzo extra que evitan al máximo.

¿Acaso lo que tenemos no es suficiente?

¿Acaso las herramientas que ya tenemos no funcionan?

Y luego están los exploradores incansables, que nunca se resisten a probar algo nuevo y tropezar con alguna «delicia». Para ellos, aprender es un fin en sí mismo y no es necesario convencerlos mucho para que pasen todo el fin de semana creando un juego de cartas de consola en algún lenguaje nuevo e incomprensible.

No importa a qué grupo pertenezcas, hay algo indiscutible: todos estamos dispuestos a invertir tiempo para asegurar un futuro brillante.

En cuanto a los amantes de los reliquias del pasado, su lenguaje favorito ya tiene una buena dinámica y un futuro brillante. Pero debo recordarles que su conjunto de herramientas de desarrollo ya establecido, que tanto aman, alguna vez fue algo que nadie quería usar. Así es ahora; llegan nuevas tecnologías, listas para ayudar a resolver nuevos problemas y facilitar las dificultades del desarrollo.

Si algo empieza a hacer esto de manera significativa, lo más probable es que siga ganando popularidad y obtenga mejores resultados. Y cuando eso sucede, creo que no querrás quedarte atrás.

Y para aquellos que aman todo lo nuevo, hay una advertencia: la diversión es importante, pero ten cuidado de no gastar tu energía sin rumbo.

Claro, Brainfuck es un lenguaje muy complicado, parecido a un rompecabezas, bastante divertido y pequeño, pero es poco probable que te beneficie un estudio serio de este lenguaje. Necesitas algo nuevo, sensato y que tenga una base sólida.

Y si solo es por diversión, mejor revisa +20 Lenguajes de Programación de lo Más Extraños.

Variedad de lenguajes programación
Variedad de lenguajes programación

Cómo Elegir estos Lenguajes

El proceso de elección de un lenguaje parece desalentador, especialmente cuando se trata de nuevos lenguajes que pueden darte una ventaja en tu trabajo y simplemente darte placer. Cada autor de lenguaje está firmemente convencido de haber creado el lenguaje ideal, capaz de resolver todos los problemas. Entonces, ¿cómo elegir?

En este artículo, me he centrado en varios parámetros que te ayudarán a abordar la elección de forma sensata.

Fecha de lanzamiento

He evitado deliberadamente los lenguajes muy, muy nuevos.

Por «nuevos» me refiero a lenguajes que, en el momento de escribir este artículo, no tenían más de 5-6 años, y especialmente aquellos que no son estables (es decir, son versiones 1.0). Pero espero que algún día vuelva a esto y escriba también sobre su éxito.

En mi opinión, la media dorada es de 5 a 12 años. El lenguaje ya se ha estabilizado y solo se está perfeccionando. Hay, por supuesto, excepciones a la regla y se analizarán en los casos correspondientes.

Enorme interés de la comunidad

Esto es obvio, pero a menudo se pasa por alto, especialmente cuando se trata de algo nuevo y emocionante. Hoy en día, muchos creen que el apoyo de una gran empresa garantiza el éxito, pero no siempre es así.

Sin duda, Objective-C de Apple, y ahora Swift, prosperaron porque eran las únicas opciones para un ecosistema estrictamente controlado, pero D y Hack de Facebook (en mi opinión, una versión horrible de un lenguaje ya horrible) se quedaron como simples experimentos.

La combinación ideal es un lenguaje que tenga el apoyo de una gran empresa estable y que gane popularidad activamente (por ejemplo, React).

Pero la esencia del problema sigue estando en la comunidad. Si el lenguaje no causa expectación y no hay suficientes desarrolladores para la formación y la popularización, no podrá salir de la «fosa» de GitHub.

Para mí, este punto descarta lenguajes tan desarrollados e interesantes como Racket y Erlang, ya que no han avanzado en la curva de crecimiento.

Propuesta de valor única, específica y bien definida

Lo tercero a lo que presto atención es al objetivo claro del lenguaje. Por ejemplo, la mejor versión de PHP, en la que se han corregido los problemas con los nombres y que se compila en PHP nativo, no es para mí.

Hay muy pocas ventajas para justificar la ruptura, si de repente todos intentan cambiar a esta versión. Según el mismo criterio, no puedo dejar de descartar empresas como CoffeeScript y muchos otros lenguajes que se compilan en JavaScript.

Para ser honesto, siempre rechazaría las mejoras relacionadas con la sintaxis. La experiencia demuestra que, cuando se trata de lenguajes, la integridad prevalece sobre la comodidad, por lo que si un nuevo lenguaje presta mucha atención a una interacción más agradable, lamentablemente, no entrará en esta lista.

Sintaxis clara y coherente

Sí, lo sé. Acabo de decir que la sintaxis no importa. Bueno, para ser más preciso, dije que «las mejoras relacionadas solo con la sintaxis» no tienen importancia. Pero hay que destacar que la sintaxis sigue siendo uno de los factores importantes que influyen en la productividad del programador y en la facilidad de mantenimiento. Por eso, estará presente en mis exposiciones.

Con el concepto de «sintaxis», se nos viene a la mente «coherencia». Hay puntos clave en los que un lenguaje simplemente no puede permitirse equivocarse: nombres de funciones, estructuración de módulos, etc. Estamos en +2024 y, por el amor de Dios, otro lenguaje similar a PHP será una vergüenza para todos nosotros. Así que, sin más preámbulos, empecemos con nuestras mejores recomendaciones.

1. Julia

Para los empleados del MIT, la elección de un lenguaje que pudiera utilizarse para la ciencia de datos era, en el mejor de los casos, un compromiso. A pesar de toda su claridad y popularidad, Python no tenía construcciones incorporadas para trabajar con objetos de datos. Además, como Python es un lenguaje interpretado, era bastante lento para ellos (tenga en cuenta que no se trata de bibliotecas, ya que la mayoría están escritas en C).

Es posible que los aspectos más desalentadores fueran el modelo bastante complicado de procesamiento de datos multihilo y la ausencia de un modelo de computación paralela (y este último es un elemento fundamental de los superordenadores).

Como resultado, nació un lenguaje como Julia.

Esto es lo que se dice sobre sus capacidades en el sitio web oficial:

Julia supera a los demás en cuanto a cálculo numérico. Su sintaxis es ideal para las matemáticas, admite una gran cantidad de tipos de datos numéricos y ya tiene un paralelismo integrado. La múltiple distribución de Julia es ideal para definir tipos de datos numéricos y de tipo matriz.

En cuanto a la sintaxis, Julia es una combinación de Python y C. Sí, es posible que este sea el primer caso en el que un lenguaje ha conseguido combinar lo mejor de ambos mundos.

Para facilitar el trabajo, Julia no requiere una tipificación estricta y es increíblemente rápido por sí mismo. Aquí tienes algunos datos para una evaluación comparativa:

Micro-puntos de referencia de Julia
Micro-puntos de referencia de Julia (fuente)

Como puedes ver, Julia es un poco peor que C, pero destroza a Java y Python. ¿Qué es lo que hace tan atractivo a Julia?

Bueno, por ejemplo, la implementación de una función que calcula la hipotenusa de un triángulo rectángulo:

function hypot(x,y)
    x = abs(x)
    y = abs(y)
    if x > y
        r = y/x
        return x*sqrt(1+r*r)
    end
    if y == 0
        return zero(x)
    end
    r = x/y
    return y*sqrt(1+r*r)
end

En definitiva, a pesar de que la mayor parte del ecosistema de Julia está orientada hacia las matemáticas, creo que tiene un gran futuro en otras áreas.

Que yo sepa, este es el primer lenguaje que admite la computación paralela de alto nivel. Así que no es de extrañar que esté ganando popularidad en los campos de las tecnologías web y la Internet de las cosas.

2. Rust

Si has probado a trabajar con las nuevas versiones de Firefox, debes haberte dado cuenta de que, por fin, después de tantos años de trabajo, pueden arrebatarle una parte del mercado a Chrome.

El navegador se ha vuelto ligero y muy rápido, y la renderización se realiza casi al instante, todo gracias al lenguaje que Mozilla ha desarrollado específicamente para este navegador. Y es Rust.

Si te digo que Rust tiene un futuro más brillante, estaría mintiendo; el lenguaje ya es un gran éxito, y si aún no has oído hablar de él, es porque su ámbito de aplicación es bastante estrecho y el objetivo de su creación es bastante intimidante: ¡reemplazar a C++! Sí, por fin tenemos un lenguaje que no solo es capaz de hacerlo, sino que ya ha empezado.

Para aquellos que están descontentos con la estructura sobrecargada de C++ y los problemas de gestión de memoria, Rust será un soplo de aire fresco.

Así es como se ve un programa escrito en Rust:

fn is_odd(n: u32) -> bool {
    n % 2 == 1 // Retorna true si n es impar, de lo contrario false
}

fn main() {
    println!("Encuentra la suma de todos los cuadrados de números impares menores que 1000"); // Imprime un mensaje en la consola
    let upper = 1000; // Define el límite superior
    let sum_of_squared_odd_numbers: u32 = 
        (0..)
        . // Crea un rango infinito de números naturales
        map(|n| n * n) 
        . // Calcula el cuadrado de cada número en el rango
        take_while(|&n_squared| n_squared <= upper) 
        . // Toma los números cuadrados que son menores o iguales al límite superior
        filter(|&n_squared| is_odd(n_squared)) 
        . // Filtra los números cuadrados que son impares
        fold(0, |acc, n_squared| acc + n_squared); // Suma todos los números cuadrados impares, comenzando con 0 
        
    println!("La suma de los cuadrados de los números impares menores que 1000 es: {}", sum_of_squared_odd_numbers); // Imprime el resultado
}

En mi opinión, simple y con gusto. Rust se adhiere al enfoque de la programación funcional, que hace que tu código sea más adecuado para la composición, y no hay jerarquías orientadas a objetos sobre las que tengas que pensar.

Entonces, ¿qué le da a Rust la valentía de aspirar a ocupar el lugar de C++? Un nuevo modelo de memoria. En lugar del viejo juego new()/delete(), Rust ha introducido el concepto de «posesión».

En lugar de asignar memoria y acceder a ella directamente, las variables en Rust se «prestan» entre sí, siguiendo estrictas limitaciones impuestas por el compilador. El concepto general es demasiado complejo para explicarlo en unas pocas palabras, así que no dudes en consultar la documentación oficial para obtener más información.

La cuestión es que, de esta manera, se garantiza la seguridad de la memoria al 100%, sin necesidad de utilizar un recolector de basura, lo que es bastante importante.

Rust conquistó el mundo de repente. Algunas plataformas ya lo admiten; permite a los navegadores y mecanismos de visualización reemplazar rápidamente el código C/C++ en sistemas industriales; además, se utiliza para escribir sistemas operativos.

Claro, el proceso de crear otro navegador o controlador de dispositivo no es para todos, pero Rust ya se ha extendido a otras áreas. Ya tenemos algunos frameworks web totalmente funcionales y extremadamente rápidos escritos en Rust, y se están desarrollando cada vez más bibliotecas para aplicaciones.

Para ser sincero, si te interesa un futuro brillante, Rust es el lenguaje perfecto y ahora es el momento de empezar a aprenderlo. Rust es como un avión que ya ha despegado, pero todavía tienes tiempo de subir a bordo y dirigirte a las estrellas.

3. Elixir

Si hablamos de lenguajes que para los desarrolladores son como un pequeño trozo de felicidad, el primer puesto lo ocupa Ruby, y esto es definitivo e irrevocable. Es un lenguaje que suena como poesía. Además, tiene bastantes abreviaturas que reducen considerablemente la cantidad de trabajo mental.

Por lo tanto, es natural que el framework Rails siga dominando el campo del desarrollo de pila completa entre los desarrolladores serios y las startups. Sin embargo, Rails no gustaba a todos, especialmente a uno de sus principales desarrolladores, José Valim. Creo que el mejor modo de describir el origen de este lenguaje es el que dio el propio creador en una entrevista:

Es una larga historia, pero intentaré no alargarla y exponerla de una forma más sencilla y agradable. En 2010, trabajaba en la mejora del rendimiento de Rails cuando trabajaba con sistemas multinúcleo, ya que nuestros ordenadores y sistemas de producción se suministraban con cada vez más núcleos. Sin embargo, hiciera lo que hiciera, no había resultado, ya que Ruby no tenía la herramienta adecuada para resolver los problemas de paralelismo. Fue entonces cuando empecé a estudiar otras tecnologías y en un momento dado me enamoré, me enamoré de la máquina virtual Erlang.

Empecé a utilizar Erlang en el trabajo cada vez más y con el tiempo me di cuenta de que me faltaban algunas construcciones que existen en otros lenguajes, incluido el funcional. Y en ese momento decidí crear Elixir como un intento de unir diferentes construcciones y herramientas excelentes con la máquina virtual Erlang.

¡Y, oh, sorpresa, nació Elixir!

Al igual que Scala mejora Java, pero en realidad establece un punto de referencia para la máquina virtual (JVM), Elixir utiliza las ventajas de la máquina virtual Erlang, probada durante décadas.

En este punto, hablar de Erlang queda fuera del alcance de este artículo, pero al menos debes saber que es el secreto de la industria de las telecomunicaciones que se guarda celosamente: si nuestras redes telefónicas son mucho más fiables que nuestras sistemas web, es gracias a Erlang.

En otras palabras, esto significa lo siguiente:

Si estás creando un sistema que funciona en tiempo real, como un chat, Elixir requerirá mucha menos memoria que Ruby (o PHP, Python e incluso Java), y también será más estable.

Un ordenador que ejecuta Ruby y que utiliza como máximo 10.000 conexiones simultáneas, puede manejar fácilmente 200.000 si utiliza Elixir, ¡y todavía tendrá suficiente memoria para ejecutar juegos en 2D!

Fragmento de código de Elixir

...
def start_link(name, opts \\ []) do
  GenServer.start_link(__MODULE__, {name}, opts)
end

def init({name}) do
  require Logger
  Logger.log :debug, "Started channel #{name}!"
  :pg2.join(:channels, self)
  :ets.insert(:channels, {name, self})
  users = :ets.new(:users, [:set, :protected])
  {:ok, {name, users, 1}}
end

def handle_call({:send, message}, _from, {name, _users, _buffer} = state) do
  ChatApp.Util.sendPM(name, message)
  {:reply, :ok, state}
end

def handle_call({:rename_user, old_nick, new_nick}, _from, {_, users, _buffer} = state) do
  case :ets.lookup(users, old_nick) do
    [{old_nick, user}] ->
      new_user = %{user | nick: new_nick}
      :ets.delete(users, old_nick)
      :ets.insert(users, {new_nick, new_user})
    [] ->
      :ok
  end
  {:reply, :ok, state}
end

..

En cuanto a la sintaxis, Elixir copia descaradamente a Ruby, y su principal framework web (Phoenix) copia descaradamente a Rails. En mi opinión, esto está bien, porque, si lo comparamos con Laravel, Grails, Masonite, etc., hemos llegado a un punto en el que todos los lenguajes tienen frameworks similares a Rails, lo que puede facilitar la transición de un framework a otro. Algunos pueden burlarse de la «falta de originalidad», pero, en cualquier caso, yo no me quejo.

En definitiva, Elixir es una de esas tecnologías que aporta algo nuevo y, además, es cómoda y diabólicamente práctica. Varios centros de desarrollo que utilizan Ruby (y no solo) están pasando a Elixir, y grandes empresas como Pinterest lo han utilizado en el desarrollo con resultados muy impresionantes.

4. Kotlin

En 2017, Google I/O lanzó una «bomba» sobre una multitud desprevenida. La empresa anunció oficialmente que Kotlin se había convertido en el lenguaje principal de desarrollo para Android. Esto provocó una ola de indignación en el sector.

Hoy en día, no es ninguna sorpresa que Google busque activamente un sustituto de Java, especialmente después de la demanda de Oracle; y sin embargo, el cambio a Kotlin fue un poco inesperado, y todavía existe una gran probabilidad de que Google lance pronto su propia máquina virtual. Sin embargo, por ahora, Kotlin está disfrutando de una ola de popularidad.

Kotlin fue desarrollado por JetBrains, que es más conocida por su serie de editores de código increíblemente buenos. Uno de esos editores, IntelliJ IDEA, es la base de Android Studio. Kotlin se desarrolló con varios objetivos: seguridad, concisión y compatibilidad total con Java.

El compilador de Kotlin, como ningún otro, trabaja incansablemente para eliminar cualquier excepción de puntero nulo, que es muy común en Java. Además, en parte, resuelve los problemas de la conocida verbosidad de Java, lo que ha sido un alivio para muchas personas.

A continuación, se muestra una comparación del código de Java y Kotlin:

Comparación del código de Java y Kotlin
Comparación del código de Java y Kotlin

El código de Kotlin tiene una forma mucho más corta y una carga cognitiva mucho menor al ejecutarse.

Pero aclaremos una cosa: aunque Kotlin se está convirtiendo rápidamente en el favorito, es muy poco probable que reemplace a Java. Creo que, dentro de décadas, los equipos pequeños no mirarán nada más que Kotlin, mientras que los grandes seguirán utilizando Java únicamente por razones establecidas.

Sea como fuere, Kotlin tiene un gran futuro, ya que hace lo mismo que Java, puede integrarse con el código de Java sin que nadie lo note, ¡pero es más agradable!

5. TypeScript

¡Dios sabe cómo me he contenido para no poner otro lenguaje en este lugar! Todo en mi interior gritaba: «¡Elm! ¡Elm!», pero no importa lo revolucionarias que sean sus ideas y lo divino que sea su sintaxis, Elm no se considera una alternativa típica para trabajar con la interfaz. Sea como fuere, echemos un vistazo a lo que es típico: TypeScript.

JavaScript es como las bayas silvestres: desagradable y desagradable, pero tendrás que digerirlo para sobrevivir en la jungla del desarrollo frontend. Se han hecho muchos intentos para reemplazarlo (y, es muy probable que el nuevo estándar WebAssembly tenga éxito en ello), pero hay una cosa que ha llamado realmente la atención de todos: un superconjunto desarrollado por Microsoft.

Es muy probable que ya hayas oído hablar de TypeScript: fue el primero en utilizarlo el framework Angular (a partir de la segunda versión), y la gente se fijó en él con bastante rapidez. Todo porque TypeScript añadió características extremadamente necesarias y simplemente increíbles al lenguaje de programación más conocido del mundo.

¡Sí, por fin puedes escribir tu propio código JavaScript sin sufrir y sin pensar «por qué nací»!

Estas son las características adicionales que ha añadido TypeScript:

  • Tipificación estricta: al final, una cadena no es un número, y un número no es un objeto que no es una matriz vacía.
  • Comprobación de tipos realizada durante la compilación: si tu código se compila correctamente, es muy probable que no haya problemas relacionados con la ejecución de JavaScript.
  • Clases y módulos: sí, para ES6 las clases son algo estándar, pero también están en TypeScript, y además, tiene un sistema de módulos ordenado.
  • Definición de tipos: en cuanto a los tipos complejos, el compilador puede definirlos fácilmente y no tendrás que romperte la cabeza.
  • Async/await: las palabras clave y los patrones async/await son la base, por lo que ya no tienes que perder el tiempo con promesas y devoluciones de llamada.

Espacio de nombres, generalizaciones, tuplas… podría seguir eternamente, pero basta decir que TypeScript convierte uno de los peores procesos de desarrollo en uno de los mejores.

Fragmento de código de TypeScript

class Animal {
  private name: string; // Propiedades privadas deben ser inicializadas en el constructor

  constructor(theName: string) { // Corrección: falta un paréntesis de cierre en el constructor
    this.name = theName; 
  }
}

class Rhino extends Animal {
  constructor() { 
    super("Rhino"); // Llama al constructor de la clase padre
  }
}

class Employee {
  private name: string; // Propiedades privadas deben ser inicializadas en el constructor

  constructor(theName: string) { // Corrección: falta un paréntesis de cierre en el constructor
    this.name = theName; 
  }
}

let animal = new Animal("Goat"); 
let rhino = new Rhino();
let employee = new Employee("Bob"); 

animal = rhino; // Correcto: Rhino hereda de Animal
animal = employee; // Error: 'Animal' y 'Employee' no son compatibles 

// animal = "Hola"; // Error: No se puede asignar una cadena a una variable de tipo Animal

El hecho de que TypeScript haya tenido una influencia es innegable. Eliminó del juego experimentos como Dart de Google (aunque está intentando volver al juego gracias a Flutter, un framework para el desarrollo móvil), y abrió los ojos a los desarrolladores de JS sobre las ventajas de los tipos más fuertes.

Como resultado, bibliotecas tan importantes como React, D3, Vue (e incluso jQuery) ahora tienen una versión para TypeScript, y las mejores empresas de la industria del software de todo el mundo están reescribiendo el código JavaScript en TypeScript. Y ahora los encabezados de TypeScript se pueden utilizar también en Node.js (para ser honesto, si Node puede mejorar su paralelismo y corregir la estúpida gestión de memoria, existirá eternamente).

Puede que te sorprenda, pero el creador de Node.js, después de declarar públicamente que se arrepiente de su desarrollo, comenzó a trabajar en un nuevo entorno de ejecución (aún no hay sitio web oficial, solo un repositorio en GitHub), y su lenguaje principal es TypeScript.

¿Sabes cuál es la mejor noticia? TypeScript es un lenguaje pequeño, cuyo aprendizaje dará sus frutos en el futuro. Si eres un desarrollador de JavaScript de nivel medio, puedes aprender TypeScript en un par de días para poder trasladar completamente tu código existente a él.

6. Elm

Elm es tan rápido como rápido se puede pronunciar su nombre. Se utiliza para aplicaciones cliente, gráficos y juegos. Este lenguaje de programación funcional fue creado en 2012 por Evan Czaplicki.

Se rumorea que Elm no genera excepciones en tiempo de ejecución, ahí es donde brilla. Como es un lenguaje con tipificación estática, el compilador comprueba el código en busca de errores durante la compilación (¡guau!) y emite mensajes útiles (estos mensajes son texto completo, no códigos extraños).

Aquí, los desarrolladores (¡los depuradores!) deben respirar aliviados. Podrás aprender a escribir código Elm, ya que recibirás más información sobre los errores: ¡el compilador te indicará qué está mal y te ofrecerá una forma de corregirlo!

Elm se jacta de ser más rápido que React y de estar más fuertemente tipificado que incluso TypeScript. El código Elm es bastante estructurado y conciso. Con él, podrás prosperar en tu carrera de desarrollador.

Elm es modular, lo que significa que puedes crear componentes que se pueden reutilizar. Elm se compila en JavaScript, que se puede ejecutar en el navegador. Así que, todo lo que necesitas es node y npm, y podrás instalar y empezar a trabajar con Elm fácilmente con el siguiente comando:

npm install -g elm@<version>

Puedes instalar la versión que quieras, por ejemplo, 0.19.1.

Después, puedes comprobar si Elm se ha instalado correctamente ejecutando el comando –version. Si no quieres realizar una instalación y configuración completa, puedes ir a su sitio web oficial y utilizar el editor en línea para experimentar.

¡Así que, vamos a experimentar un poco!

Si no utilizas el compilador en línea, tendrás que instalar todas las dependencias que necesitará el programa que vamos a escribir ahora (sin embargo, no es tan complicado).

Pidamos al usuario que introduzca su nombre en un campo de texto y lo imprimamos en la página de bienvenida.

import Browser

import Html exposing (Html, Attribute, div, input, text)

import Html.Attributes exposing (..)

import Html.Events exposing (onInput)

-- MAIN

main =

  Browser.sandbox { init = init, update = update, view = view }

-- MODEL

type alias Model =

  { content : String

  }

init : Model

init =

  { content = "" }

-- UPDATE

type Msg

  = Change String

update : Msg -> Model -> Model

update msg model =

  case msg of

    Change newContent ->

      { model | content = String.append "Hola..." newContent }

-- VIEW

view : Model -> Html Msg

view model =

  div []

    [ input [ placeholder "Escribe tu nombre", onInput Change ] []

    , div [] [ text (model.content) ]

    ]

Introducimos el nombre y esto es lo que vemos en la pantalla:

Ejemplo de código elm
Ejemplo de código elm

Aunque este programa pueda parecer demasiado potente para su propósito, a medida que la complejidad del programa aumente, sentirás lo fácil que se ha vuelto depurar y mantener.

Puedes ver que el modelo (model), la vista (view) y el controlador (controller) (actualización (update)) están claramente separados. Al igual que usamos etiquetas HTML, podemos crear formularios en Elm con etiquetas div del modelo.

Al producirse un evento onInput (es decir, cuando el usuario introduce texto), el programa llama a Change e imprime «Hola» junto con el nombre del usuario, utilizando la función String.append.

7. Pony

Pony es un lenguaje de programación compilado. Se adhiere al modelo de actores, que está diseñado para el comportamiento asíncrono, es decir, para aplicaciones con un alto grado de multihilo.

Los lenguajes de programación habituales utilizan la función «bloqueo» para realizar cálculos paralelos, lo que afecta al rendimiento. Pony no tiene esa función, por lo que evita el bloqueo de operaciones o el interbloqueo. Cada actor es monohilo.

Además, Pony proporciona seguridad basada en referencias obligatorias, es decir, los usuarios, para poder acceder a un objeto concreto, deben utilizar una «referencia obligatoria». De este modo, se garantiza un procesamiento seguro de los datos. Por ejemplo, los mandatos contienen información sobre qué alias son válidos y cuáles no.

Los mandatos son la base de conceptos como la «mutabilidad» y el «aislamiento». Estas prohibiciones liberan a Pony de la carrera de datos.

Pony es un lenguaje seguro, rápido y preciso. Reduce el tiempo que se tarda en desarrollar, lo que lo convierte en una excelente opción para aplicaciones bancarias y financieras.

Pony garantiza la seguridad de los tipos al procesar datos. No genera excepciones: para que el código se compile, los errores deben corregirse. Esto se debe principalmente a que Pony tiene tipificación estática. Antes de utilizar una variable, debes indicar explícitamente su tipo (por ejemplo, como en Java, pero no en Python).

let name: String

Aquí, como en Java, puedes crear constructores. Supongamos que tienes una clase Employee en la que se indican el nombre (name) y la edad (age):

class Employee

  let name: String

  let age: U64

  new create(name': String) =>

    name = name'

Los desarrolladores de Java deben haber notado que hay pequeñas diferencias en la sintaxis (¡guau! ¡no hay llaves!). Y después de los atributos de clase hay comillas. Además, puedes crear funciones:

fun get_emp_name(): String => name

Escribir funciones es muy divertido, ¿verdad?

Y ahora lo más importante: los actores y las promesas.

Los actores tienen comportamientos (Behaviors): algo parecido a las funciones, pero que se ejecutan de forma asíncrona. Se ejecutan en algún momento del futuro, pero no siempre inmediatamente después de que se hayan invocado. Pero «prometen» (promise) que los comportamientos se ejecutarán necesariamente.

actor Employee
  // El actor tiene campos, similar a una clase.
  let name: String

  // Y, por supuesto, un constructor.
  new create(name': String) =>
    name = name'

  // Observa que se utiliza "be" para definir un comportamiento, en lugar de "fun" para una función.
  be get_emp_name(promise: Promise[String]) => promise(name)

Bueno, las promesas pueden ser rechazadas, y de qué manera. Esto puede ocurrir si el actor no puede ejecutar la solicitud asíncrona enviada. Puedes crear una promesa:

// Create a new promise { // Crear una nueva promesa }
let promise = Promise[String]

E invocar el comportamiento del actor pasando la promesa (promesa) que debe ejecutarse (en nuestro caso, debemos obtener el nombre del empleado).

employee.emp_get_name(promise)

¿Crees que este código se compilará?

Pony tiene otra característica maravillosa: es seguro en lo que respecta a la memoria, es decir, no hay valores NULL ni desbordamientos de búfer. Cualquier código que pueda devolver null no se compilará hasta que se corrija este punto.

Bueno, todavía no le hemos dicho al programa quién es employee (empleado) (nuestro actor):

let employee = Employee("Leo Bytes")

A diferencia de cualquier otro lenguaje de programación, Pony permite la división por cero y devuelve cero como resultado. Y para todas las funciones de Pony hay pruebas matemáticas.

Para escribir programas en Pony, debes instalar el compilador correspondiente. Pony es un lenguaje compilado, así que antes de ejecutar el programa, debes compilarlo con el comando ponyc.

Una vez que hayas instalado el compilador, intenta escribir y ejecutar el programa «Hola. Mundo».

8. Vyper

Vyper es un lenguaje de programación diseñado para escribir contratos inteligentes. Se basa en Python. Al igual que Python, es fácil de entender para los humanos, fácil de escribir y seguro. Vyper se compila en bytecode de la máquina virtual de Ethereum (EVM – Ethereum Virtual Machine). EVM define el estado de éter para cada bloque en la cadena de bloques.

Para entender la peculiaridad de Vyper, vamos a analizar qué son los contratos inteligentes.

Los contratos inteligentes son programas que se almacenan en la cadena de bloques. Definen un acuerdo entre el vendedor y el comprador y, al cumplirse las condiciones del contrato, lo ejecutan.

Son contratos automáticos que se ejecutan por sí mismos y que no requieren intervención humana. Sin embargo, los contratos inteligentes son vulnerables.

Por ejemplo, los contratos inteligentes se pueden crear para transferir éter a direcciones arbitrarias, o pueden ser destruidos por direcciones arbitrarias, o incluso pueden carecer de la posibilidad de transferir éter. Estas vulnerabilidades suelen introducirse mediante el código, y esto se puede hacer tanto de forma intencionada como no intencionada.

Vyper elimina este problema proporcionando código seguro. Esto dificulta la introducción de código vulnerable o engañoso. A pesar de que Vyper se basa en Python, prácticamente no se adhiere a los paradigmas de la POO, que incluyen la herencia, la sobrecarga, la recursividad, etc. Esto ayuda a evitar la complejidad del código (tener varios archivos complica el proceso de auditoría).

Además, Vyper no admite código ensamblador integrado, lo que significa que los programas no pueden realizar acciones directamente en EVM. De este modo, se pueden evitar los ataques.

Todas estas características hacen que Vyper sea lo suficientemente seguro para escribir en él código para contratos inteligentes que se utilizan en la cadena de bloques.

Para practicar tus habilidades en la escritura de programas en Vyper, puedes utilizar el compilador en línea Remix.

Además, puedes instalar Vyper con docker o pip (si tienes Python). Para ello, sigue las instrucciones que se indican en la documentación de Vyper.

9. R

R es uno de los lenguajes de programación más populares que se utiliza para el análisis de datos y el aprendizaje automático. Tiene una API para todos los cálculos matemáticos, estadísticos y científicos complejos, los algoritmos de aprendizaje automático y la representación visual de datos.

R tiene código abierto y es ampliamente conocido por su interfaz gráfica de usuario con grandes funciones. Tiene una comunidad activa y sólida, y además, puede integrarse con otros lenguajes, como C, C++, etc.

Todas las funciones que hemos enumerado anteriormente se añaden desde CRAN (Comprehensive R Archive Network). Este repositorio contiene más de 10.000 paquetes para áreas como la estadística, la teoría de la probabilidad, el análisis de datos, los cálculos, los gráficos, etc.

Intentemos ejecutar un programa sencillo que calcule la media de 11 números y veamos toda la magia de R. Para encontrar la media, debemos tomar la suma de los números y dividirla por su cantidad (en nuestro caso, 11). Pero en R hay una función que se llama «mean» y que realiza todos estos cálculos por nosotros.

mynums <- c(51, 52, 53, 94, 88, 61, 31, 34, 76, 20, 10)

mean(mynums)

El resultado será el siguiente:

[1] 51.81818

Podemos representar un gráfico con el método plot:

boxplot(mynums)
Gráfico con boxplot
Gráfico con boxplot

En R hay un gran número de paquetes ampliados, como ggplot2, dplyr, etc., que permiten mostrar gráficos ricos.

Además, podemos construir rápidamente un histograma para los valores anteriores para ver el rango en el que se encuentran.

hist(mynums, breaks = 10, col = "sky blue", main = "Histogram of marks", xlab = "Height", ylab = "Frecuency",  cex.main = 1.2) 
Histograma con R
Histograma con R

Ten en cuenta que hemos elegido un paso de 10, pero puedes cambiarlo en función de las divisiones que necesite.

La variable mynum, que se ha presentado anteriormente, es un vector que contiene una lista de números. Aquí, como en Python, para trabajar con una gran cantidad de dimensiones, creamos un marco de datos (dataframe).

Esto es más útil para el análisis de datos. Por ejemplo, podemos combinar varios vectores, crear un marco de datos y manipularlos en función del número de variables y del tipo de análisis.

Supongamos que tenemos los vectores name, skill y age. Podemos crear un marco de datos y mostrar todos los datos juntos en pantalla:

employees = data.frame(Name = c("John","Mac","April","Ron","Matt"),

                        Age = c(23,28,30,43,31), Skill = c("Java", "Python", "C++", "R", "PHP"))

print(employees)
> print(employees)

    Name Age  Skill

1   John  23   Java

2    Mac  28 Python

3  April  30    C++

4 Ron  43      R

5 Matt  31    PHP

R tiene otra característica bastante interesante. Permite manipular matrices sin ningún esfuerzo. R te dejará boquiabierto con la facilidad con la que realiza cálculos con matrices. Todo lo que te pide es que crees una matriz y se la pases al programa.

M1 <- matrix(c(1, 2, 1, 2), ncol=2)

M2 <- matrix(c(3, 4, 3, 4), ncol=2)

print(M1*M2)
>print(M1*M2)

     [,1] [,2]

[1,]    3    3

[2,]    8    8

10. Apache Groovy

Lo he pensado detenidamente, he sopesado todos los pros y los contras y he decidido incluir Groovy en mi lista de los mejores lenguajes de programación. Este lenguaje es como un trozo de mantequilla derretida sobre un delicioso pastel, que le da un sabor extra, mejorando cualquier proyecto.

Una de las principales razones por las que Groovy se ha ganado un puesto en esta lista es el amplio abanico de funciones que han contribuido al aumento de su popularidad en el mundo de la tecnología. Es un lenguaje dinámico flexible, diseñado para la máquina virtual de Java (JVM – Java Virtual Machine). Ofrece a los desarrolladores de Java herramientas de software modernas, y al mismo tiempo, tiene una curva de aprendizaje mínima.

Es importante destacar que JVM es una abreviatura que se traduce como «Java Virtual Machine», por lo que JVM es una parte integral de Java, que proporciona una plataforma para ejecutar el bytecode de Java en cualquier dispositivo. Groovy se creó a partir de JVM y ofrece una amplia gama de funciones que mejoran su rendimiento, lo que lo hace bastante atractivo para los desarrolladores.

En otras palabras, proporciona una plataforma para ejecutar el bytecode de Java, lo que, a su vez, permite utilizar Java en cualquier dispositivo. Si se observa desde el punto de vista del rendimiento, Groovy puede comprobar estáticamente la compatibilidad de los tipos y compilar el código, lo que aumenta el rendimiento y el nivel de fiabilidad.

Groovy puede integrarse totalmente con las clases y bibliotecas de Java existentes, lo que lo diferencia de otros lenguajes de programación. Además, puede compilarse directamente en bytecode de Java. Gracias a esto, se puede utilizar sin problemas en cualquier lugar donde se pueda utilizar Java. Esta función hace que Groovy sea aún más flexible y versátil, así como una opción ideal para los desarrolladores que quieren desarrollar software eficiente y fiable.

Groovy tiene un posible inconveniente: Groovy es un lenguaje dinámico, y esto puede hacer que la comprobación de la compatibilidad de los tipos sea problemática y el proceso de depuración, complejo. Sin embargo, muchos programadores consideran que la flexibilidad y la simplicidad de Groovy compensan todos los posibles inconvenientes.

Es fundamental que los desarrolladores comprendan el valor único que aporta Groovy. Para ilustrarlo, me gustaría mostrarte un ejemplo que demuestra cómo las potentes funciones de Groovy pueden mejorar la calidad de tu código.

def greeting = "Hola, Mundo!"
println greeting

// Define una lista de números.
def numbers = [1, 2, 3, 4, 5]

// Usa una clausura para mapear la lista a sus cuadrados.
def squares = numbers.collect { it * it }

println squares

Este ejemplo ilustra la versatilidad y la expresividad de Groovy. Aquí se define una variable de cadena, que luego se imprime en la consola mediante la función println.

Entre otras cosas, demostramos cómo Groovy simplifica las operaciones complejas, por ejemplo, la transformación de una lista numérica mediante una función de cierre con el objetivo de crear una nueva lista que contenga los cuadrados de todos los números. Esto demuestra que Groovy puede aumentar tu productividad como desarrollador resolviendo tareas de programación habituales con una sintaxis concisa y fácil de entender.

En este sentido, queda claro que Groovy merece que se le preste atención.

11. Crystal

Después de hacer una investigación bastante extensa, no podíamos dejar de incluir Crystal en esta lista. ¡Y no, no estamos hablando de minerales! Crystal es un lenguaje de programación orientado a objetos multipropósito que fue lanzado en 2014. Fue diseñado para que su sintaxis se parezca a Ruby, pero a la vez sea rápido y eficiente. Gracias a su sistema de tipos estáticos y a la compilación previa a la ejecución, Crystal ofrece a los desarrolladores la velocidad de C y la sencillez de Ruby.

Crystal es un lenguaje de programación relativamente nuevo que está ganando popularidad entre los desarrolladores debido a su impresionante velocidad y facilidad de uso. A menudo se habla de él como «rápido como C, ágil como Ruby», destacando así su capacidad de brindar un rendimiento muy alto al mismo tiempo que se apoya en la sintaxis sencilla de Ruby y su alta legibilidad.

Sin embargo, para alcanzar su impresionante velocidad, Crystal sacrifica algunos aspectos dinámicos de Ruby y limita ciertas construcciones de programación. A pesar de esto, esta solución de compromiso ha hecho que Crystal sea una opción bastante atractiva para crear aplicaciones de alto rendimiento en un lenguaje más amigable para los desarrolladores.

# Define una clase para una persona con atributos de nombre y edad.
class Person
  getter name : String
  getter age : Int32

  def initialize(@name : String, @age : Int32)
  end
end

# Crea un arreglo de objetos Person.
people = [Person.new("Alice", 25), Person.new("Bob", 30), Person.new("Charlie", 35)]

# Usa un bloque para filtrar el arreglo por edad y mapear los nombres a mayúsculas.
names = people.select { |person| person.age >= 30 }.map { |person| person.name.upcase }

# Imprime el arreglo resultante de nombres en mayúsculas.
puts names.inspect

Este código demuestra las ventajas de Crystal relacionadas con su sintaxis, rendimiento y seguridad de tipos. La sintaxis de Crystal se parece a la de Ruby, lo que facilita la lectura y escritura de código. Al mismo tiempo, Crystal se compila en código de máquina, ejecutando así el programa mucho más rápido que los lenguajes interpretados como Ruby.

Además de todo esto, Crystal tiene tipado estático. Este hecho proporciona seguridad de tipos en la fase de compilación y mejora el rendimiento. En cuanto a este ejemplo, aquí el código utiliza un bloque de código para filtrar un array de objetos Person por edad y mapear los nombres a mayúsculas. Además, aquí se demuestra a la perfección la flexibilidad y expresividad de la sintaxis de Crystal.

12. Reason

Reason es un lenguaje de programación moderno. Su sintaxis se parece a la de JavaScript y otros lenguajes de la familia C, y tiene un sistema de tipos robusto de OCaml. Debido a que los desarrolladores pueden verificar los tipos, pueden detectar problemas en etapas más tempranas y, por lo tanto, pueden escribir código más confiable y sólido.

Reason tiene una interfaz amigable y un diseño simple, lo que lo convierte en una excelente opción para resolver una variedad de tareas de programación, sin importar tu experiencia en programación.

Reason y OCaml son lenguajes de programación muy versátiles. Debido a que están respaldados por una gran cantidad de proyectos, se pueden usar en varios entornos. Una de las opciones de uso es crear tus propios archivos ejecutables, que se pueden ejecutar directamente en tu computadora con un compilador estándar. Además, hay varias herramientas (como dune y esy) que pueden ayudar en este proceso.

Otra opción es compilar Reason en JavaScript, que a su vez es compatible con los navegadores. Esto se puede hacer con proyectos como ReScript (antes BuckleScript) y Js-of-ocaml. Todas estas opciones de uso versátiles hacen que Reason y Ocaml sean atractivos para desarrolladores de diferentes sectores.

Reason es un lenguaje de programación moderno con una interfaz amigable y una sintaxis similar a la de JavaScript. Su versatilidad y diseño simple le han permitido ganar popularidad entre desarrolladores de diferentes sectores.

Conclusión

Bueno, cada uno tiene sus favoritos, pero los lenguajes que hemos enumerado anteriormente vale la pena probarlos, ya que han aparecido nuevas funciones que pueden ayudar a resolver problemas que los lenguajes más antiguos no podían solucionar.

Elm es una excelente opción para una separación de código más limpia y la programación modular. Pony es uno de los mejores lenguajes para la programación asíncrona.

Aunque Vyper es un lenguaje bastante nuevo, diseñado para escribir contratos inteligentes, es una alternativa prometedora a Solidity. Vyper se ha destacado especialmente en la definición de contratos inteligentes y el manejo de errores. Al mismo tiempo, R se considera uno de los mejores lenguajes para el análisis de datos, y ya tiene una comunidad bastante grande.

Hay lenguajes que también están ganando popularidad, pero por alguna razón, no los hemos incluido en esta lista. Aquí están:

  • Golang: ya se ha establecido como un lenguaje común, aunque no es el más popular. Creo que en este momento Golang tiene varios competidores que no le permitirán ganar el mercado.
  • Swift: Apple tiene un control férreo sobre su ecosistema, y Swift es el único lenguaje que está disponible en él. Al igual que Swift es popular ahora, Objective C lo fue antes. Creo que esto es hacer trampa, por lo que no lo incluí en la lista.

El futuro siempre está lleno de incertidumbre, por lo que una forma de tener una carrera es concentrarse en lo que ya funciona y no desviarse. En ese caso, vale la pena seguir con los siguientes lenguajes: Java, PHP, Python, Ruby, etc. Y, sin embargo, a muchos no les alcanzan los lenguajes comunes. Salen a la calle, investigan y hacen grandes apuestas por su futuro. Si apoyas al segundo bando, uno de estos lenguajes tiene que estar en la cima de tu lista de tareas.

Y por último, cuando intentas evaluar un lenguaje, si debes o no aprenderlo, no te dejes llevar por el esfuerzo que tendrás que hacer para aprenderlo, ya que no tendrás que esforzarte mucho. Si ya conoces algunos lenguajes de programación, puedes aprender cualquiera de estos lenguajes en un par de meses como máximo, dedicando de 5 a 6 horas a la semana. El placer y los ingresos que puedes obtener en el futuro superarán con creces este esfuerzo.

Categorizado en:

Programación,