Creación de un ejecutable Perl6 con Rakudo (perl6 en Parrot)

By | March 20, 2009

Rakudo – Perl6 en Parrot

Creación de un ejecutable Perl6 con Rakudo (perl6 en Parrot)

Bueno, como ayer se anuncio Parrot 1.0, es posible que ya haya gente que este interesada en probarlo, pero quizás no sepa muy bien como hacerlo. Voy a describir como crear un ejecutable a partir de un pequeño ejemplo hecho por Patrick Michaud en Rakudo. Para ello vamos a instalar de forma local tanto Parrot como Rakudo, ya que la instalación de forma permanente todavía no la veo muy ‘fina’.

El ejemplo que vamos a usar es una calculadora RPN (Reverse Polish Notation) hecha en Perl6, que viene de una implementación anteriormente hecha en Perl5, el articulo lo podéis ver aquí, vale la pena leerlo para darse cuenta como esta evolucionando Perl6 (a pmichaud le faltaba un metaoperador, asi que no se corta, y va y lo implementa 🙂 )

Bueno, comenzamos descargando y compilando Rakudo/Parrot, para ello hacemos lo que nos indica en su repositorio git.

En Debian necesitariamos los paquetes: git-core, perl, make, gcc y subversion.

cd /tmp
git clone git://github.com/rakudo/rakudo.git
cd rakudo
perl Configure.pl --gen-parrot &&make

Siguiendo este procedimiento, siempre tendremos un compilador de Perl6 con una maquina virtual Parrot que se supone que funciona. También tened en cuanta que lo he puesto en el directorio /tmp, con lo cual en un reinicio de la maquina se perdería, si queréis tenerlo permanentemente, hay que ponerlo en cualquier otro directorio.

Bueno, cogemos el código ejemplo de la web anteriormente indicada y la volcamos a un fichero de texto llamado: “calc.p6”

my %op_dispatch_table = {
        '+'    => { .push(.pop + .pop)  },
        '-'    => { .push(.pop R- .pop) },
        '*'    => { .push(.pop * .pop)  },
        '/'    => { .push(.pop R/ .pop) },
        'sqrt' => { .push(.pop.sqrt)    },
    };
sub evaluate (%odt, $expr) {
        my @stack;
        my @tokens = $expr.split(/\s+/);
        for @tokens {
                when /\d+/     { @stack.push($_); }
                when ?%odt{$_} { %odt{$_}(@stack); }
            default        { die "Unrecognized token '$_'; aborting"; }
        }
        @stack.pop;
    }

    say "Result: { evaluate(%op_dispatch_table, @*ARGS[0]) }";

Una vez tenemos nuestro ejemplo en el fichero, sólo lo tenemos que ejecutar y listo, nuestro primer programa en Perl6, y no es un simple ‘hello world’.

./perl6 calc.p6 '5 6 +'

Pero ahora queremos hacer algo más interesante: crear un ejecutable de ese código Perl6. No hay problema, tenemos las herramientas adecuadas. Primero le vamos a decir a Rakudo que el código que genere sea pir, que es el ensamblador que entiende la máquina virtual Parrot, y luego mediante Parrot, lo compilamos a bytecode, y a partir de ahí creamos un ejecutable de la siguiente forma:

./perl6 --target=pir calc.p6 > calc.pir
./parrot/parrot -o  calc.pbc calc.pir
./parrot/pbc_to_exe calc.pbc

Y ya lo tenemos. Este proceso se automatizará mas adelante, posiblemente se le ponga un switch a la linea de comandos de Rakudo para que genere el ejecutable sin que tengamos que hacer todos eso. Bueno, ya solo nos queda confirmar que tenemos un ejecutable, y probarlo.

file calc
./calc '5 6 +'

Hay que tener en cuenta que Parrot 1.0 supone la salida de Parrot con un API estable para usuarios (usuario es el desarrollador de lenguajes, no el que usa un lenguaje). Por lo tanto queda todavía bastante camino por delante. Aun así, con el anterior ejemplo se puede ver que algo como Perl6 sobre Parrot es los suficientemente funcional como para ya realizar aplicaciones, y ya hay gente creando aplicaciones de cierta envergadura. Espero que os haya gustado y alguno más se anime con Parrot, Rakudo, o cualquier otro lenguaje, cooperar es tan simple como descargarserlo periódicamente, probarlo, y si se ve algún fallo, reportarlo.

 

Leave a Reply

Your email address will not be published. Required fields are marked *