Go, Rust, C++, C#, Java…¿Qué lenguaje me gusta más?

lenguajes de programación

Muchos ya sabéis que parte de mi trabajo es participar como ponente en diversos tipos de eventos sobre múltiples temas de naturaleza tecnológica y/o técnica. Y es una parte de mi trabajo que me encanta porque me permite estar en contacto con todas las novedades del sector (o al menos aquellas a las que mi limitada capacidad me permite llegar) y sobre todo porque me pone en contacto con mucha gente con diferentes conocimientos, inquietudes y problemas.

Me he animado a escribir este «post» porque después de participar en un par de eventos al acabar mis respectivas charlas se me acercaron varias personas y entre los diversas temas que estuvimos comentado surgieron en ambos casos las siguientes preguntas: «¿Tú qué opinas sobre el lenguaje <lenguaje_de_moda>?», «¿Crees que es mejor <lenguaje_de_moda1> o <lenguaje_de_moda2>» En ambos casos en los «placeholders» podéis añadir el lenguaje que os interese de entre todos estos: C#, Python, Rust, Go, Swift, R, Scada, C++, Java,…

Como veis es una pregunta que tiene enjundia. Sobre todo porque esto de los lenguajes es como la ideología política o las creencias religiosas; no existe una respuesta verdadera, si no que para cada persona su opción es la mejor y no se suele admitir razonamientos en sentido contrario. Yo después de varios años de enfrentarme a estos dilemas, suelo responder con: «…mira, yo creo que todo lenguaje tiene o tenía sentido en su momento y en un ámbito o tipo de problema determinado…naturalmente lenguajes mas modernos suelen aprender de las virtudes y defectos de los lenguajes anteriores por lo que suelen ser más interesantes…«

Dicho esto, que puede parecer una salida por los cerros de Úbeda, me he propuesto hacer una investigación un poco más seria, y así la próxima vez poder adornar mi respuesta con argumentos racionales y objetivos que es lo que se espera de un sr. ponente «profesional» <modo irony="on">

Comentaré uno a uno los diferentes lenguajes que he considerado dentro de este análisis, indicaré aquellas características de cada uno de ellos que me han parecido más interesantes, también indicaré las cosas que no me han terminado de gustar, e intentaré dar un comentario general sobre cada uno de ellos.

Lenguaje C#

C# es un lenguaje de los que yo denomino «con solera», puesto que lleva entre nosotros desde el año 2000 cuando Microsoft lo diseñó y publicó por primera vez. Desde entonces lleva publicadas unas 12 «minor version» o «dot version» con una frecuencia de actualización que en algunas ocasiones puede estar por debajo del año y medio. Esto os puede dar una idea del ritmo de incorporación de características y su grado de evolución (su última «dot version» pública a día de hoy, es la 7.3, publicada hace meses en el update 15.7 de Visual Studio 2017, y ya se está trabajando en la versión C#8.0 incluida como «preview» en Visual Studio 2019)

Entre sus características principales podemos indicar que es un lenguaje de propósito general, «completamente orientado a objetos» y su especificación está soportada tanto por ECMA como por ISO así como la propia compañía Microsoft. Ya desde sus orígenes, hace 18 años, incluía características heredadas de otros lenguajes y frameworks como «generics», «garbage collector», «métodos anónimos», o «delegates»). También es interesante (aunque esto ya es algo poco diferencial entre lenguajes) que no es exclusivo de plataforma Windows, puesto que C# se puede usar con .NET Core que es multi-SO (Windows, Linux, MacOS).

Entre sus características más destacables y que hacen de él un lenguaje perfectamente actual, versátil y potente, podemos enumerar las siguientes:

  • Sintaxis «curly bracket» (los que vengáis de C/C++ apreciaréis esto)
  • Lenguaje interpretado (aunque se puede compilar a nativo desde hace varias «major versions»)
  • Namespaces
  • Gestión de memoria (sin punteros y con «garbage collector») en general
  • Polimorfismo y Herencia, interfaces
  • «Generics» o «Templates»
  • Características de programación asíncrona y «mulithread»
  • Uso de «decorators»
  • Manejo de excepciones
  • Fuertemente tipado aunque permite trabajar con «type inference»
  • Funciones lambda y closures
  • «Query expressions» (muy útiles cuando queremos manipular iteradores o similares)
  • Soporte limitado a la programación funcional

