Ir al contenido

¿Por qué elegir Go en lugar de C++?

·3 mins

A la hora de desarrollar un sistema distribuido, uno puede elegir cualquier lenguaje de sistemas: Java, C#, Python, etc. Tienen todas las facilidades necesarias para crear esta clase de programas.

Usualmente el lenguaje que se solía elegir para diseñar un sistema distribuido es C++. Go, al igual que los lenguajes listados anteriormente, tienen una serie de características que los hace convenientes: Buen soporte de hilos, bloqueo, sincronización, etc. Pero Go además de esto tiene un paquete muy conveniente de RPC, lo cual no parece gran cosa, pero acaba siendo una restricción significativa.

En C++, por ejemplo, es un poco difícil encontrar un paquete de RPC que sea conveniente y fácil de utilizar, lo cual es algo fundamental para hacer un sistema distribuido. Al contrario que C++, Go, tiene un tipado y sistema de gestión de memoria seguro.

Es muy difícil que en Go escribas un programa, que, debido a un bug, sobrescriba un lugar en la memoria que no debería, y que cause que el programa se comporte de una manera extraña. Esto elimina una gran parte de la superficie de posibles bugs que nos podemos encontrar.

Go a su vez, tiene un recolector de basura, uno de los mejores en los diferentes lenguajes que existen. Por lo tanto, nunca tienes el miedo de estar liberando la misma posición de memoria dos veces, o liberar memoria que está en uso o cosas por el estilo.

Otro punto que no puede parecer obvio hasta que no se ha trasteado mucho con este estilo de programación es que, la combinación de hilos y recolector de basura es particularmente importante. Una de las cosas que suelen salir mal cuando haces un programa en un lenguaje de programación con hilos y sin recolector de basura, es que es siempre un poco como… Un puzle, y por eso se requiere hacer cierta… “Contabilidad”.

Lo que me refiero con esto es que es un poco complicado saber cuando ha finalizado el último hilo de usar el último objeto compartido entre el resto de hilos, y esto es algo necesario, porque solo cuando han terminado todos es posible liberar ese espacio en memoria.

En “hola mundos” … Pues da un poco igual, pero cuando empiezas a escribir “algo medio serio”, y estás leyendo tu código… Sí… Casi que de verdad necesitas un libro de contabilidad al lado. Este problema no existe en absoluto si usas un recolector de basura.

Finalmente, Go es un lenguaje simple, mucho más simple que C++. Otro de los problemas con C++ es que, si has cometido un fallo a la hora de programar algo, incluso si es algo pequeño (como un typo), el error que te devuelve el compilador es tan complicado de entender que… Muchas veces en no vale la pena intentar ver que significa. Usualmente lo que acabo haciendo es ir línea ha explotado y leer el código unas cuantas veces. Con Go es muy simple de entender lo que ha explotado.

Como diría Rob Pike:

“El aspecto fundamental es que nuestros programadores son Googlers, no son científicos. Son generalmente, bastante jóvenes, recién salidos de la universidad, probablemente aprendieron Java, tal vez aprendieron C o C++, probablemente aprendieron Python. No son capaces de entender un lenguaje brillante, pero queremos que construyan un buen software. Así que el lenguaje que les damos tiene que ser fácil de entender y fácil de adoptar”.

Prefiero usar un lenguaje simple, que me diga las cosas claras, que no tenga que usar excesivamente el cerebro para debuguear cada pieza de código conforme las líneas crecen.