Para algunas personas, aprender un nuevo lenguaje de programación es un exceso que es mejor evitar. ¿Por qué, oh por qué, argumentan, necesitamos otro lenguaje más?
¿No tenemos ya suficientes?
¿No hacen el trabajo las herramientas existentes?
Y luego están esos buscadores incansables que saltan ante la oportunidad de probar cosas nuevas y tropezar con gemas. Aprender es un fin en sí mismo, y no necesitan mucho convencimiento para quemar sus fines de semana construyendo un juego de cartas para consola en ese oscuro y nuevo lenguaje.
Independientemente del bando al que se pertenezca, hay algo que no admite discusión: todos queremos dedicar tiempo a algo que tenga un futuro brillante.
Para la gente del bando del legado, su lenguaje favorito existente ya tiene toneladas de impulso y seguirá teniendo un futuro brillante. A ellos, debo recordarles que su cadena de herramientas de desarrollo preferida, ahora madura, fue en su día «kool-aid» que muchos se negaron a beber. Y así es hoy; se añaden nuevas tecnologías para resolver nuevos problemas o para aliviar el dolor del desarrollo.
Si algo hace esto con la suficiente radicalidad, lo más probable es que siga arrebatando cuota de mercado y llegue a la cima. Cuando eso ocurra, no querrá quedarse atrás 🙂
Y a los que les gusta correr con las cosas brillantes, una advertencia: divertirse es esencial como programador, pero debemos tener cuidado de no malgastar nuestras energías sin rumbo.
Seguro que Brainfuck es un pequeño lenguaje increíblemente retorcido, rompecabezas y divertido, pero es poco probable que usted se beneficie si lo persigue seriamente. Usted quiere algo que sea nuevo, sensato y que tenga una base sólida.
Cómo se seleccionaron estos idiomas
La selección de lenguas es un trabajo intimidante, especialmente cuando se están considerando nuevas lenguas para obtener beneficios futuros en el empleo y la satisfacción. Todos los autores de lenguas están firmemente convencidos de que han construido la lengua perfecta posible y han resuelto todos los problemas a los que hay que dar respuesta. ¿Cómo, entonces, se corta?
Para este post, me he centrado en unos pocos parámetros para mantener mi búsqueda dentro de unos límites razonables.
Fecha de publicación
Evité específicamente los idiomas que son muy, muy nuevos.
Nuevos, me refiero a los lenguajes que tienen menos de 5-6 años en el momento de escribir este artículo, y especialmente a los que no han alcanzado la estabilidad (la versión 1.0, es decir). Pero espero volver sobre esto y escribir sobre su éxito algún día 😀
Para mí, de 5 a 12 años es el punto dulce, que es cuando un lenguaje se ha estabilizado y se están elaborando más refinamientos. Ahora bien, por supuesto, hay excepciones a esta regla, y éstas se tendrán en cuenta cuando proceda.
Fuerte interés de la comunidad
Esta es una obviedad, pero a menudo se ignora cuando nos entusiasmamos con algo nuevo. Ahora bien, para mucha gente, el respaldo de una gran empresa es suficiente precedente para el éxito, pero no siempre es así.
Sí, Objective-C de Apple y ahora Swift prosperaron porque eran las únicas opciones en un ecosistema muy controlado, pero D y Hack de Facebook (una fea versión de un lenguaje ya de por sí feo, en mi opinión) siguen siendo poco más que experimentos.
La combinación ideal sería un lenguaje respaldado por una gran empresa estable y en plena explosión de popularidad (como React).
Pero el quid de la cuestión sigue siendo la comunidad. Si un lenguaje no está creando un zumbido, y no hay suficientes devs para educar y popularizar, no va a salir de su tumba GitHub.
Para mí, esto descarta lenguajes maduros y fascinantes como Racket y Erlang, ya que se han mantenido planos en la curva de crecimiento.
USP centrada y bien definida
Lo tercero que busco es un objetivo bien definido para el lenguaje. Por ejemplo, una versión mejorada de PHP que solucione los problemas de nomenclatura y compile a PHP nativo no me sirve.
Los beneficios son demasiado pequeños para justificar las grietas si todo el mundo intenta pasarse a ella. Con este criterio, no puedo evitar descartar intentos como CoffeeScript, y muchos otros lenguajes similares que compilan a JavaScript.
Sinceramente, me veo obligado a descartar de inmediato las mejoras basadas únicamente en la sintaxis. La historia ha demostrado que la utilidad triunfa sobre la amabilidad cuando se trata de lenguajes, así que si todo en lo que se centran los nuevos lenguajes es en una experiencia más agradable, me temo que no entrarán en esta lista.
Sintaxis clara y coherente
Sí, ya lo sé. Acabo de decir que la sintaxis no importa. Bueno, para ser precisos, he dicho que las «mejoras sólo sintácticas» no importan. Pero dicho esto, la sintaxis sigue siendo uno de los factores significativos de la productividad y la mantenibilidad del programador, así que es algo que no puede faltar en mis cálculos aquí.
Junto con la sintaxis viene la idea de coherencia. La nomenclatura de las funciones, la estructuración de los módulos, etc., son aspectos clave en los que un lenguaje no puede permitirse equivocarse. Estamos en 2018, por el amor de Dios, y otro diseño de lenguaje similar a PHP sería una vergüenza para todos nosotros. Así que, sin más preámbulos, empecemos con nuestras cinco principales recomendaciones.
Julia
Para la gente del MIT, los lenguajes disponibles para la ciencia de datos eran un compromiso en el mejor de los casos. Python, a pesar de toda su claridad y popularidad, carecía de construcciones nativas para tratar con objetos de datos. Además, al ser un lenguaje interpretado, Python les resultaba lento (no las bibliotecas, ojo, ya que están escritas en su mayoría en C).
Pero quizás el mayor inconveniente era el torpe modelo de concurrencia y la falta de un modelo de computación paralela, el último de los cuales es un elemento básico en la supercomputación.
Como resultado, nació Julia.
Julia alcanzó su versión estable el 29 de septiembre de 2018, apenas unos días antes de que se escribiera este artículo (¡hablando de sincronización!). Esto es lo que el sitio web oficial tiene que decir sobre sus capacidades:
Julia sobresale en la computación numérica. Su sintaxis es excelente para las matemáticas, soporta muchos tipos de datos numéricos y el paralelismo está disponible desde el primer momento. El envío múltiple de Julia es un ajuste natural para definir tipos de datos numéricos y de tipo array.
Desde el punto de vista sintáctico, Julia puede verse como una combinación de Python y C. Sí, es probablemente la primera vez que un lenguaje se ha propuesto estas dos cualidades y lo ha conseguido.
Para simplificar las cosas, Julia es rapidísimo y no impone un tipado estricto. Aquí tiene algunos puntos de referencia:
Como puede ver, Julia es ligeramente peor que C, pero supera a Java y Python. ¿Y qué tipo de cosas llamativas ofrece Julia?
Bueno, aquí está la implementación de una función para calcular la hipotenusa de un triángulo rectángulo:
Por último, aunque la mayor parte del ecosistema de Julia está fuertemente inclinado hacia el trabajo matemático, creo que tiene un brillante futuro de propósito general.
Es el primer lenguaje, que yo sepa, que tiene un soporte de primera clase para la computación paralela, por lo que no será ninguna sorpresa verlo ganar más popularidad en los dominios Web e IoT.
Rust
Si ha probado las nuevas versiones del navegador Firefox, sabrá que por fin, tras años de trabajo, parece que podrían arrebatarle algo de cuota de mercado a Chrome.
Si el navegador parece ligero y ágil y renderiza con rapidez, es todo gracias al lenguaje que Mozilla ha desarrollado especialmente: Rust.
Decir que Rust tiene un futuro brillante sería mentir; el lenguaje ya es un éxito masivo, y si aún no ha oído hablar de él, es porque su área de aplicación es especializada, y su objetivo aterrador: ¡sustituir a C! Sí, por fin tenemos un lenguaje que no sólo es capaz de hacerlo, sino que ya lo está haciendo.
Para las personas frustradas con el sobrecargado diseño de C y los problemas de gestión de memoria, Rust llega como un soplo de aire fresco.
He aquí el aspecto de un programa Rust:
Conciso y elegante, en mi opinión. Rust sigue el enfoque de la programación funcional, lo que hace que su código sea más componible, y no hay jerarquías orientadas a objetos con las que luchar.
Entonces, ¿qué le da a Rust el valor para ir tras C ? Es el nuevo modelo de memoria. En lugar de confiar en el viejo baile new()/delete(), Rust introduce la idea de Propiedad.
En lugar de asignar y acceder a la memoria directamente, las variables de Rust se «toman prestadas» unas a otras, con estrictas restricciones impuestas por el compilador. El concepto general es demasiado complicado para explicarlo en pocas palabras, así que no dude en consultar la documentación oficial para saber más.
La cuestión es que esto da como resultado un 100% de seguridad de la memoria sin necesidad de un recolector de basura, lo cual es una gran cosa.
Rust ha tomado por asalto el mundo de la programación de sistemas. Ya es compatible con algunas plataformas, los navegadores de potencia y los motores de renderizado están sustituyendo rápidamente al código C/C en los sistemas de producción, y se está utilizando para escribir sistemas operativos.
Claro que no a todo el mundo le gusta crear otro navegador o controlador de dispositivo, pero Rust ya se está extendiendo a otros ámbitos. Ya tenemos varios frameworks web completamente funcionales y ridículamente rápidos en Rust, y cada vez se desarrollan más bibliotecas de aplicaciones.
Sinceramente, si le interesa un futuro apasionante, Rust es el lenguaje perfecto, y ahora es el momento perfecto. Rust es un avión que ha despegado, ¡pero aún está a tiempo de subirse a bordo mientras se dirige hacia las estrellas!
Aprenda Rust con Dmitri Nesteruk.
Elixir
Entre los lenguajes que se centran en la felicidad del desarrollador, el primer puesto está reservado permanentemente para Ruby. Es un lenguaje que se lee como poesía y tiene suficientes atajos como para reducir la fricción mental en un orden de magnitud.
No es de extrañar, por tanto, que el framework Rails siga dominando el desarrollo full stack para desarrolladores serios y startups. Pero no todo el mundo estaba contento con Rails, especialmente uno de sus principales desarrolladores: José Valim. Creo que el propio creador es quien mejor explica la génesis de este lenguaje en una entrevista:
Es una larga historia, pero intentaré hacerla corta y dulce. Allá por 2010, estaba trabajando en la mejora del rendimiento de Rails cuando se trabaja con sistemas multinúcleo, ya que nuestras máquinas y sistemas de producción salen cada vez con más núcleos. Sin embargo, toda la experiencia fue bastante frustrante ya que Ruby no proporciona la herramienta adecuada para resolver problemas de concurrencia. Fue entonces cuando empecé a buscar otras tecnologías y finalmente me enamoré de la Máquina Virtual Erlang.
Empecé a utilizar Erlang cada vez más y, con la experiencia, me di cuenta de que echaba en falta algunas construcciones disponibles en muchos otros lenguajes, incluidos los funcionales. Fue entonces cuando decidí crear Elixir, como un intento de aportar diferentes construcciones y excelentes herramientas sobre la Máquina Virtual Erlang.
Y he aquí que nació Elixir
Al igual que Scala mejora el lenguaje Java pero se dirige a la misma máquina virtual subyacente (la JVM), Elixir para aprovechar la máquina virtual Erlang de décadas de antigüedad y probada en batalla.
Ahora bien, una discusión sobre Erlang va más allá del alcance de este artículo, pero lo mínimo que debe saber es que es el secreto mejor guardado de la industria de las telecomunicaciones: si nuestras redes telefónicas son mucho más fiables que nuestros sistemas basados en la web, es todo gracias a Erlang.
En términos aún más sencillos, lo que significa es lo siguiente. Si está construyendo un sistema en tiempo real como el chat, Elixir es mucho menos hambriento de RAM y estable que Ruby (o PHP, Python y Java, para el caso).
Una máquina que ejecuta Ruby y tiene un máximo de 10.000 conexiones concurrentes puede manejar fácilmente 200.000 cuando se utiliza Elixir y ¡todavía tiene suficiente RAM para ejecutar juegos 2D!
En cuanto a la sintaxis, Elixir copia descaradamente a Ruby, y su marco Web dominante, Phoenix, copia descaradamente a Rails. Yo diría que eso también es bueno, porque junto con Laravel, Grails, Masonite, etc., estamos llegando a un punto en el que todos los lenguajes tienen frameworks similares a Rails que pueden facilitar la transición. Algunos se burlarán de la «falta de originalidad», pero al menos yo no me quejo.
Por último, Elixir es una de esas tecnologías refrescantes, agradables y condenadamente prácticas. Varias tiendas Ruby (e incluso no Ruby) se están pasando a Elixir, y grandes empresas como Pinterest lo están utilizando en producción con resultados extremadamente satisfactorios.
Mucha gente piensa que Node.js fue un intento improvisado de concurrencia y que pronto sería sustituido por Elixir. Debo decir que estoy de acuerdo con ellos 🙂
Kotlin
En 2017 I/O, Google soltó una bomba sobre la multitud desprevenida. La compañía anunció formalmente Kotlin como el lenguaje principal para el desarrollo de Android, enviando ondas de choque a través de la industria.
Ahora, que Google haya estado buscando activamente reemplazar a Java no es ninguna sorpresa después de haber sido mordido por una demanda de Oracle; sin embargo, la adopción de Kotlin fue algo inesperado, y todavía hay una buena probabilidad de que Google salga con su máquina virtual pronto. Por el momento, sin embargo, Kotlin está disfrutando de un auge.
Kotlin fue desarrollado por JetBrains, una empresa más conocida por su conjunto de editores de código increíblemente buenos. Uno de ellos, IntelliJ IDEA, constituye la base de Android Studio. Los objetivos de diseño de Kotlin son la seguridad, la concisión y la interoperabilidad al 100% con Java.
Por encima de todo, el compilador de Kotlin se esfuerza al máximo para eliminar las excepciones de puntero nulo, tan comunes en el mundo Java. También reduce bastante la proverbial verbosidad de Java, lo que supondrá un alivio para muchos.
He aquí una magnífica comparación de código entre Java y Kotlin:
El código Kotlin es significativamente más corto y tiene mucha menos sobrecarga cognitiva a través de la cual arar.
Pero dejemos una cosa clara: es muy poco probable que Kotlin sustituya a Java, aunque se está convirtiendo rápidamente en uno de los favoritos. Creo que dentro de diez años, los equipos pequeños y medianos no mirarán más allá de Kotlin, mientras que los grandes grupos seguirán utilizando Java por razones puramente de legado.
Dicho esto, Kotlin tiene un futuro extremadamente brillante, ya que hace todo lo que hace Java, puede fusionarse con código Java sin que nadie se dé cuenta, ¡y es mucho más agradable!
TypeScript
¡Dios sabe que tuve que contenerme para este puesto! Todo dentro de mí gritaba «¡Elm! Elm!», pero por muy revolucionarias que sean sus ideas o por muy divina que sea su sintaxis, Elm aún no se ve como una alternativa mainstream para el trabajo front-end. 🙁 En fin, pasemos a lo que sí es mainstream: TypeScript.
JavaScript es como las bayas silvestres: feo y desagradable, pero hay que digerirlo si se quiere sobrevivir a la jungla del desarrollo front-end. Se han hecho muchos intentos por sustituirlo (y lo más probable es que el nuevo estándar WebAssembly lo consiga), pero lo que realmente llamó la atención de todo el mundo fue el superconjunto desarrollado por Microsoft.
Hay excelentes posibilidades de que haya oído hablar de TypeScript: Angular fue el primer framework en adoptarlo a partir de la versión 2, y la gente no tardó en tomar nota. Esto se debe a que TypeScript añade algunos superpoderes fantásticos y muy necesarios al lenguaje de programación más famoso del mundo.
Sí, ¡por fin es posible escribir código JavaScript nativo sin sufrir y maldecir el nacimiento!
He aquí las mejoras que TypeScript pone sobre la mesa:
✓ Tipado fuerte: Por fin, ¡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 en tiempo de compilación: Si su código se compila correctamente, está más o menos garantizado que estará libre de las verrugas del tiempo de ejecución de JavaScript.
✓ Clases y módulos: Sí, las clases son estándar en ES6, pero también se incluyen en TypeScript, además de un ordenado sistema de módulos.
✓ Inferencia de tipos: Para tipos complejos, el tipo puede ser averiguado fácilmente por el compilador, ahorrándole algún quebradero de cabeza.
✓Async/await: Las palabras clave y patrones async/await son fundamentales, ¡así que no más enredos con Promises y Callbacks!
Namespaces, genéricos, tuplas . . . Podría seguir y seguir, pero debería bastar con decir que TypeScript convierte una de las peores experiencias de desarrollo en una de las mejores.
No se puede negar el impacto de TypeScript. Desplazó a intentos similares como Dart de Google (aunque está intentando volver a través de Flutter, un marco de desarrollo móvil), y abrió los ojos de los desarrolladores de JS a los beneficios de tipos más fuertes.
Como resultado, importantes bibliotecas como React, D3, Vue (¡incluso jQuery!) tienen ahora una versión TypeScript, y en las mejores tiendas de software de todo el mundo, todo el código JavaScript se está escribiendo como código TypeScript. Las cabeceras de TypeScript ya están disponibles también para Node.js (sinceramente, si un nodo puede mejorar su historia de concurrencia y parchear su pésima gestión de memoria, durará para siempre).
Puede que le sorprenda saber que el creador de Node.js, tras arrepentirse públicamente de su creación, está trabajando en un nuevo runtime (de momento no hay página web oficial; sólo el repositorio de GitHub) que tiene TypeScript como lenguaje principal.
¿La mejor noticia? TypeScript es un lenguaje pequeño de aprender con considerables beneficios en el futuro. Si usted es un desarrollador intermedio de JavaScript, ¡aprenderá suficiente TypeScript en dos días para portar todo su código existente!
Elm
Elm es tan rápido como se pronuncia su nombre y se utiliza para aplicaciones front-end, gráficos y juegos. Es un lenguaje de programación funcional creado por Evan Czaplicki en 2012.
Se dice que Elm no tiene excepciones en tiempo de ejecución – ahí es donde brilla. Como lenguaje tipado estáticamente, el compilador valida todos los errores en tiempo de compilación (¡vaya!) con mensajes amigables (los mensajes son textos completos y no códigos lanzados de forma extraña).
¡Qué suspiro de alivio para los desarrolladores (de-buggers)! Usted sería capaz de aprender a codificar en Elm a medida que obtiene más errores – ¡el compilador le dice lo que está mal y le sugiere lo que debe hacer para corregirlo!
Elm presume de ser más rápido que React y más fuertemente tipado que incluso TypeScript. El código de Elm es muy organizado y ordenado y le convertirá en un mejor desarrollador.
Dado que Elm está basado en módulos, puede crear fácilmente componentes reutilizables. Elm compila a JavaScript que puede ejecutar en el navegador. Por lo tanto, todo lo que necesita para que Elm funcione es node y npm, y simplemente puede obtener Elm utilizando el comando
npm install -g elm@
Puede poner la versión que desea instalar, por ejemplo, 0.19.1.
A continuación, puede comprobar si Elm está adecuadamente instalado utilizando el comando -version
. Si aún no desea realizar toda la instalación y configuración, sólo tiene que ir a su sitio web oficial y utilizar el editor en línea para juguetear.
Entonces, ¡vamos a jugar un poco!
Si no está utilizando el compilador en línea, tendrá que instalar todas las dependencias para el programa que vamos a escribir ahora (aunque es bastante fácil).
Pidamos a un usuario que escriba su nombre dentro de un cuadro de texto e imprimamos el mismo en la página con un hola.
importar Navegador
import Html exposing (Html, Attribute, div, input, text)
import Html.Attributes exposing (..)
import Html.Events exposing (onInput)
-- PRINCIPAL
main =
Browser.sandbox { init = init, update = update, view = view }
-- MODELO
tipo alias Modelo =
{ contenido : Cadena
}
init : Modelo
init =
{ contenido = "" }
-- ACTUALIZAR
tipo Msg
= Cadena de cambio
actualizar : Msg -> Modelo -> Modelo
actualizar msg modelo =
case msg of
Cambiar nuevoContenido ->
{ modelo | contenido = String.append "Hola..." nuevoContenido }
-- VER
vista : Modelo -> Html Msg
ver modelo =
div []
[ input [ placeholder "Escriba su nombre", onInput Cambiar ] []
, div [] [ text (model.content) ]
]
Esta es la pantalla inicial cuando se construye el programa:
Escriba un nombre y esto es lo que obtendrá en la pantalla:
Aunque este programa pueda parecer excesivo para su propósito, a medida que aumente la complejidad del programa, apreciará lo fácil que resulta depurarlo y mantenerlo.
Puede ver una clara separación entre el modelo, la vista y el controlador (actualización). De forma similar a como utilizamos las etiquetas HTML, podemos crear formularios en Elm utilizando las etiquetas div del modelo.
En el evento ‘on input’ (es decir, cuando el usuario introduce un texto), el programa llama a ‘Change’, y el programa imprime el nombre del usuario junto con ‘Hello’ utilizando la función String.append.
Pony
Pony está compilado y sigue un modelo actor de computación diseñado para un comportamiento asíncrono, es decir, aplicaciones altamente concurrentes.
Los lenguajes de programación tradicionales proporcionan una función de «bloqueo» para manejar la concurrencia, lo que repercute en el rendimiento. Pony no tiene bloqueo, por lo que se evitan las operaciones de bloqueo y las situaciones de punto muerto. Cada actor es monohilo.
Pony también proporciona seguridad basada en capacidades, en la que los usuarios deben utilizar una «capacidad de referencia» para acceder a un objeto concreto, lo que garantiza un manejo seguro de los datos. Por ejemplo, las capacidades describen lo que se deniega a otros alias en lugar de lo que se les permite.
Nociones como mutabilidad y aislamiento se basan en estas capacidades. Esta característica de capacidad «denegada» hace que Pony esté libre de la carrera de datos.
Pony es seguro, rápido y preciso y ahorra tiempo de desarrollo, por lo que es una buena elección para aplicaciones bancarias y financieras.
Pony garantiza la seguridad de tipo para el manejo de datos. No tiene excepciones: sólo es necesario gestionar los errores para compilar el código. La razón principal de esto es que Pony está tipado estáticamente. Es necesario especificar explícitamente el tipo (como Java, y a diferencia de Python) de una variable antes de utilizarla
let nombre: Cadena
De forma similar a Java, puede crear constructores. Suponga que tiene una clase empleado con nombre y edad:
clase Empleado
let nombre: String
let edad: U64
new create(nombre': String) =>
nombre = nombre'
Los desarrolladores de Java podrían notar que hay sutiles diferencias en la sintaxis (no hay llaves rizadas, ¡vaya!). También hay un »’ al final de los atributos de clase. También puede crear funciones:
fun obtener_nombre_emp(): String => nombre
Divertido escribir funciones, ¿eh?
Ahora, la parte principal – de actores y promesas.
Los actores Pony tienen Comportamientos – similares a las funciones – pero sólo asíncronos – se ejecutan en algún momento en un futuro próximo pero no necesariamente de forma inmediata cuando se les llama. Pero ‘prometen’ que los comportamientos se ejecutarán con seguridad.
actor Empleado
// actor tiene campos, similar a clase
let nombre: Cadena
// y por supuesto, constructor
new create(nombre': String) =>
nombre = nombre'
// Observe el comportamiento 'be' en lugar de la función fun
be obtener_nombre_emp(promesa: promesa[cadena]) => promesa(nombre)
Bueno, las promesas también pueden ser rechazadas – si el actor no puede cumplir la petición asíncrona que se está enviando. Puede crear una promesa:
// Crear una nueva promesa
let promesa = Promesa[Cadena]
E invoque el comportamiento del actor pasándole la promesa a cumplir (en nuestro caso, obtener el nombre del empleado).
empleado.emp_get_name(promesa)
¿Cree que este código compilará?
Otra gran característica de Pony es que es seguro para la memoria – sin NULL o desbordamientos de búfer. Cualquier código que pueda devolver null nunca compilará a menos que se arregle.
Bien, todavía no le hemos dicho al programa qué es ‘empleado’ (nuestro actor):
let empleado = Empleado("J K Rowling")
A diferencia de cualquier otro lenguaje de programación, Pony permite la división por cero, y el resultado es cero. Existen pruebas matemáticas para todas las funciones de Pony.
Para escribir programas Pony, necesita instalar el compilador Pony. Como Pony es un lenguaje compilado, debe compilar el programa utilizando ‘ponyc’ antes de ejecutarlo.
Una vez instalado el compilador, pruebe el programa hola mundo.
Vyper
Vyper es un lenguaje de programación de contratos inteligentes basado en Python. Al igual que Python, es legible por humanos, fácil de codificar y seguro. Vyper compila hasta el bytecode de la máquina virtual de Ethereum (EVM). La EVM identifica el estado de Ethereum para cada bloque de la blockchain.
Para entender por qué Vyper es especial, entendamos los contratos inteligentes.
Los contratos inteligentes son programas almacenados en una blockchain que definen y ejecutan un acuerdo entre el vendedor y el comprador cuando se cumplen los requisitos del contrato.
Se trata de contratos automatizados autoejecutables que no necesitan intervención humana. Sin embargo, los contratos inteligentes son propensos a las vulnerabilidades.
Por ejemplo, se puede hacer que los contratos inteligentes liberen éter a direcciones arbitrarias o que sean asesinados por direcciones arbitrarias, o puede que no sean capaces de liberar éter. Estas vulnerabilidades suelen introducirse a través del código, de forma involuntaria o intencionada.
Vyper elimina este problema proporcionando código seguro, lo que dificulta la introducción de código vulnerable o engañoso. Aunque Vyper está basado en Python, no sigue muchos paradigmas de la programación orientada a objetos, como la herencia, la sobrecarga, la recursividad, etc. Esto evita la complejidad del código (tener múltiples archivos, lo que dificulta la auditoría).
Vyper tampoco admite ensamblaje en línea, lo que significa que los programas no pueden realizar ninguna acción directamente sobre el EVM, evitando así ataques.
Estas características hacen que Vyper sea bastante seguro para escribir código para contratos inteligentes utilizados en blockchains.
Para practicar la escritura de programas en Vyper, puede utilizar elcompilador enlínea remix.
También puede instalar Vyper utilizando docker o pip (si tiene Python) siguiendo las instrucciones de la página de documentación de Vyper.
R
R es uno de los lenguajes de programación más populares para el análisis de datos y el aprendizaje automático. Dispone de API para todas las matemáticas complejas, estadísticas y cálculos científicos, algoritmos de aprendizaje automático y representaciones visuales.
R es de código abierto y ampliamente popular por su rica interfaz gráfica de usuario. Cuenta con una comunidad vibrante y estable y puede integrarse fácilmente con otros lenguajes como C, C , etc.
Obtenemos todas las características anteriores a través de CRAN (Comprehensive R Archive Network), que contiene más de 10000 paquetes para estadística, probabilidad, análisis de datos, computación, gráficos y muchos más.
Para ver la magia de R, probemos un sencillo programa para hallar la media (promedio) de 11 números. Para hallar la media, tomamos la suma de los números y la dividimos por el número total de valores (11 en nuestro caso). R dispone de una función llamada ‘media’ que realiza todo este cálculo por nosotros.
mynums <- c(51, 52, 53, 94, 88, 61, 31, 34, 76, 20, 10)
media(mynums)
La salida es:
[1] 51.81818
Podemos trazarlos utilizando el método de trazado
boxplot(mynums)
Existen muchos paquetes avanzados, como ggplot2, dplyr y muchos más, para visualizar gráficos enriquecidos en R.
También podemos ver un histograma rápido con los valores anteriores para ver el rango en el que se ajustan los valores.
hist(mynums, breaks = 10, col = "azul cielo", main = "Histograma de marcas", xlab = "Bin de altura")
Observe que hemos dado un descanso de 10; podemos cambiarlo por cualquier número en función de las divisiones que queramos.
La variable anterior, mynum era un vector que contenía una lista de números. De forma similar a Python, creamos un marco de datos en R para trabajar con más dimensiones.
Esto es muy útil para la analítica. Por ejemplo, podemos combinar múltiples vectores, crear un marco de datos, y manipular el mismo dependiendo del número de variables y del tipo de análisis que necesitemos.
Digamos que tenemos vectores de nombre de empleado, habilidad y edad. Podemos crear un marco de datos y mostrar los datos juntos:
empleados = data.frame(Nombre = c("John", "Mac", "April", "Ron", "Matt"),
Edad = c(23,28,30,43,31), Habilidad = c("Java", "Python", "C ", "R", "PHP"))
print(empleados)
> print(empleados)
Nombre Edad Habilidad
1 Juan 23 Java
2 Mac 28 Python
3 Abril 30 C
4 Ron 43 R
5 Matt 31 PHP
Otra característica interesante de R es la facilidad de manipulación de matrices utilizando arrays. R le dejará boquiabierto realizando cálculos matriciales complejos con una brisa. Todo lo que tiene que hacer es crear la matriz y dársela al programa R.
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
Apache Groovy
Tras una cuidadosa consideración y evaluación, he incluido Groovy en mi lista de los mejores lenguajes de programación. Este lenguaje es como la mantequilla en la parte superior de un delicioso pastel, proporcionando sabor y realce adicionales a cualquier proyecto.
Una de las principales razones por las que Groovy merece un puesto en la lista es su amplia gama de características, que han contribuido a su creciente popularidad en el mundo de la tecnología. Como lenguaje ágil y dinámico para la máquina virtual Java (JVM), permite modernas funciones de programación para los desarrolladores Java con una curva de aprendizaje mínima.
Cabe destacar que JVM es la abreviatura de Máquina Virtual Java. La JVM es una parte integral de Java, que proporciona una plataforma para ejecutar el código de bytes de Java en cualquier dispositivo. Groovy, construido sobre la JVM, ofrece una amplia gama de características que mejoran su rendimiento y lo convierten en una opción atractiva para los desarrolladores.
En términos sencillos, proporciona una plataforma para ejecutar el código de bytes de Java, lo que hace posible utilizar Java en cualquier dispositivo. Desde el punto de vista del rendimiento, Groovy puede comprobar estáticamente los tipos y compilar su código para mejorar la solidez y el rendimiento.
La perfecta integración de Groovy con las clases y bibliotecas Java existentes lo diferencia de otros lenguajes de programación. También puede compilar directamente a bytecode Java, lo que facilita su uso en cualquier lugar donde se pueda utilizar Java. Esta característica se suma a la flexibilidad y versatilidad de Groovy y lo convierte en la mejor opción para los desarrolladores que buscan crear software eficaz y fiable.
La naturaleza dinámica de Groovy puede hacer que la comprobación de tipos resulte problemática y que la depuración del código sea más difícil, lo que constituye una posible desventaja. Sin embargo, muchos programadores creen que la flexibilidad y la sencillez de Groovy compensan cualquier posible desventaja.
Como desarrollador, es esencial reconocer el valor único que Groovy aporta. Para ilustrar este punto, me gustaría compartir un ejemplo que muestra cómo las potentes características de Groovy pueden mejorar su código.
def saludo = "¡Hola, mundo!"
println saludo
// Definir una lista de números
def números = [1, 2, 3, 4, 5]
// Utilizar un cierre para mapear la lista a sus cuadrados
def cuadrados = números.collect { it * it }
println cuadrados
En este ejemplo, ilustramos la versatilidad y expresividad del lenguaje Groovy definiendo una variable de cadena e imprimiéndola en la consola mediante la función println.
Además, mostramos cómo Groovy simplifica operaciones complejas, como transformar una lista de números utilizando un cierre para crear una nueva lista que contenga los cuadrados de cada número. Esto demuestra cómo Groovy puede mejorar su productividad como desarrollador al proporcionar una sintaxis concisa y legible para las tareas de programación cotidianas.
Por lo tanto, es evidente por qué Groovy merece la atención de todo desarrollador.
Cristal
Tras una exhaustiva investigación, no hemos podido evitar añadir Crystal a nuestra lista. Y no, ¡no estamos hablando de minerales! Crystal es un lenguaje de programación de propósito general y orientado a objetos lanzado en 2014. Fue diseñado para tener una sintaxis muy parecida a Ruby y, al mismo tiempo, ser rápido y eficiente. Con su sistema de tipos estáticos y su compilación anticipada, 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 describe como «Rápido como C, hábil como Ruby», destacando su capacidad para ofrecer un rendimiento ultrarrápido al tiempo que mantiene la sintaxis y la legibilidad fáciles de usar de Ruby.
Sin embargo, Crystal consigue su impresionante velocidad sacrificando algunos de los aspectos dinámicos de Ruby y restringiendo ciertas construcciones de programación. No obstante, esta compensación ha convertido a Crystal en una opción atractiva para crear aplicaciones de alto rendimiento en un lenguaje más fácil de utilizar para los desarrolladores.
# Definir una clase para una persona con atributos de nombre y edad
clase Persona
getter nombre : String
getter edad : Int32
def initialize(@nombre : String, @edad : Int32)
end
end
# Crear una matriz de objetos Persona
personas = [Person.new("Alice", 25), Person.new("Bob", 30), Person.new("Charlie", 35)]
# Utilice un bloque para filtrar el array por edad y mapear los nombres a mayúsculas
nombres = personas.select { |persona| persona.edad >= 30 }.map { |persona| persona.nombre.mayúsculas }
# Imprime la matriz resultante de nombres en mayúsculas
puts nombres.inspeccionar
Este código demuestra las ventajas de Crystal en cuanto a sintaxis, rendimiento y seguridad de tipos. La sintaxis de Crystal es similar a la de Ruby, lo que facilita su lectura y escritura. Sin embargo, Crystal compila a código nativo, lo que resulta en una ejecución más rápida que los lenguajes interpretados como Ruby.
Además, Crystal está tipado estáticamente, lo que proporciona seguridad de tipos en tiempo de compilación y mejora el rendimiento. En este ejemplo, el código utiliza un bloque para filtrar una matriz de objetos Persona por edad y asignar los nombres a mayúsculas, lo que demuestra la flexibilidad y expresividad de la sintaxis de Crystal.
Reason
Reason es un lenguaje de programación contemporáneo con una sintaxis similar a JavaScript u otros lenguajes de la familia C con el robusto sistema de tipos de OCaml. Gracias a sus sólidas capacidades de comprobación de tipos, los desarrolladores pueden encontrar antes los problemas y escribir un código más robusto y fiable.
La interfaz fácil de usar y el diseño sencillo de Reason lo convierten en una opción fantástica para diversos trabajos de programación, independientemente de su nivel de experiencia en programación.
Reason y OCaml son lenguajes de programación muy versátiles que pueden utilizarse en diversos entornos gracias a los numerosos proyectos que los soportan. Una forma de utilizarlos es construir ejecutables nativos que puedan ejecutarse directamente en su máquina utilizando el compilador estándar. Además, existen varias herramientas como «dune» y «esy» que ayudan en este proceso.
Otra opción es compilar Reason a código JavaScript compatible con los navegadores, lo que puede conseguirse a través de proyectos como ReScript (antes BuckleScript) y Js_of_ocaml. Estas opciones versátiles hacen que Reason y OCaml resulten atractivos para desarrolladores de diversos sectores.
Reason es un lenguaje de programación contemporáneo con una interfaz fácil de usar y una sintaxis similar a la de JavaScript. Su versatilidad y su diseño sencillo lo convierten en una opción popular para desarrolladores de diversas industrias.
Conclusión y descargo de responsabilidad
Bueno, todos tenemos diferentes favoritos, pero merece la pena probar los lenguajes anteriores, ya que vienen con todas las novedades y resuelven muchos de los problemas que dejaban los lenguajes anteriores.
Elm es estupendo para una separación de código más ordenada y una programación modular. Pony es uno de los mejores para la programación asíncrona.
Aunque Vyper es bastante nuevo en el mundo de los lenguajes de contratos inteligentes, ofrece una alternativa prometedora a Solidity. Vyper puntúa especialmente bien cuando se trata de la definición de contratos y la gestión de errores. R, por su parte, está considerado uno de los mejores lenguajes para la analítica y cuenta ya con una gran comunidad.
Hay lenguajes específicos que están ganando tanta popularidad como los de este artículo pero que no se han incluido en la lista por diversas razones. He aquí un vistazo rápido:
- Golang: Ya se ha establecido como un lenguaje dominante, aunque no muy popular. Creo que en este momento, Golang tiene varios competidores que mantendrán baja su cuota de mercado.
- Swift: Apple tiene un control férreo sobre su ecosistema, y Swift es el único lenguaje disponible en él. Antes, Objective C estaba de moda, como lo está ahora Swift. Lo considero una trampa y por eso me niego a incluirlo aquí. 😀
El futuro siempre es incierto, y una forma de hacer carrera es ceñirse a lo que ya funciona y negarse a «distraerse» Si hace eso, Java, PHP, Python, Ruby, etc., son todos lenguajes excelentes con los que quedarse. Sin embargo, para algunos de nosotros, la norma no es suficiente. Quieren salir a explorar y apostar fuerte por el futuro. Si se encuentra en este último bando, uno de estos cinco lenguajes debería estar en lo alto de su lista de tareas pendientes.
Por último, cuando intente evaluar un lenguaje, no deje que el esfuerzo le abrume porque no es tanto. Si ya conoce algunos lenguajes de programación, puede aprender cualquiera de ellos en dos meses como máximo, dedicando entre 5 y 6 horas a la semana. Mientras que la felicidad y los rendimientos monetarios que puede generar en el futuro serán varias veces superiores.
A continuación, puede consultar los lenguajes de programación que puede utilizar en la ciencia de datos.