El módulo Inline proporciona los medios para realizar las pasarelas entre el lenguaje Perl y otro lenguaje de programación. En particular Inline::C facilita la integración entre código C y código Perl. Veamos un ejemplo:
$ cat -n hcfinline.pl 1 #!/usr/local/bin/perl -w 2 use strict; 3 use Inline 'C'; 4 5 print hcf( 20, 10 ), "\n"; 6 print hcf( 12, 9 ), "\n"; 7 print hcf( 18, 12 ), "\n"; 8 9 __END__ 10 __C__ 11 12 int hcf(int x, int y) { 13 int t; 14 15 if (y > x) { 16 t = x; x = y; y = t; 17 } 18 if (x == y) return x; 19 while (y) { 20 t = x; 21 x = y; 22 y = t % y; 23 } 24 return x; 25 }El código C puede almacenarse dentro del fichero DATA (esto es, a partir de la aparición del marcador
__END__
en una sección determinada por el marcador __C__
.
También puede guardarse en una cadena ordinaria que es pasada a
Inline::C:
$ cat -n shcfinline.pl 1 #!/usr/local/bin/perl -w 2 use strict; 3 use Inline 'C' => q{ 4 int hcf(int x, int y) { 5 int t; 6 7 if (y > x) { 8 t = x; x = y; y = t; 9 } 10 if (x == y) return x; 11 while (y) { 12 t = x; 13 x = y; 14 y = t % y; 15 } 16 return x; 17 } 18 }; 19 20 print hcf( 20, 10 ), "\n"; 21 print hcf( 12, 9 ), "\n"; 22 print hcf( 18, 12 ), "\n";Esta segunda forma es preferible a la hora de realizar la práctica.
Ejecutémos dos veces el ejemplo y cronometremos los tiempos de ejecución:
$ time shcfinline.pl 10 3 6 real 0m1.797s user 0m1.520s sys 0m0.250s $ time shcfinline.pl 10 3 6 real 0m0.065s user 0m0.060s sys 0m0.010sVemos que la segunda vez tarda menos que la primera. Esto es así porque la primera vez Inline genera una librería dinámica que - por defecto - se guarda en el subdirectorio
__Inline
:
$ ls -ltr | tail -1 drwxr-xr-x 4 lhp lhp 4096 2007-05-31 07:42 _Inline $ tree _Inline/ _Inline/ |-- build |-- config `-- lib `-- auto `-- shcfinline_pl_677d |-- shcfinline_pl_677d.bs |-- shcfinline_pl_677d.inl `-- shcfinline_pl_677d.so 4 directories, 4 filesAdemás genera el código de traducción de las llamadas desde Perl a las funciones C.
Durante las ejecuciones posteriores Inline
comprueba
que el código fuente no ha cambiado. Si es así carga la librería dinámica
generada.
Casiano Rodríguez León