| 1 |
=head1 NAME |
|---|
| 2 |
|
|---|
| 3 |
KindaPerl6 - Frequent Asked Questions. |
|---|
| 4 |
|
|---|
| 5 |
=head1 DEVELOPMENT |
|---|
| 6 |
|
|---|
| 7 |
Development of KindaPerl6 is coordinated almost via the #perl6 IRC channel on |
|---|
| 8 |
irc.freenode.net. If you want to contribute join the channel and ask for a |
|---|
| 9 |
commit bit (see L<http://dev.pugscode.org/wiki/>). |
|---|
| 10 |
|
|---|
| 11 |
=head2 Useful links |
|---|
| 12 |
|
|---|
| 13 |
These are perl6 links, that I believe would be useful for new people to the |
|---|
| 14 |
KindaPerl6 project. |
|---|
| 15 |
|
|---|
| 16 |
L<http://dev.pugscode.org/browser> Trac interface for Perl6 code |
|---|
| 17 |
|
|---|
| 18 |
L<http://svn.pugscode.org/pugs/> SVN Repository |
|---|
| 19 |
|
|---|
| 20 |
L<http://feather.perl6.nl/syn/> Official Perl6 Documentation |
|---|
| 21 |
|
|---|
| 22 |
L<http://sial.org/pbot/perl6> Paste Bot for #perl6 |
|---|
| 23 |
|
|---|
| 24 |
L<http://irclog.perlgeek.de/perl6/today> IRC Chat history for #perl6 |
|---|
| 25 |
|
|---|
| 26 |
L<http://www.cse.unsw.edu.au/~dons/lambdabot/COMMANDS> Commands for lambdabot in #perl6 |
|---|
| 27 |
|
|---|
| 28 |
L<http://dev.pugscode.org/timeline> Recent Commits |
|---|
| 29 |
|
|---|
| 30 |
L<http://dev.pugscode.org/browser/v6/v6-KindaPerl6/TODO> KP6 TODO |
|---|
| 31 |
|
|---|
| 32 |
=head2 mp6/kp6 FAQ |
|---|
| 33 |
|
|---|
| 34 |
=head2 Overview - What is mp6/kp6/v6? |
|---|
| 35 |
|
|---|
| 36 |
v6 is a perl6-on-perl6 project: L<http://dev.pugscode.org/browser/v6> |
|---|
| 37 |
|
|---|
| 38 |
This is not the perl5 v6-alpha, see perl5/Pugs-Compiler-Perl6 for that. |
|---|
| 39 |
|
|---|
| 40 |
The current plan is to bootstrap full-p6 using kp6. |
|---|
| 41 |
|
|---|
| 42 |
There are 4 subprojects under v6/: |
|---|
| 43 |
|
|---|
| 44 |
=over |
|---|
| 45 |
|
|---|
| 46 |
=item MiniPerl6 aka mp6 |
|---|
| 47 |
|
|---|
| 48 |
v6-MiniPerl6 (mp6) is a subset of Perl 6 used to bootstrap the full Perl 6. |
|---|
| 49 |
v6-MiniPerl6 is bootstrapped with perl5. |
|---|
| 50 |
|
|---|
| 51 |
=item KindaPerl6 aka kp6 |
|---|
| 52 |
|
|---|
| 53 |
v6-KindaPerl6 is a reimplementation of mp6 with a very flexible compiler |
|---|
| 54 |
workflow. kp6 uses plugins in order to implement perl6 semantics over several |
|---|
| 55 |
backends. kp6 is currently being bootstrapped - kp6 is compiled with the mp6 |
|---|
| 56 |
compiler. |
|---|
| 57 |
|
|---|
| 58 |
=item Yet Another Perl6 aka yap6 |
|---|
| 59 |
|
|---|
| 60 |
A pure C implementation of KindaPerl6 runtime |
|---|
| 61 |
|
|---|
| 62 |
=item Onion |
|---|
| 63 |
|
|---|
| 64 |
Next iteration of the kp6 project |
|---|
| 65 |
I<This project was a shortlived experiment.Work on the bootstap is now going inside kp6.The name is reserved for perl6 on parrot> |
|---|
| 66 |
|
|---|
| 67 |
=item v6.pm |
|---|
| 68 |
|
|---|
| 69 |
v6.pm is a plain translation of the perl5 v6.pm compiler, such that the modules |
|---|
| 70 |
could be interchangeable. This project is currently abandoned. |
|---|
| 71 |
I<This project has been removed.> |
|---|
| 72 |
|
|---|
| 73 |
=item v6-Compiler |
|---|
| 74 |
|
|---|
| 75 |
v6-Compiler (full-p6) is meant as a more advanced compiler, but the process is |
|---|
| 76 |
more difficult to bootstrap because v6-Compiler needs a more complete Perl 6 |
|---|
| 77 |
compiler. |
|---|
| 78 |
I<This project has been removed.> |
|---|
| 79 |
|
|---|
| 80 |
=item pugs - the Haskell implementation |
|---|
| 81 |
|
|---|
| 82 |
PUGS is the root: L<http://dev.pugscode.org/browser> . There are several |
|---|
| 83 |
different perl6 implementations in progress. PUGS is one of them. |
|---|
| 84 |
|
|---|
| 85 |
=back |
|---|
| 86 |
|
|---|
| 87 |
=head2 How can I help? |
|---|
| 88 |
|
|---|
| 89 |
=head3 Prerequisite reading. |
|---|
| 90 |
|
|---|
| 91 |
Perl6 is implementing several features I have not heard of before. Before |
|---|
| 92 |
you read the perl6 documentation, these documents are good to read. |
|---|
| 93 |
|
|---|
| 94 |
- Prototyped based programming: L<http://en.wikipedia.org/wiki/Prototype-based_programming> |
|---|
| 95 |
|
|---|
| 96 |
The perl5 code that implements Prototyped classes: L<http://search.cpan.org/dist/Class-Prototyped/lib/Class/Prototyped.pm> |
|---|
| 97 |
|
|---|
| 98 |
- Objects (Autoboxing is interesting): L<http://en.wikipedia.org/wiki/Autoboxing#Autoboxing> |
|---|
| 99 |
|
|---|
| 100 |
=head3 What do you need? |
|---|
| 101 |
|
|---|
| 102 |
- Perl5 (Perl 5.10.RC2 and Perl 5.8.8 worked with the kp6 test cases.) |
|---|
| 103 |
- Coro.pm : L<http://search.cpan.org/~mlehmann/Coro-4.13/Coro.pm> |
|---|
| 104 |
Required for t/kp6/internals/02-gather.t |
|---|
| 105 |
- Subversion client. |
|---|
| 106 |
- Commit bit: Ask on #perl6 irc.freenode.net. |
|---|
| 107 |
|
|---|
| 108 |
=head3 Customs and Traditions. |
|---|
| 109 |
|
|---|
| 110 |
- (new comers) When you get your commit bit, Update the AUTHORS file to make sure everything (SVN) is ok. |
|---|
| 111 |
|
|---|
| 112 |
- Commit code in doubt, revert if wrong.<br> |
|---|
| 113 |
|
|---|
| 114 |
L<http://irclog.perlgeek.de/perl6/2007-10-31#i_135203> |
|---|
| 115 |
|
|---|
| 116 |
- Please prefix your kp6 svn commits with [kp6] |
|---|
| 117 |
|
|---|
| 118 |
L<http://irclog.perlgeek.de/perl6/2007-11-01#i_136077> |
|---|
| 119 |
|
|---|
| 120 |
Example: |
|---|
| 121 |
|
|---|
| 122 |
[kp6] I have refactored subroutine XXX for clarity and updated the documentation. |
|---|
| 123 |
|
|---|
| 124 |
=head3 Seeing an intermediate step. |
|---|
| 125 |
|
|---|
| 126 |
Sometimes you want to see how kp6 "saw" the code. This is seen by running the |
|---|
| 127 |
code though AST backend. |
|---|
| 128 |
|
|---|
| 129 |
perl script/kp6 -Cast -e ' "a" eq "b" ' |
|---|
| 130 |
|
|---|
| 131 |
=head3 Cannot see the forest for the trees. / Boot strapping |
|---|
| 132 |
|
|---|
| 133 |
One of the problems I had when I started working on kp6 was I could not see |
|---|
| 134 |
how everything worked together. |
|---|
| 135 |
|
|---|
| 136 |
mp6.pl (miniperl6) is used to compile/translate the AST/Grammar/Visitor perl6 |
|---|
| 137 |
libraires/code into perl5 code that can be used by kp6 to parse new perl6 code. |
|---|
| 138 |
|
|---|
| 139 |
AST/Grammar/Visitor code is responsible for converting perl6 code into perl5 |
|---|
| 140 |
code or some other backend (Parrot/Lisp/Perl5). |
|---|
| 141 |
|
|---|
| 142 |
Once the kp6 is sufficently working, you can use kp6 to compile the AST/Grammer/Visitor |
|---|
| 143 |
perl6 code to produce NEWER, better, libraries. The new libraries replace the |
|---|
| 144 |
existing libraries/code produced by mp6. Ergo, miniperl6 is no longer needed; |
|---|
| 145 |
kp6 has just bootstrapped itself. |
|---|
| 146 |
|
|---|
| 147 |
The mp6.pl files are: |
|---|
| 148 |
|
|---|
| 149 |
src/KindaPerl6/Ast.pm |
|---|
| 150 |
Grammar.pm |
|---|
| 151 |
Traverse.pm |
|---|
| 152 |
|
|---|
| 153 |
src/KindaPerl6/Grammer/* |
|---|
| 154 |
|
|---|
| 155 |
src/KindaPerl6/Visitor/* |
|---|
| 156 |
|
|---|
| 157 |
kp6 provides a Runtime enviroment for perl6 code with src/KindaPerl6/Runtime/* |
|---|
| 158 |
so that we can execute perl6 code that has been translated to perl5. |
|---|
| 159 |
|
|---|
| 160 |
=head2 What subset of Perl 6 is covered by mp6? |
|---|
| 161 |
|
|---|
| 162 |
(from miniperl6-spec.pod) |
|---|
| 163 |
|
|---|
| 164 |
=over |
|---|
| 165 |
|
|---|
| 166 |
=item |
|---|
| 167 |
|
|---|
| 168 |
A program is organized in compilation units. All statements must be inside a |
|---|
| 169 |
'class' declaration: class X { ... } |
|---|
| 170 |
|
|---|
| 171 |
=item |
|---|
| 172 |
|
|---|
| 173 |
All statements finish with semicolon. |
|---|
| 174 |
|
|---|
| 175 |
=item |
|---|
| 176 |
|
|---|
| 177 |
Only allow one feed of positional arguments. |
|---|
| 178 |
|
|---|
| 179 |
=item |
|---|
| 180 |
|
|---|
| 181 |
In Signature, disallow "is slurpy", "is optional", "is named" (*@bad) ($bad?) |
|---|
| 182 |
(:$bad) |
|---|
| 183 |
|
|---|
| 184 |
=item |
|---|
| 185 |
|
|---|
| 186 |
But we do allow Hash and Array and Tree unpacking: |
|---|
| 187 |
|
|---|
| 188 |
sub foo ([$a, $b, $c], {:$x, :$y}, ::Tree $top (:$left, :$right)) { ... } |
|---|
| 189 |
|
|---|
| 190 |
foo([1, 2, 3], { x => 1, y => 2 }, ::Tree( left => 1, right => 2 )); |
|---|
| 191 |
|
|---|
| 192 |
# This compiles to: |
|---|
| 193 |
sub foo { |
|---|
| 194 |
my perl6::Tree $top; |
|---|
| 195 |
my ($a, $b, $c, $top, $x, $y, $left, $right); |
|---|
| 196 |
($a, $b, $c) = @_[0]; |
|---|
| 197 |
($x, $y) = @_[1]{'x', 'y'}; |
|---|
| 198 |
$top = @_[2]; |
|---|
| 199 |
($left, $right) = ($top.left, $top.right); |
|---|
| 200 |
... |
|---|
| 201 |
} |
|---|
| 202 |
|
|---|
| 203 |
foo([1, 2, 3], { x => 1, y => 2 }); |
|---|
| 204 |
|
|---|
| 205 |
=item |
|---|
| 206 |
|
|---|
| 207 |
As a consequence, object constructor calls must be written in coercion form: |
|---|
| 208 |
|
|---|
| 209 |
::Foo( x => 1, y => 2 ); # NOT Foo.new |
|---|
| 210 |
|
|---|
| 211 |
=item |
|---|
| 212 |
|
|---|
| 213 |
Only allow item context. |
|---|
| 214 |
|
|---|
| 215 |
=item |
|---|
| 216 |
|
|---|
| 217 |
No laziness; all List are Sequences. |
|---|
| 218 |
|
|---|
| 219 |
=item |
|---|
| 220 |
|
|---|
| 221 |
No subtyping (inheritance) or role mixings. |
|---|
| 222 |
|
|---|
| 223 |
=item |
|---|
| 224 |
|
|---|
| 225 |
No first-class Capture and Signature objects, which means no \$x nor :(foo) |
|---|
| 226 |
|
|---|
| 227 |
=item |
|---|
| 228 |
|
|---|
| 229 |
No assignment, only bindings, but do not panic: |
|---|
| 230 |
|
|---|
| 231 |
$x := $x + 1; # name = IntOp(named(Int)) |
|---|
| 232 |
# $x = $x + 1 |
|---|
| 233 |
|
|---|
| 234 |
The reason is we have to eliminate one of them to avoid dealing with: |
|---|
| 235 |
|
|---|
| 236 |
$x := $y; |
|---|
| 237 |
$x = 123; |
|---|
| 238 |
|
|---|
| 239 |
Because assignment always involve box(unbox()), so emitting the binding to Perl |
|---|
| 240 |
5 is much more straightforward as $x is always just a Int in ($x := $x + 1), |
|---|
| 241 |
never SomePossiblyTiedScalarContainerType that needs to have special FETCH magic |
|---|
| 242 |
associated with $x. |
|---|
| 243 |
|
|---|
| 244 |
Also it (WHAT IS "IT"?) is inevitable with eliminating list context, because: |
|---|
| 245 |
($x, $y, $z) := (1, 2); # compile-time error. |
|---|
| 246 |
($x, $y, $z) = (1, 2); # list-context-undef-fill that we do not want to deal with. |
|---|
| 247 |
|
|---|
| 248 |
Because infix:<=> almost always imply slurpiness with LHS is not a simple |
|---|
| 249 |
scalar, eliminating it is consistent with eliminating list context. |
|---|
| 250 |
|
|---|
| 251 |
=item |
|---|
| 252 |
|
|---|
| 253 |
Annotations are preserved in Perl 5 emitted code using simple Typed vars: |
|---|
| 254 |
|
|---|
| 255 |
# MiniPerl6 |
|---|
| 256 |
my Int $x; |
|---|
| 257 |
my perl5:CGI $x; |
|---|
| 258 |
|
|---|
| 259 |
# Compiled Perl 5 |
|---|
| 260 |
my perl6::Int $x; |
|---|
| 261 |
my CGI $x; |
|---|
| 262 |
|
|---|
| 263 |
The compiler adds no extra assertions, there for using types will not degrade |
|---|
| 264 |
performance in MiniPerl6 land. |
|---|
| 265 |
|
|---|
| 266 |
=item |
|---|
| 267 |
|
|---|
| 268 |
No coroutines. No continuations |
|---|
| 269 |
|
|---|
| 270 |
=item |
|---|
| 271 |
|
|---|
| 272 |
Categories and precedence levels |
|---|
| 273 |
|
|---|
| 274 |
=item |
|---|
| 275 |
|
|---|
| 276 |
; no BEGIN blocks! |
|---|
| 277 |
|
|---|
| 278 |
=back |
|---|
| 279 |
|
|---|
| 280 |
=head2 Can mp6 be run in perl5? |
|---|
| 281 |
|
|---|
| 282 |
Yes. Perl5 is currently the only fully working backend. |
|---|
| 283 |
|
|---|
| 284 |
=head2 Can mp6 be run in pugs? |
|---|
| 285 |
|
|---|
| 286 |
We are not aware of anyone who has tried. Please let us know, if someone has |
|---|
| 287 |
tried. |
|---|
| 288 |
|
|---|
| 289 |
=head2 Can mp6 be run in parrot? |
|---|
| 290 |
|
|---|
| 291 |
There is an implementation of a parrot emitter, but the emitter cannot run |
|---|
| 292 |
full-mp6 yet. |
|---|
| 293 |
|
|---|
| 294 |
The implementation of the PAST emitter was also under way. |
|---|
| 295 |
|
|---|
| 296 |
=head2 Can mp6 be run in ruby/javascript/c#/c/d ? |
|---|
| 297 |
|
|---|
| 298 |
There is some work done for a D implementation. |
|---|
| 299 |
|
|---|
| 300 |
Ruby and Javascript can probably reuse some work that was done for redsix and pil2js. |
|---|
| 301 |
|
|---|
| 302 |
=head2 Running mp6 |
|---|
| 303 |
|
|---|
| 304 |
There are control scripts for compiling mp6 to several backends: |
|---|
| 305 |
|
|---|
| 306 |
Perl 5: |
|---|
| 307 |
|
|---|
| 308 |
perl mp6-perl5-boot.pl < source.pl > dest.pl |
|---|
| 309 |
|
|---|
| 310 |
Parrot: |
|---|
| 311 |
|
|---|
| 312 |
perl mp6-parrot.pl < source.pl > dest.pir |
|---|
| 313 |
|
|---|
| 314 |
Parrot-PAST: |
|---|
| 315 |
|
|---|
| 316 |
perl mp6-past.pl < source.pl > dest.past |
|---|
| 317 |
|
|---|
| 318 |
=over |
|---|
| 319 |
|
|---|
| 320 |
=item Bootstrapping mp6-perl5: |
|---|
| 321 |
|
|---|
| 322 |
This script rebuilds the lib5 directory. It creates a directory named lib5-new: |
|---|
| 323 |
|
|---|
| 324 |
cd pugs/v6/v6-MiniPerl6 |
|---|
| 325 |
perl util/build-perl5.sh |
|---|
| 326 |
mv lib5 lib5-old |
|---|
| 327 |
mv lib5-new lib5 |
|---|
| 328 |
|
|---|
| 329 |
=item What subset of Perl 6 is covered by kp6? |
|---|
| 330 |
|
|---|
| 331 |
kp6 reuses the mp6 grammar. The main differences are not visible - kp6 adds an |
|---|
| 332 |
extra (Abstract Syntax Tree) AST processing step. |
|---|
| 333 |
kp6 adds: |
|---|
| 334 |
|
|---|
| 335 |
- lexical subs |
|---|
| 336 |
- metamodel interface |
|---|
| 337 |
- lexical classes (planned, not implemented) |
|---|
| 338 |
- begin blocks |
|---|
| 339 |
- containers |
|---|
| 340 |
|
|---|
| 341 |
=item Running kp6 |
|---|
| 342 |
|
|---|
| 343 |
kp6 works by creating a parse tree, which is then submitted to a list of AST |
|---|
| 344 |
processors called "Visitors" (namespace C<KindaPerl6::Visitor::*>). Which is |
|---|
| 345 |
then handed off to the KindaPerl6/Visitor/Emit/Perl5.pm to be translated into |
|---|
| 346 |
perl5. |
|---|
| 347 |
|
|---|
| 348 |
script/kp6 is one of the possible compiler 'workflows' that can be built with |
|---|
| 349 |
kp6. You can specify other workflows such as lisp by specifying a different |
|---|
| 350 |
backend with -B, perldoc script/kp6 for more info. |
|---|
| 351 |
|
|---|
| 352 |
perl script/kp6 -o dest.pm source.pm |
|---|
| 353 |
|
|---|
| 354 |
perl script/kp6 -e 'say 42;' |
|---|
| 355 |
--- |
|---|
| 356 |
42 |
|---|
| 357 |
|
|---|
| 358 |
To execute a Perl 6 script directly type |
|---|
| 359 |
|
|---|
| 360 |
perl script/kp6 source.p6 |
|---|
| 361 |
|
|---|
| 362 |
=item Compiling kp6 |
|---|
| 363 |
|
|---|
| 364 |
As of this writing, kp6 is not bootstrapped (in progress though). |
|---|
| 365 |
|
|---|
| 366 |
The kp6 source files can be compiled with mp6 (whith the exception of the |
|---|
| 367 |
KindaPerl6::Runtime::Perl6::* files, which are compiled wih kp6). There |
|---|
| 368 |
is a 'mp6.pl' script in kp6 directory: |
|---|
| 369 |
|
|---|
| 370 |
Please use the make file to compile these. |
|---|
| 371 |
|
|---|
| 372 |
make forcerecompile |
|---|
| 373 |
make |
|---|
| 374 |
make test |
|---|
| 375 |
|
|---|
| 376 |
These will force compilation of various files. |
|---|
| 377 |
|
|---|
| 378 |
Example: |
|---|
| 379 |
|
|---|
| 380 |
perl mp6.pl < lib/KindaPerl6/Visitor/EmitPerl5.pm > lib5/KindaPerl6/Visitor/EmitPerl5.pm |
|---|
| 381 |
-or- |
|---|
| 382 |
perl mp6.pl -o lib5/KindaPerl6/Visitor/EmitPerl5.pm lib/KindaPerl6/Visitor/EmitPerl5.pm |
|---|
| 383 |
|
|---|
| 384 |
=back |
|---|
| 385 |
|
|---|
| 386 |
=head2 How much of the test suite passes? |
|---|
| 387 |
|
|---|
| 388 |
A few tests pass. |
|---|
| 389 |
|
|---|
| 390 |
In mp6, you can pass t/01-sanity/01-tap.t by preprocess by removing of |
|---|
| 391 |
"use v6-alpha;" and wrapping the input in "class Main {...}". See pugs/project_planning/TALK. |
|---|
| 392 |
Some tests pass for kp6. See end of file in v6/v6-KindaPerl6/scripts/run_test.pl |
|---|
| 393 |
|
|---|
| 394 |
=head2 How much of the test suite will eventually pass? |
|---|
| 395 |
|
|---|
| 396 |
Passing tests depends on improving the grammar and the runtime. |
|---|
| 397 |
Instead, kp6 focus is now on bootstraping. |
|---|
| 398 |
|
|---|
| 399 |
|
|---|
| 400 |
=head2 Why does parsing take so much time? |
|---|
| 401 |
|
|---|
| 402 |
The parser is recursive-descent. |
|---|
| 403 |
|
|---|
| 404 |
"Ziggy6" pasted "Total Elapsed Time = 20.53264" |
|---|
| 405 |
Total Elapsed Time = 20.53264 Seconds |
|---|
| 406 |
User+System Time = 19.45264 Seconds |
|---|
| 407 |
Exclusive Times |
|---|
| 408 |
%Time ExclSec CumulS #Calls sec/call Csec/c Name |
|---|
| 409 |
42.7 8.307 8.446 253776 0.0000 0.0000 MiniPerl6::Perl5::Match::new |
|---|
| 410 |
30.4 5.918 5.876 150690 0.0000 0.0000 MiniPerl6::Perl5::Match::to |
|---|
| 411 |
15.0 2.919 11.171 36356 0.0001 0.0003 MiniPerl6::Grammar::ws |
|---|
| 412 |
8.58 1.669 1.688 253776 0.0000 0.0000 MiniPerl6::Perl5::Match::DESTROY |
|---|
| 413 |
5.58 1.085 1.037 259216 0.0000 0.0000 MiniPerl6::Perl5::Match::__ANON__ |
|---|
| 414 |
5.36 1.042 12.035 20975 0.0000 0.0006 MiniPerl6::Grammar::opt_ws |
|---|
| 415 |
4.67 0.909 2.824 36400 0.0000 0.0001 MiniPerl6::Grammar::newline |
|---|
| 416 |
... |
|---|
| 417 |
|
|---|
| 418 |
The code generated by the parser makes several method calls on each |
|---|
| 419 |
character - this can be optimized with inlining (not planned for mp6). |
|---|
| 420 |
A MiniPerl6::Perl5::Match is created for every character. |
|---|
| 421 |
|
|---|
| 422 |
=head2 Why isn't kp6 self-hosting? |
|---|
| 423 |
|
|---|
| 424 |
kp6 will be self-hosting. The process depends on a fast enough parse engine and porting |
|---|
| 425 |
thing using the mp6 calling conventions. |
|---|
| 426 |
|
|---|
| 427 |
=head2 What is the plan for kp6? |
|---|
| 428 |
|
|---|
| 429 |
=over |
|---|
| 430 |
|
|---|
| 431 |
=item Provide a minimal bootstrapped language implementation for bootstrapping p6-on-p6. |
|---|
| 432 |
|
|---|
| 433 |
Extra features over mp6 - allow the implementation of BEGIN blocks, flexible grammar. |
|---|
| 434 |
|
|---|
| 435 |
=item Implement a flexible/pluggable compiler engine. |
|---|
| 436 |
|
|---|
| 437 |
This is currently done with a Visitor pattern for AST transforms. |
|---|
| 438 |
|
|---|
| 439 |
=item Lexical subs |
|---|
| 440 |
|
|---|
| 441 |
Allows operator redefinition: |
|---|
| 442 |
|
|---|
| 443 |
my multi infix:<+> { ... } |
|---|
| 444 |
|
|---|
| 445 |
But note that 'multi' is not part of the kp6 spec. |
|---|
| 446 |
|
|---|
| 447 |
=item Lexical classes / first-class classes. |
|---|
| 448 |
|
|---|
| 449 |
Better support for grammar mutability: |
|---|
| 450 |
|
|---|
| 451 |
$?GRAMMAR Which grammar am I in? (from S02) |
|---|
| 452 |
@?GRAMMAR Which nested grammars am I in? |
|---|
| 453 |
|
|---|
| 454 |
Update: Lexical classes will not be implemented. |
|---|
| 455 |
|
|---|
| 456 |
=item Metamodel interface |
|---|
| 457 |
|
|---|
| 458 |
Allow pluggable object models. |
|---|
| 459 |
|
|---|
| 460 |
=item BEGIN blocks |
|---|
| 461 |
|
|---|
| 462 |
BEGIN blocks are needed to seperate compile-time from run-time. |
|---|
| 463 |
|
|---|
| 464 |
=item Containers |
|---|
| 465 |
|
|---|
| 466 |
This is needed to implement assignment - MP6 only supported binding. |
|---|
| 467 |
|
|---|
| 468 |
=back |
|---|
| 469 |
|
|---|
| 470 |
=head2 Is kp6 needed for bootstrapping perl 6 on perl 6? |
|---|
| 471 |
|
|---|
| 472 |
No. perl 6 on perl 6 can also be bootstrapped with: |
|---|
| 473 |
|
|---|
| 474 |
- Parrot |
|---|
| 475 |
- Pugs |
|---|
| 476 |
- v6.pm |
|---|
| 477 |
- Plain mp6 |
|---|
| 478 |
- Redsix L<http://dev.pugscode.org/browser/misc/pX/Common/redsix> |
|---|
| 479 |
|
|---|
| 480 |
=head2 How to use kp6 to compile everything. |
|---|
| 481 |
|
|---|
| 482 |
TODO: make KP6-BOOT |
|---|
| 483 |
|
|---|
| 484 |
=head2 How to: make / compile / test - kp6 |
|---|
| 485 |
|
|---|
| 486 |
=over |
|---|
| 487 |
|
|---|
| 488 |
=item Download KindaPerl6. |
|---|
| 489 |
|
|---|
| 490 |
svn co http://svn.pugscode.org/pugs/ |
|---|
| 491 |
|
|---|
| 492 |
=item To compile KP6. |
|---|
| 493 |
|
|---|
| 494 |
perl Makefile.PL |
|---|
| 495 |
make -j 3 test |
|---|
| 496 |
|
|---|
| 497 |
I<-j 3 means do 3 jobs at once, great for systems with SMP> |
|---|
| 498 |
|
|---|
| 499 |
=item To re-compile KP6. |
|---|
| 500 |
|
|---|
| 501 |
make clean |
|---|
| 502 |
perl Makefile.PL |
|---|
| 503 |
make -j 3 test |
|---|
| 504 |
|
|---|
| 505 |
=item Force re-compilation of everything. |
|---|
| 506 |
|
|---|
| 507 |
make forcerecompile |
|---|
| 508 |
setenv PERL5LIB "./inc/v6-MiniPerl6-lib5" (XXX can this step be removed?) |
|---|
| 509 |
make |
|---|
| 510 |
|
|---|
| 511 |
I<WARNING: Do NOT use -j when forcing a recompile!, this will cause the Makefile |
|---|
| 512 |
to crash. The make process will attempt to use code that has not yet been |
|---|
| 513 |
compiled.> |
|---|
| 514 |
|
|---|
| 515 |
=item To execute a script. |
|---|
| 516 |
|
|---|
| 517 |
perl scripts/kp6 [perl6 file] |
|---|
| 518 |
|
|---|
| 519 |
|
|---|
| 520 |
=item To compile a perl6 script and view resulting source: |
|---|
| 521 |
|
|---|
| 522 |
perl scripts/kp6 -o [outputfile.pl] [source perl6 file] |
|---|
| 523 |
|
|---|
| 524 |
=item To debug perl6 in perl5 code scripts. |
|---|
| 525 |
|
|---|
| 526 |
setenv PERL5LIB compiled/perl5-kp6-mp6/lib |
|---|
| 527 |
perl -d (some script) |
|---|
| 528 |
DB> $DB::deep = 500; |
|---|
| 529 |
|
|---|
| 530 |
I<Do to the recurisve nature of the code, you're likely to hit 100 pertty fast.> |
|---|
| 531 |
|
|---|
| 532 |
=back |
|---|
| 533 |
|
|---|
| 534 |
=head2 Miscellaneous Notes |
|---|
| 535 |
|
|---|
| 536 |
L<http://irclog.perlgeek.de/perl6/2007-01-22#i_-60765> |
|---|
| 537 |
|
|---|
| 538 |
fglock: hmm - maybe for mp6; need to find a way to do eval() to |
|---|
| 539 |
|
|---|
| 540 |
L<http://cataclysm.cx/2006/08/19/closures-in-c/> |
|---|
| 541 |
|
|---|
| 542 |
Closures in C |
|---|
| 543 |
By: eaten by a grue |
|---|
| 544 |
|
|---|
| 545 |
=head2 See Also |
|---|
| 546 |
|
|---|
| 547 |
A Two-Dimensional Separation of Concerns for Compiler Construction |
|---|
| 548 |
|
|---|
| 549 |
L<http://www.cis.uab.edu/gray/Pubs/sac-2005-carl.pdf> |
|---|
| 550 |
|
|---|
| 551 |
- Compares the visitor pattern (used by kp6) with other approaches |
|---|
| 552 |
|
|---|
| 553 |
=head1 AUTHORS |
|---|
| 554 |
|
|---|
| 555 |
The Pugs Team E<lt>perl6-compiler@perl.orgE<gt>. |
|---|
| 556 |
|
|---|
| 557 |
=head1 SEE ALSO |
|---|
| 558 |
|
|---|
| 559 |
The Perl 6 homepage at L<http://dev.perl.org/perl6>. |
|---|
| 560 |
|
|---|
| 561 |
The Pugs homepage at L<http://pugscode.org/>. |
|---|
| 562 |
|
|---|
| 563 |
=head1 COPYRIGHT |
|---|
| 564 |
|
|---|
| 565 |
Copyright 2007 by Flavio Soibelmann Glock and others. |
|---|
| 566 |
|
|---|
| 567 |
This program is free software; you can redistribute it and/or modify it |
|---|
| 568 |
under the same terms as Perl itself. |
|---|
| 569 |
|
|---|
| 570 |
See L<http://www.perl.com/perl/misc/Artistic.html> |
|---|
| 571 |
|
|---|
| 572 |
=cut |
|---|