
Para no perder la costumbre, hoy voy a hacer otro artículo de introducción. Está vez no va a ser de HTML5 ni de CSS3 o Python ni otro lenguaje dinámico. Hoy voy a hacer una introducción al lenguaje de programación Go que es un lenguaje compilado.
Go es un nuevo lenguaje de programación para sistemas lanzado por la todopoderosa Google en Noviembre del 2009. Aunque empezó a ser desarrollado en Septiembre del 2007 por Robert Griesemer, Rob Pike y Ken Thompson.
Go es un lenguaje de programación compilado, concurrente, imperativo, estructurado,
Entrando en materia
Desde que Go fue anunciado, se generó un inmenso hype a su alrededor. No faltaron los que se apresuraron a bautizarlo como el próximo C —ha habido muchos próximos C que se quedaron en promesas— la diferencia principal al probar Go en serio es que te deja una sensación muy placentera que indica que realmente esta vez si podría haber algo de cierto detrás de esa afirmación.
Después de programar con él algo más complejo que un “Hello World!“ deja una agradable sensación y rápidamente se detectan los siguientes elementos en el lenguaje que revelan que detrás de toda la espantajería de fanboyismo y hype hay sustancia:
- Go usa una sintaxis parecida a C por lo que los programadores que hayan usado dicho lenguaje se sienten muy cómodos con él
- Go usa tipado estático (estatically typed) y es tan eficiente como C
- Go tiene muchas de las características y facilidad de lenguajes dinámicos como Python
- Aún siendo un lenguaje diseñado para la programación de sistemas, provee de un recolector de basura, reflexión y otras capacidades de alto nivel que lo convierten en un lenguaje muy potente
- Go no está orientado a objetos por que no existe jerarquía de tipos pero implementa interfaces
Características
Go, al igual que C y C++, es un lenguaje compilado, obviamente, comparte características con otros lenguajes compilados, pero lo cierto es que tiene algunas características únicas, veamos algunas
Concurrente
Es un lenguaje concurrente que soporta canales de comunicación basados en el lenguaje CSP de Sir Charles Antony Richard Hoare —del que ya hablé en mi primer artículo en Genbeta Dev pues es el creador del algoritmo de ordenación QuickSort y ganador del Turing en 1980—. La concurrencia en Go es diferente a los criterios de programación basados en bloqueos como pthreads.
Recolector de basura
Como la mayoría de los lenguajes modernos, Go implementa un recolector de basura. El recolector de basura de Go está siendo reimplementado para elevar al máximo la eficiencia y reducir la latencia todo lo posible.
Simplicidad
Los lenguajes más utilizados como C++, Java o C# son más pesados y voluminosos. La sencillez es la característica principal de Go, su sintaxis es clara y concisa. Mientras que C es tristemente célebre por la complejidad de la sintaxis de sus declaraciones, Go utiliza inferencia implícita de tipos pudiéndose de esta manera evitar la declaración explícita de variables. La declaración de variables es simple y conveniente, y difiere de la de C.
Duck Typing (Tipificación dinámica)
Go admite la tipificación dinámica de datos también conocida como duck Typing presente en multitud de lenguajes dinámicos como por ejemplo JavaScript, Ruby o Python. Un struct puede implementar una interfaz de forma automática, lo cual es una característica potente y novedosa.
Goroutines
No son ni threads, ni co-rutinas ni procesos. La comunicación entre goroutines se realiza a través de una característica del lenguaje llamada canales —basada en CSP—, que es mcho más seguro y fácil de usar que los sistemas predominantes basados en bloqueos de pthreads o características modernas de Java
Excepciones
Go no tiene excepciones. Los creadores del lenguaje dan varios motivos para que esto sea así. Uno de ellos es que añadir una capa de excepciones añade una complejidad innecesaria al lenguaje y al entorno de ejecución. Por definición deberían de ser excepcionales pero al final se acaban usando como controladores del flujo de la aplicación y dejan de tener nada de excepcional. Según los creadores, las excepciones tienen que ser realmente excepcionales y el uso que se le da mayoritariamente no justifica su existencia.
Innovación
Durante muchos años, los desarrolladores hemos tenido que elegir entre lenguajes de programación de tipado estático compilados, por regla general, bastante complejos pero que proveen grandes características relacionadas con la optimización y el rendimiento y lenguajes de tipado dinámico interpretados con características de mucho más alto nivel que hacían su aprendizaje, uso y sintaxis más sencilla y por tanto divertido programar en ellos, eso si, sacrificando rendimiento y control.
Go mezcla lo mejor de ambos mundos y nos aporta una sintaxis sencilla, clara y divertida junto a la potencia que nos ofrece un lenguaje fuertemente tipado y compilado incorporando además características de alto nivel que facilitan el uso del lenguaje por los desarrolladores.
Diferencias principales con C
Aunque su sintaxis es similar, Go difiere mucho de C, veamos algunos ejemplos
Declaraciones al revés
En Go las declaraciones se realizan al revés desde la perspectiva de C (o C++ o Java). La idea principal en C es que se declara una variable como una expresión que denota su tipo. Según los creadores, aunque la idea detrás de la declaración de tipos en C es buena, los tipos y las expresiones gramaticales no se mezclan demasiado bien y el resultado puede ser confuso. Go sin embargo, separa la expresión y la sintaxis de tipo lo cual simplifica las cosas (el prefijo * para los punteros es la excepción que confirma la regla). Una declaración típica en C sería:
int* i, j;Declara que
i es un puntero, pero no j. En Go:var i, j *intSe declaran las dos variables como punteros. Es más claro y natural.
Semicolon
En Go el uso de semicolon “;“ al final de una instrucción es opcional.
Aritmética de punteros
Go no tiene aritmética de punteros, según los creadores, la razón es la seguridad. Sin aritmética de punteros es posible crear un lenguaje en el que no se puede obtener una dirección ilegal que sea usada de forma incorrecta. La falta de aritmética de punteros simplifica la implementación del recolector de basura. Además, optimizando el compilador y con el hardware actual, un bucle que utiliza los índices de un array puede ser tan eficaz como un bucle que utiliza aritmética de punteros.
++ y —
En Go, el uso de ++ y — para incrementar y reducir el valor de una variable es una sentencia y no una expresión. Además, solo puede utilizarse en su versión postfija pues según los autores, la versión prefija pierde todo su sentido en la ausencia de aritmética de punteros.
¿Es Go un lenguaje orientado a objetos?
Bueno, esta no es una pregunta fácil de responder. Digamos que si y no. Go tiene tipos y métodos y permite un estilo de programación orientado a objetos pero no existe una jerarquía de objetos, por lo tanto, no existe la herencia. En Go, el concepto de “interfaz“ diferente que los creadores creen es fácil de usar y en muchos sentidos es más general. También existen formas de embeber tipos dentro de otros tipos para obtener algo análogo a las subclases. Los métodos de Go son más generales que los de C++ o Java, pueden ser definidos para cualquier tipo de datos no solo para los structs.
La ausencia de jerarquía de tipos en Go, hace que los “objetos“ den una sensación de ser más ligeros que en lenguajes como C++ o Java.
El ejemplo
Como no podía ser de otra manera, voy a poner el ejemplo más simple posible a escribir con Go:
package main
import "fmt"
func main() {
fmt.Printf("Hola, mundo!\n")
}
Todos los archivos Go deben declarar el paquete al que pertenecen a través de una sentencia package. También pueden importar módulos y funciones externas de otros paquetes, en este caso usamos las funciones del paquete “fmt“ que nos da acceso a la función Printf. Todos los archivos en Go son UTF-8. Para compilar el código anterior usaríamos el compilador Gc o el back-end de gcc.
Conclusión
En esta introducción al lenguaje de programación Go hemos visto las características básicas del nuevo lenguaje de programación de Google y hemos visto sus diferencias más remarcables con otros lenguajes compilados. Aún así, he dejado muchas cosas en el tintero sobre temas esenciales como sus diferentes compiladores y su instalación. No os preocupéis, en próximas entregas hablaré más en profundidad sobre este lenguaje de programación del que aún no existe demasiada documentación en castellano.
* Nota #1: Menos en Mac OS X
Más información | Página oficial del lenguaje
Comentarios
Hola! Un artículo muy interesante, tenía ganas de ver una opinión de alguien que fuese programado algo más que un hola mundo con este nuevo lenguaje :).
Solo quería comentar una errata, en la sección "Declaraciones al revés" después de la primera línea de código pone:
"Declara que i es un puntero, pero no b. En Go:"
Hay que cambiar esa "b" por una "j" ;).
Saludos! Y ánimos con el blog! Me gusta mucho ^^
Gracias por tu comentario y por el feedback, ya está corregido.
Mmm... parece interesante, un lenguaje como C, con recolector de basura y sin aritmética de punteros... ahora solo falta que me digas que pare declarar un array no hay que usar el arcaicomalloc y me pongo a probarlo de inmediato.
Eso si, lo de que no tenga orientación a objetos (al menos de forma normal) le resta puntos.
Respecto a las excepciones, supongo que si debe haber excepciones, aunque no debe permitir crearlas supongo que dejará capturar las del sistema ¿no? Porque si no algun que otro sistema crítico...
PD: eso de que es mas natural "var nombre tipo" que "tipo nombre" no se de donde lo sacas :S
-- editado por última vez a las 13:44
Yo sí lo veo natural, eso sí, también "raro". Estamos acostumbrados a poner
int ipara declarar una variable, pero si lo lees, se suele decir: «ies de tipoint» (var i int), y no: «de tipointesi».-- editado por última vez a las 16:22
Si bueno, me recuerda a ADA, aunque tampoco es desnatural decir tipo int las siguientes variables: y la lista xD, pero bueno... supongo q tienes razón.
Humm, como C, con recolector de basura, sin aritmética de punteros y encima con orientación a objetos ya existe: lo llaman Java :)
Polémicas a parte, miedo me da esa fusión entre tipado estático y dinámico. El tipado dinámico es más flexible y robusto si y sólo si el programador tiene en cuenta que le puede llegar cualquier tipo a su función. Comprobar los tipos al compilar es una buenísima manera de filtrar errores, jeje.
Para el lenguaje natural tiene más sentido decir "variable x de tipo entero", pero una más de las características que me parece que debería tener un lenguaje es el ahorro de tiempo en redacción, por lo que "entero x" me parece mejor, a veces toca sacrificar algo de naturalidad a favor de algo un poco más rápido de escribir.
P.D.: Sinceramente, me da algo de flojera la sintaxis
var variable:tipo;Fernando Urkijo Cereceda dice:
Go es una basura:
- El nombre es malo, si quieres buscar código de ejemplo buscando "Go" en google vas a encontrar de todo menos lo que buscas, debería de ser más conciso. - No tiene nada que no tenga F# -C# Que yo sepa tiene características imperativas heredadas de F# (Linq, lambda). -F# y go están orientados a los threads.... C# en la .net 4.0 tienes la TPL y el framework de Async que haces virguerías en paralelo -Eso de que es tan eficiente como C no se lo cree ni rita lei un paper de rendimiento sobre go y era bastante lento.
http://www.genbetadev.com/genbeta-dev/benchmark-entre-c-c-c-python-y-go
"El nombre es malo, si quieres buscar código de ejemplo buscando "Go" en google vas a encontrar de todo menos lo que buscas, debería de ser más conciso."
Joder... Qué más conciso quieres que DOS LETRAS. Además, has buscado mal: para cualquier lenguaje, tenga el nombre que tenga, siempre "NOMBRE language" o "NOMBRE programming language".
Qué el nombre no te guste, sigue, por cierto, sin ser un argumento válido para una crítica.
El nombre, si es que quieres usar Google para buscar información de este lenguaje es "Go lang".
¡Muy cierto!
Todavia le veo unos años mas antes de que se vuelva popular y haya grupos de trabajo programando en go.
Eso no es cierto, se parece más a Java, lo único que tiene parecido a Python es que no lleva punto y coma (;) al final.
Pienso lo mismo que guepard, eso se le resta puntos. La POO es la ley (por ahora...)
Después de leer un poco la documentación de Golang puedo decir que no es competencia para C++, C# y Java, ni siquiera con Python (el gurú de lo simple). Tal vez se convierta en competencia después de 4 años, en fin... es de Google y de esa compañia se puede esperar todo.
Hasta ahora solo he programado en lenguajes de programación para webs (PHP, SQL, JAVASCRIPT) y quisiera aprender otro tipo de programación, estaba pensando en C++ y puede que sea lo mejor, pero antes de empezar con el me gustaría saber algo más de este lenguaje.
Si publicas algún manual o documentación en español buena sobre el lenguaje te lo agradecería.
Un saludo.
Para mi el mejor para aprender es ADA, y luego para un lenguaje basado en objetos tocaría JAVA, empezar directamente con C despues de javascript/PHP... uff es q es muy duro.
Al contrario, PHP y C son bastante parecidos en algunos aspectos, yo de hecho tambien aprendi primero programacion web PHP y usaba algo(poco) de javascript.
Luego decidi aprender C, decision acertada, es el mejor lenguaje para aprender despues de PHP, mas tarde, ya en la universidad si que lo primero que tuve que aprender fue C++ y luego Java, y cambia completamente el paradigma de programacion a POO.
Que esta muy bien, por supuesto, pero es mas complicado que ir ampliando y adaptando la programacion que ya hacia en php a c.
Esta es mi opinion por si te sirve de algo.
Yo es que C, con los mallocs y sus punteros lo veo demasiada cosa para un principiante, mejor empezar con ADA, donde puedes aprender a programar bien, y luego ya te desmadras en C.
A ver, es que tampoco es un principiante de cero, la sintaxis de c y php son similares, el manejo de arrays, de ficheros, de sockets, el control del flujo del programa modular, eso ya lo tienes de php, solo necesitas adaptar un poco el estilo modular a un programa en lugar de a web, y logicamente ampliar con creacion de interfaces o consola, y otras opciones avanzadas de c (punteros y mallocs por supuesto).
Bueno yo lo veo mas como aprender una funcionalidad extra a lo que ya hace, y no pasarte a Java, que la sintaxis es distinta y puedes costar mas, y el paradigma de POO, es muy distinto la forma de programar que conoce, y seguramente con php, no tendra ni idea de los conceptos, objetos, herencia, interfaces, polimorfismo, etc.
De ADA no puedo hablar, porque no lo conozco, mas que un vistazo por encima pero la sintaxis tambien es bastante distinta a C/C++, PHP, y le veo menos utilidad, yo de las empresas que conozco personalmente ninguna usa ADA.
Yo fue asi como aprendi, y depues con la base de C, POO en C++, para aprender el paradigma de POO con un lenguaje muy parecido, y luego ya Java, porque hoy en dia es un lenguaje indispensable, y muy util en muchos casos, de hecho en el proyecto en el que trbajo ahora es Java.
En cualquier caso tambien se de gente que empezo aprendiendo Java o Visualbasic, no se, supongo que al final da igual, si te pones, aprendes lo que sea, pero esta es la curva de aprendizaje mejor para mi gusto.
-- editado por última vez a las 16:43
Saben si ya tienen una librería para manejar interfaces? hace meses que no leía nada de este lenguaje de programación.
Tienes un binding de GTK
http://github.com/mattn/go-gtk
Gracias, ahora le daré una interfaz a mi mini demo del lenguaje GO :) http://goo.gl/m8nW2
Let's GO !!! jeje
No me gusto mucho, pero bueno..
Lo que más rescato es el no tener excepciones, debería ser un trabajo del compilador, de avisarte si hay algo que "puede" andar mal.
saludos
Escribir un comentario
Para hacer un comentario es necesario que te identifiques: ENTRA o conéctate con FacebookConnect