Introducción

El módulo 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.040s
Observamos 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
Licencia de Creative Commons
Programación Distribuida y Mejora del Rendimiento
por Casiano Rodríguez León is licensed under a Creative Commons Reconocimiento 3.0 Unported License.

Permissions beyond the scope of this license may be available at http://campusvirtual.ull.es/ocw/course/view.php?id=44.
2012-06-19