Orden de Ejecución

En el párrafo anterior recorríamos el árbol según su orden jerárquico. Sin embargo el árbol está a su vez hilvanado en orden de ejecución. Esto es: superpuesta a la estructura de árbol existe una lista que recorre el árbol según el flujo de control. A esta estructura de datos se la denomina Grafo de Flujo de Control o Control flow Graph (CFG).

El método START de un objeto B::CV nos da el punto de entrada en la ejecución. El método next de un objeto B::OP proporciona el siguiente nodo a ejecutar.

pp2@nereida:~/src/perl/B$ cat -n bex2.pl
 1  #!/usr/local/bin/perl -w
 2  use strict;
 3  use B;
 4
 5  my $s = sub {
 6    my $a = shift;
 7    print $a+1;
 8  };
 9
10  my $b = B::svref_2object($s); 
11  my $op = $b->START;
12  my ($class, $name, $desc);
13  format STDOUT =
14  @<<<<<<<<<@|@<<<<<<<<<<<<@|@<<<<<<<<<<<<<<<<<<<<<<<<<
15  $class,   '|', $name,    '|', $desc
16  .
17  do {
18    ($class, $name, $desc) = (B::class($op), $op->name, $op->desc);
19    write;
20  } while $op = $op->next and !$op->isa("B::NULL");
Es necesario comprobar que $op no es un objeto B::NULL ya que el puntero next es un puntero C que B deja disponible sin envoltorio alguno.

La ejecución produce la secuencia de operaciones en orden de ejecución:

pp2@nereida:~/src/perl/B$ bex2.pl | cat -n
 1  COP       | nextstate    | next statement
 2  PADOP     | gv           | glob value
 3  UNOP      | rv2av        | array dereference
 4  UNOP      | shift        | shift
 5  OP        | padsv        | private variable
 6  BINOP     | sassign      | scalar assignment
 7  COP       | nextstate    | next statement
 8  OP        | pushmark     | pushmark
 9  OP        | padsv        | private variable
10  SVOP      | const        | constant item
11  BINOP     | add          | addition (+)
12  LISTOP    | print        | print
13  UNOP      | leavesub     | subroutine exit
 my $s = sub {
   my $a = shift;
   print $a+1;
 };

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