Inline
(descárgalo de CPAN) proporciona los medios para realizar las pasarelas
entre el lenguaje Perl y otro lenguaje de programación. Una buena fuente de ejemplos
es el texto
Pathollogically Polluting perl with C, Python and Other Rubbish using Inline.pm
del propio autor del módulo, Brian Ingerson [6]).
Veamos la trascripción del primer ejemplo canónico, usando Inline::C:
$ cat hello.pl #!/usr/bin/perl -w use Inline C => <<'END_C'; void greet() { printf("Hello, world\n"); } END_C greet;ejecutémoslo dos veces, tomando tiempos:
$ time ./hello.pl Hello, world real 0m11.747s user 0m5.830s sys 0m0.450s $ $ time ./hello.pl Hello, world real 0m0.356s user 0m0.310s sys 0m0.040sObservamos que la primera vez tiene lugar todo el proceso de generación de pasarelas para XS, compilación, librerías, etc. La segunda vez esto no es necesario y por ello se tarda muchísimo menos en la ejecución. De hecho, la primera compilación ha creado un directorio denominado
_Inline
con
la siguiente estructura:
$ tree . |-- _Inline | |-- build | |-- config | `-- lib | `-- auto | `-- hello_pl_1222 | |-- hello_pl_1222.bs | |-- hello_pl_1222.inl | `-- hello_pl_1222.so `-- hello.pl
Veamos otro ejemplo:
lhp@nereida:~/Lperl/src/inline$ cat -n pi.pl 1 #!/usr/bin/perl -w 2 use strict; 3 use List::Util qw(sum); 4 use Inline 'C'; 5 6 my $p = shift || 4; 7 my $n = shift || 10000; 8 my $pi = sum(map { computepi($_, $n, $p) } 0..$p-1); 9 print "Pi es: 3.14159265358979 ...\nValor calculado: $pi\n"; 10 11 __END__ 12 __C__ 13 14 double computepi(int id, int N, int np) { 15 double sum, left; 16 17 int i; 18 for(i=id, sum = 0; i<N; i+=np) { 19 double x = (i + 0.5)/N; 20 sum += 4 / (1 + x*x); 21 } 22 sum /= N; 23 return (sum); 24 }La ejecución:
lhp@nereida:~/Lperl/src/inline$ time ./pi.pl Pi es: 3.14159265358979 ... Valor calculado: 3.14159265442313 real 0m1.681s user 0m1.510s sys 0m0.180s lhp@nereida:~/Lperl/src/inline$ time ./pi.pl Pi es: 3.14159265358979 ... Valor calculado: 3.14159265442313 real 0m0.070s user 0m0.060s sys 0m0.010s lhp@nereida:~/Lperl/src/inline$ ./pi.pl 8 1000000 Pi es: 3.14159265358979 ... Valor calculado: 3.14159265358988 lhp@nereida:~/Lperl/src/inline$ ./pi.pl 8 10000000 Pi es: 3.14159265358979 ... Valor calculado: 3.14159265358979
El árbol construido:
lhp@nereida:~/Lperl/src/inline$ tree _Inline/ _Inline/ |-- build |-- config `-- lib `-- auto |-- pi_pl_fa9f | |-- pi_pl_fa9f.bs | |-- pi_pl_fa9f.inl | `-- pi_pl_fa9f.so `-- pi_pl_ffde |-- pi_pl_ffde.bs |-- pi_pl_ffde.inl `-- pi_pl_ffde.so `-- stack1_pl_917b.so
Casiano Rodríguez León