GoLang, portar librerías con Cgo

GoLang logo

GoLang logo

 

Se abre la veda para portar librerías de C a GoLang.

GoLang incluye una especie de procesador de lenguaje (como puede ser rpcgen para RPC), que genera unos “stubs” y “skels” a partir de una especficación (declaraciones de C).  A esta utilidad se le conoce como Cgo. Bajo la ruta $(GOROOT)/misc/cgo se encuentran dos ejemplos claros.

  • stdio: es el “Hola mundo” de Cgo. Sirve para ver cómo funciona el proceso de compilación y empezar a practicar. Hay dos ficheros importantes, “file.go” y “hello.go”.  El fichero que parsea Cgo es “file.go” y en él se implementa un “print(string)“. Como podéis adivinar, “hello.go” utiliza el porting del print implementado en “file.go”.
  • gmp: es el porting del TAD BigNum que implementa la librería GMP. Es un ejemplo más real y práctico de Cgo y enseña bien la sintaxis de uso (aunque es sencilla por sí misma).

La sintaxis de un fichero Cgo es como la de un fichero normal de GoLang. Lo único diferente es la inclusión de:

import "C"

Estas son las palabras mágicas para que Cgo se dé por aludido y empiece a trabajar. Para ello comienza buscando justo en la primera línea anterior a import “comentarios” de C.

En estos comentarios es donde se incluye los tipos de datos, prototipos de función y/o incluso los include en C de la librería que queremos portar.

Si por ejemplo queremos portar la librería D-Bus para GoLang, en nuestro fichero tiene que haber algo parecido a:

/*#include <dbus/dbus.h>

*/
import "C"

Para poder usar los tipos y funciones que ofrece D-Bus sólo tendríamos que establecer el prefijo “C.” al tipo o función en cuestión.

Si en D-Bus existe el tipo “dbus_bool_t” y queremos declarar una variable de ese tipo, la sentencia seria algo como: “var miBool C.dbus_bool_t“.

Por último queda el detalle de la conversión de tipos entre C y GoLang. Para esto existe funciones proporcionadas por la librería de Cgo que permite este tipo de “casting”. Por ejemplo, “CString(cad string) unsafe.Pointer” nos devuelve el archiconocido puntero “char*”.

Una vez que tengamos nuestro archivo Go con el porting de nuestra librería favorita hecho, es necesario generar el paquete. Basta con copiar el Makefile de “gmp”, cambiar el nombre del componente y de los ficheros GoLang asociados.

Lo primero que hará make será parsear con Cgo nuestro fichero de porting. Esto genera unos ficheros que serán compilados con Go y otros que serán compilados con GCC, creando una librería dinámica “.so” que será cargada y usada por el ejecutable que generemos cuando usemos nuestra aplicación.

Lo cierto es que la utilidad Cgo es necesaría para difundir y extender el lenguaje, ya que permite que terceras partes generen muchos portings de librerías enriqueciendo así el framework.

A día de hoy ya existen muchos proyectos de porting de diferentes librerías para gestores de base de datos y creación de ventanas X Windows.

Espero que os animéis a portar librerías🙂

P.D. Cgo al igual que GoLang se encuentran en pañales, es muy probable que encontréis algun bug, en el parseo. Por favor, reportadlo.

Translate to:English
MenefanteMenéame TwitterTwitter

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: