Espacio de tecnologia, software libre y sus derivados. Una horda de monos entrenados escriben de vez en cuando por aqui algunas noticias, opiniones e incluso alguna que otra cosa fuera del tema. Maqueros, favor de abstenerse que no somos lo suficientemente guapos.

Piano daemon

Usando SWIG para interfacear lenguajes script con C/C++

Introduccion
Lenguajes script como Perl, Python, Php, Ruby y Tcl estan recibiendo bastante atencion hoy en dia - principalmente porque estos lenguajes facilitan el desarrollo de aplicaciones y prototipos de las mismas de un modo impresionantemente acelerado. Puedo decir como experiencia que al momento de usar python, el tiempo de desarrollo ha sido drasticamente bajo - con la ventaja agregada de la robustes y flexibilidad del codigo. Pero habra situaciones en las que el scripting puro no trabajara como lo deseamos, un ejemplo tipico de esto son las aplicaciones cientificas que requieren una alta velocidad de calculo para rutinas graficas o aplicaciones que requieren controlar o coordinar hardware en base a tiempo real. Entonces he llegado a la conclucion paradigmatica de que lo que necesito es un lenguaje mezclado, en el cual lenguajes tradicionales como C/C++ realicen lo duro del bajo nivel , mientras la logica de la app la pueda realizar en modo Scripting.

Este articulo se enfoca principalmente en el uso de una herramienta que se enfoca a la creacion de Wrappers, con la intencion de integrar el codigo escrito en C/C++ con el popular lenguaje scripting Python. Los fragmentos de codigo en este articulo fueron probados sobre un ubuntu gutsy y una version de Python 2.5.1. Espero que todo eso te sean tan util como a mi.

Obtener SWIG
SWIG es desarrollado por Dave Beazley y puede ser descargado de www.swig.org. o bien puedes instalaro mediante la herramienta apt-get de tu debian… ojo tambien requieres g++ y python2.5-dev.

apt-get install swig  g++

Un ejemplo simple

Diremos que tenemos una funcion llamada suma(a,b) escrita en codigo C la cual nos retornara la suma de dos numeros que le sean pasados como argumentos. Veremos como usar la funcion “suma” desde Python. Crearemos el archivo de nombre aritmetica.c el cual contendra el siguiente codigo:

int suma(int a, int b)
{
		return a+b;
}

Ahora ejecutaremos el siguiente comando:


swig -python -module aritmetica aritmetica.c

Esto nos retornara lo siguiente:

root@pianodaemon-laptop:/home/pianodaemon$ ls -l
total 100
-rw-r--r-- 1 pianodaemon pianodaemon    41 2008-01-15 15:48 aritmetica.c
-rw-r--r-- 1 pianodaemon pianodaemon  1605 2008-01-15 15:48 aritmetica.py
-rw-r--r-- 1 pianodaemon pianodaemon 92723 2008-01-15 15:48 aritmetica_wrap.c

Observemos que fueron creado 2 nuevos archivos, aritmetica_wrap.c y aritmetica.py. Nosotros deberiamos ahora de compilar ambos aritmetica.c y aritmetica_wrap.c para producir archivos de codigo objeto, la compilacion sera con el siguiente comando:


root@pianodaemon-laptop:/home/pianodaemon$ gcc -I/usr/include/python2.5/ -c aritmetica.c aritmetica_wrap.c 

Observe que ya logramos compilar el codigo objeto con exito.

pianodaemon@pianodaemon-laptop:~/gulsinborrame$ ls -l
total 136
-rw-r--r-- 1 pianodaemon pianodaemon    41 2008-01-15 15:48 aritmetica.c
-rw-r--r-- 1 pianodaemon pianodaemon   707 2008-01-15 16:15 aritmetica.o
-rw-r--r-- 1 pianodaemon pianodaemon  1605 2008-01-15 16:11 aritmetica.py
-rw-r--r-- 1 pianodaemon pianodaemon 92723 2008-01-15 16:11 aritmetica_wrap.c
-rw-r--r-- 1 pianodaemon pianodaemon 28884 2008-01-15 16:15 aritmetica_wrap.o

Ahora procedemos a generar un libreria compartida, para eso utilizaremos el enlazador de linux ld:

ld -shared -o aritmetica.so aritmetica.o aritmetica_wrap.o

Finalmente probaremos la libreria que hemos generado:

import aritmetica
>>>aritmetica.suma(10, 20)
30
>>>aritmetica.suma(10, -10)
0
>>>

tooffdawtart

September 28, 2008 @ 4:59 am

Tempting page.., man

RSS feed para comentarios en esta entrada · TrackBack URI

Comenta