Entre los aspectos que menos me gustan puedo citar:

  • Dominio completo del lenguaje dificultoso debido a su extensión
  • Como lenguaje con gestión de memoria, está mas alejado del computador que C/C++ por ejemplo
  • No tiene «multiherencia» en el sentido estricto (una clase si puede implementar multiples interfaces)
  • Sus características y sintaxis a veces están dirigidas por las necesidades de Microsoft en el desarrollo de otros «productos»
  • Su gestión de las dependencias (incluso con NuGet) es compleja
  • El control sobre su empaquetado («assemblies») es a veces complejo

Os dejo un pequeño «snippet» de código C# para que podáis haceros una idea de qué aspecto tiene su sintaxis (sí, es el típico «Hello, World!» pero un poco más historiado)

using System;
 
namespace hello_world_greeter
{
    class Greetter 
    {
        public String greetingMessage {get; set; }
 
        public String formatGreetingMessage ()
        {
            return String.Format("I am Greeter and I say: '{0}'", this.greetingMessage);
        }
 
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            Greetter greetter = new Greetter();
            greetter.greetingMessage = "Hello, World!";
 
            Console.WriteLine(greetter.formatGreetingMessage());
        }
    }
}

Conclusiones sobre el lenguaje C#

Me parece uno de los lenguajes a tener en cuenta a la hora de escoger cuál es vuestro portfolio de conocimientos en lenguajes de programación. De hecho sería uno de los 3 lenguajes que yo recomendaría aprender si os queréis introducir en el mundo de la programación. Es un lenguaje potente, de «amplio espectro» que lo mismo os puede valer para desarrollar una aplicación móvil en Android o iOS (con Xamarin), como para hacer una página web en Linux con ASP.NET Core, como para crear un juego 3D en HoloLens o las Oculus Rift con el SDK de Mixed Reality y Unity por ejemplo.

Como aspectos menos atractivos os diré que no es un lenguaje de «scripting» como los que ahora están de moda (Javascript, Node.JS, o Perl) por lo que su curva de aprendizaje a partir de cierto momento del tiempo tiene una pendiente bastante plana. Os será difícil llegar a ser un verdadero experto en el lenguaje y mucho menos llegar a dominar todos los ámbitos, frameworks y SDKs que formar parte de su ecosistema. Tampoco es un lenguaje enfocado específicamente para campos como el científico/ingeniería o «machine learning» o «Big Data» aunque en Microsoft se están poniendo las pilas con esto y ya hay «frameworks» específicos como ML.NET. En resumen:

C# es uno de los lenguajes con mayores capacidades y que debería incluirse en vuestro catálogo de lenguajes de programación si queréis ser desarrolladores competitivos.

Lenguaje C/C++

Me vais a permitir que incluya dos lenguajes en uno (C y C++) aunque bien es cierto que cada día más C++ es más relevante y ya poca gente utiliza C (con todo el respeto a los que lo sigan utilizando claro está). El lenguaje C apareció de la mano de Dennis Ritchie en los años 70 y C++ aproximadamente 10 años mas tarde gracias a Bjarne Stroupstrup que fue su diseñador y una eminencia sobre la materia. Para los propósitos de este análisis, me centraré exclusivamente en el lenguaje C++ puesto que de otra forma, el lenguaje C estaría en inferioridad de condiciones en aspectos como orientación a objetos, nivel de abstracción, construcciones avanzadas, etc. Eso no quiere decir que C no sea un gran lenguaje – de hecho más de 2 generaciones de desarrolladores nos lanzamos al mercado empezando con él – pero no creo que sea comparable con el resto de los lenguajes de este análisis.

Volviendo a C++, es un lenguaje de amplia difusión y dilatada trayectoria desde sus inicios en los años 90. Desde entonces, en el año 1998 el comité ISO/IEC 14882 se hizo cargo de su estandarización, y durante estos últimos 20 años se han publicado cuatro grandes revisiones o evoluciones del lenguaje: la inicial C++98 (después corregida y ampliada por C++3), C++11 en 2011, C++14 en 2014 y la última C++17 hace poco más de un año y medio. Microsoft también es una empresa que ha apostado y apuesta por este lenguaje desde hace muchos años, aunque quiero excluir este soporte del análisis porque una cosa es C++ y otra el soporte de C++ dentro de Visual Studio. Es un lenguaje de propósito general que permite trabajar a diferentes niveles de abstracción pudiendo llegar a muy bajo nivel, o bien alejarnos al máximo del SO y trabajar como cualquier otro lenguaje mas o menos actual. Es un lenguaje fuertemente tipado, con una orientación a objetos sublime, y que se mantiene fuerte y vigoroso si bien su ritmo de evolución no es de lo mejorcito de este análisis.

Entre sus características que hacen de el uno de los lenguajes más consolidados están:

  • Sintaxis «curly bracket» (como no podía ser de otra forma teniendo en cuenta que deriva de C)
  • Orientación a objetos con herencia (¡múltiple!) y polimorfismo
  • Fuertemente tipado aunque desde C++11 permite la inferencia de tipos (con el tipo «auto»)
  • Uso de punteros y asignación memoria, aunque también incluye el uso de referencias y la librería de clases STL permite trabajar con «smartpointers» o incluso definiendo políticas de garbage collector
  • Manejo de excepciones
  • Operadores sobrecargables
  • Namespaces
  • «Generics» o «Templates»
  • Funciones lambda
  • Tuplas
  • Preprocesador sintáctico (cpp)

Por otro lado, algunas de las cuestiones que menos me seducen de C++ son:

  • Muchas características actuales están provistas en las librerías STL y no son parte nativa del lenguaje (no sé si esto es realmente negativo, pero puede producir problemas con publicadores de «STL» no 100% compatibles)
  • Su supuesta capacidad multiplataforma no es tal una vez metidos en faena
  • Es fácil generar «bugs» complejos de detectar sin ayuda de herramientas («memory leaks», «memory corruption»)
  • Dificultad de instalación en algunas plataformas como Windows (minGW o LLVM son complicadas de instalar y carecer de un soporte adecuado de herramientas como make)
  • la separación entre definición y declaración impone formas de trabajar (archivos .h y .cpp) desfasadas
  • la sobrecarga de operadores añade complejidad al leer determinados códigos fuente
  • sistema de compilación («build») complejo
  • no contempla nativamente la gestión de dependencias

Conclusiones sobre el lenguaje C/C++

Se podría comentar que con este lenguaje estoy siendo un poco más estricto que con los demás, y es posiblemente cierto. Pero me permito serlo porque es un lenguaje que me enamoró hace 20 años y no quiero que se me achaque que soy favoritista. Bromas aparte, a pesar de ser un gran lenguaje, elegante, versátil y que permite una gran potencia, adolece de eso que se comenta sobre los superhéroes:

«…un gran poder conlleva una gran responsabilidad…»

y en este caso el lenguaje está desasistido de herramientas homogéneas para cuestiones como compilación, distribución, gestión de dependencias, depuración. Es cierto que hay muchas y algunas de ellas muy buenas, pero hoy en día un lenguaje no es nada sin un conjunto de SDKs, frameworks y herramientas a su mismo nivel. También debido a su larga permanencia en el mercado y a su popularidad, sufre de cierta fragmentación que daña sus capacidades multiplataforma (cualquiera que recuerde los años 2000 y los compiladores de C++ de HP-UX y AIX sabrá a lo que me refiero). Por no mencionar que su rigurosidad en la estandarización y el que detrás no haya empresas o fundaciones respaldándolo hacen que su evolución sea más lenta que en otros lenguajes de características similares.

Puede no estar presente en los proyectos de innovación actuales (web, mobile, ML) pero sin él muchos sistemas no podrían implementarse de manera adecuada. Solo tenéis que preguntar a alguien que desarrolle SO’s, robotica, IoT o juegos. En cualquier caso, otro lenguaje de cabecera que cualquier programador que se precie debería incluir dentro de su repertorio.

Hasta aquí mis comentarios sobre los lenguajes C# y C/C++. En una siguiente entrega, analizaré el resto de lenguajes de programación.

4 thoughts on “Go, Rust, C++, C#, Java…¿Qué lenguaje me gusta más?

    1. Jajaja, ya sabes…la cabra siempre tira al monte. No te prometo nada de Python. En breve Rust y Go, y luego se admiten sugerencias 🙂

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.