El Módulo Inline

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.010s
Vemos 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 files
Ademá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
Licencia de Creative Commons
Principios de Programación Imperativa, Funcional y Orientada a Objetos Una Introducción en Perl/Una Introducción a Perl
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=43.
2012-06-19