Working on getting the Perl 6 setting to compile.

Currently rakudo.js is at the point where:
works but node rakudo.js -e 'say "Hello World"' doesn't.

What's needed for the later is to get rakudo.js (Rakudo compiled to JavaScript) to compile the setting

The general work-flow for that is:


  1. Try to compile the setting with rakudo.js.

  2. While rakudo.js is compiling some error appears.

  3. I then figure out wheter it's a result of a missing…

Optimizing nqp-js-on-js to make it fast enough to compile Rakudo

Having failed to find a working profiler on npm I ended up webpacking nqp-js-on-js and profiling it directly in Chrome.
I implemented them.
The second big slowdown was actually the slurp() function.
MoarVM doesn't handle concatenation large amounts of huge strings very well so the cross compiler so instead of concatenating bits of javascript code it's often much faster to write them to disk and then slurp it back in.
On the nqp-js-on-js due to a misset buffer size slurp turned out sluggish.

Short summary of the current state of the rakudo-js grant

nqp-js-on-js (NQP compiled to JavaScript and running on node.js) passes it's test suit (almost, there is a bug with how regexes compiled at runtime capture stuff which I haven't yet figured out).
While nqp-js-on-js compiles parts of rakudo (with a minor bug fix) it turn out for some reason it's unacceptably slow on some of the larger files (like Perl6::World).
As such I have turned my attention to figuring out what's the problem and speeding nqp-js-on-js up.
Hopefully the next blog posts will be more detailed and contain the description of some nifty optimizations.

What should Rakudo-js aim for first?

I'm considering applying for a TPF grant to allow me to fully focus on working on getting Rakudo to target JS. To focus the grant application (and pin down the deliverables) I need to choose a use case for rakudo-js to focus on. Possible ones (ideas for new ones are appreciated).
  • running a single page app in a browser (using react.js/jquery or just vanilla js).
  • running on top of node.js
  • running on top of react.native on a mobile phone
  • exploring Perl 6 in your browser (having a awesome REPL, being able to execute snippets etc.)

Compiling QAST fragments to js from nqp-js

The nqp-js backend works when compiled to javascript.

# save this as hello-world.nqp

use QAST::Compiler;

my $sc := nqp::createsc('TEST_SC');
nqp::scsetdesc($sc, "description");
my $qast := QAST::Block.new(
        :blocktype('immediate'),
        QAST::Op.new(
            :op('say'),
            QAST::Op.new(
                :op('concat'),
                QAST::SVal.new(:value("Hello ")),
                QAST::SVal.new(:value("World"))
            )
        )
    );

my $compunit := QAST::CompUnit.new(
    :sc($sc),
    :code_ref_blocks(nqp::list()),
    $qast
);
my $compiler := QAST::CompilerJS.new();
say($compiler.emit($compunit));

Run it like

make js-all
make js-bootstrap
./nqp-js hello-world.nqp | node