La potencia del C en Gambas
Gambas3, como Python y Java, es un lenguaje interpretado. Podemos crear codebyte (.gambas), que son más rápidos que cuando se ejecutan en el IDE de Gambas, pero ¿que ocurre cuando necesitamos potencia de cálculo?¿que hacer entonces?.
Gambas permite usar librerías externas realizadas en C, para aprovechar la velocidad/rendimiento de este lenguaje en nuestros programas.
Os dejo aquí un simple ejemplo de realizar librerías en C, compilarlas y usarlas en un programa de Gambas.
Vamos a crear 3 funciones.
a) sumar: esta función recibe dos números y devuelve su suma (usando return)
b) duplica: recibe un vector y lo multiplica por 2, devolviendo el vector (sin usar return)
c) ValorarTablero: recibe una matrix cuadrada de N dimension, y devuelve la suma de sus componentes (usando return)
1º. definimos las cabeceras de las funciones que vamos a usar: archivo test.h
->
2º definimos las funciones: test.c
->
3º Compilamos y creamos la libreria:
$ gcc -Wl,-soname=test.so -o test.so -std=c99 -fpic -shared -shared-libgcc test.c
4º Enviamos la libreria al directorio /usr/lib y creamos los enlaces (tenemos que ser root):
# cp test.so /usr/lib/test.so
# ldconfig /usr/lib
5º Ahora en Gambas, creamos un módulo, donde definimos las funciones externas:
->
6º Usamos las funciones en el programa:
->
He hecho un pequeño ejemplo, para comparar como mejora el uso de las funciones en C con las mismas funciones hechas en Gambas.
Este es el resultado del perfilado del programa (cuanto tarda cada función):
Donde se aprecia mayor mejora es en la funcion valorarTableroGambas y valorarTablero, ya que para hacer lo mismo, la función valorartablero solo tarda 283.209 (usa la libreria en C) y la de valorarTableroGambas tarda 56.053.209 (codigo nativo en Gambas3).
Descarga del completo ejemplo: https://app.box.com/s/fjvzuqm3921j25ifgb0h
Ejemplo de uso real: Programa de Cálculo de Estructuras
El proyecto Estrud3D (enlace: http://forge.gambas-es.org/projects/estru3d y http://www.gambas-es.org/viewtopic.php?f=5&t=3470&highlight=estru3d) es un programa realizado por Martín P. Cristiá inicialmente programado en Visual Basic y C, que se está portando a Gambas. Para este programa es fundamental realizar los cálculos la estructura lo más rápido posible, y para ello, se usan librerías escritas y compiladas en C que realizan "el trabajo duro" del cálculo, siendo usado Gambas, para definir la estructura (dimensiones, nodos, barras, tipos de materiales que se usa) y obtener los resultados (gráficos de esfuerzos e informes de todo tipo).
Fuentes:
http://www.gambas-es.org/viewtopic.php?f=4&p=19790#p19790
http://gambaswiki.org/wiki/lang/extdecl?l=es
http://gambaswiki.org/wiki/howto/extern?l=es