Pugs: an Implementation of Perl 6

Pugs: an Implementation of Perl 6

Pugs an implementation of Perl 6 Audrey Tang 1 ≝ 2 Pugs... 3 Pugs... ≝ Perl 6 Compiler 3 Pugs... ≝ Perl 6 Compiler ≝ Perl 6 Runtime 3 Pugs... ≝ Perl 6 Compiler ≝ Perl 6 Runtime ≝ Perl 6 Test Suite 3 4 5 6 7 ✓ 8 Perl 6 Code 9 Perl 6 Code ✓ 120+ Modules 9 Perl 6 Code ✓ 120+ Modules ✓ 160+ Examples 9 Perl 6 Code ✓ 120+ Modules ✓ 160+ Examples ✓ 18,000+ Unit Tests 9 “Official Perl 6” 10 “Official Perl 6” ✓ Anything that passes the official test suite 10 “Official Perl 6” ✓ Anything that passes the official test suite ✓ Defined by semantics, not by accidents of history 10 Test ⇔ Spec ✓ 11 ⇚ 12 Perl, circa 1995 13 Perl, circa 1995 • use 5.000; 13 Perl, circa 1995 • use 5.000; • require 'fastcwd.pl'; 13 Perl, circa 1995 • use 5.000; • require 'fastcwd.pl'; • require 'newgetopt.pl'; 13 Perl, circa 1995 • use 5.000; • require 'fastcwd.pl'; • require 'newgetopt.pl'; • require 'exceptions.pl'; 13 Perl, circa 2005 14 Perl, circa 2005 • use v6-alpha; 14 Perl, circa 2005 • use v6-alpha; • use perl5:DBI; 14 Perl, circa 2005 • use v6-alpha; • use perl5:DBI; • use perl5:Encode <encode decode>; 14 Perl, circa 2005 • use v6-alpha; • use perl5:DBI; • use perl5:Encode <encode decode>; • use perl5:Template; 14 Perl, circa 2005 • use v6-alpha; • use perl5:DBI; • use perl5:Encode <encode decode>; • use perl5:Template; • # Implementation of "fork" eval "fork()" :lang<perl5>; 14 Dual Core Pugs GHC Perl 5 Runtime Runtime Pugs.Eval Pugs::Runtime Pugs.Prim Pugs::Compiler Pugs.Types Pugs::Grammar 15 ⇛ 16 Pugs Intermediate Language 17 Backends 18 Backends ⇛ Perl 5 18 Backends ⇛ Perl 5 ⇛ Parrot 18 Backends ⇛ Perl 5 ⇛ Parrot ⇛ JavaScript 18 19 ䷗ 20 6.0 Primitives ䷁ 21 6.2 Functions ䷗ 22 6.28 Objects ䷒ 23 6.283 Grammars ䷊ 24 6.2831 Types ䷡ 25 6.28318 Macros ䷪ 26 6.283185 Self Hosting ䷀ 27 2π Perl 6! ☯ 28 ≠ 29 “Frivolous Toy interpreter” (as seen on Slashdot) 30 “Frivolous Toy interpreter” 31 “Frivolous Toy interpreter” 32 “Toy interpreter” 33 “Toy interpreter” 34 “Toy” 35 -Ofun 36 ☺ 37 Arrow length 14400+ commits 240+ committers Time 38 Test Driven 39 Test Driven ☺Bug report ➟ Test 39 Test Driven ☺Bug report ➟ Test ☺Smoke Server 39 Test Driven ☺Bug report ➟ Test ☺Smoke Server ☺:todo<unspecced> 39 Anarchistic 40 Anarchistic ☺10+ languages 40 Anarchistic ☺10+ languages ☺30+ sub‐projects 40 Anarchistic ☺10+ languages ☺30+ sub‐projects ☺Fast feedback loop 40 Patches Welcome? 41 Commits Welcome! 42 ✆ 43 irc.freenode.net #perl6 44 λ Camels 45 λ Camels ✆ 200+ People 45 λ Camels ✆ 200+ People ✆ 20+ Regulars 45 λ Camels ✆ 200+ People ✆ 20+ Regulars ✆ TimToady++ 45 svnbot6 46 evalbot6 47 lambdabot 48 IRC.pugscode.org 49 Blog.pugscode.org 50 Run.pugscode.org 51 Smoke.pugscode.org 52 Spec.pugscode.org 53 Mailing Lists 54 Mailing Lists ✆ perl6‐users 54 Mailing Lists ✆ perl6‐users ✆ perl6‐language 54 Mailing Lists ✆ perl6‐users ✆ perl6‐language ✆ perl6‐compiler 54 Repositories 55 Repositories http://svn.openfoundry.org/pugs/ 55 Repositories http://svn.openfoundry.org/pugs/ http://perlcabal.org/~audreyt/darcs/pugs/ 55 Repositories http://svn.openfoundry.org/pugs/ http://perlcabal.org/~audreyt/darcs/pugs/ SVK 55 ♨ 56 Erdösing 57 Erdösing ♨ 2006..* 57 Hackathons 58 Hackathons ♨ Taipei 58 Hackathons ♨ Taipei ♨ Vienna 58 Hackathons ♨ Taipei ♨ Vienna ♨ Toronto 58 Hackathons ♨ Taipei ♨ Vienna ♨ Toronto ♨ Amsterdam 58 Hackathons ♨ Taipei ♨ Vienna ♨ Toronto ♨ Amsterdam ♨ Echt 58 Hackathons ♨ Taipei ♨ Vienna ♨ Toronto ♨ Amsterdam ♨ Echt ♨ Lismore 58 Hackathons ♨ Taipei ♨ Vienna ♨ Toronto ♨ Amsterdam ♨ Echt ♨ Lismore ♨ Mt. Arbel 58 Hackathons ♨ Taipei ♨ Vienna2 ♨ Vienna ♨ Toronto ♨ Amsterdam ♨ Echt ♨ Lismore ♨ Mt. Arbel 58 Hackathons ♨ Taipei ♨ Vienna2 ♨ Vienna ♨ Tokyo ♨ Toronto ♨ Amsterdam ♨ Echt ♨ Lismore ♨ Mt. Arbel 58 Hackathons ♨ Taipei ♨ Vienna2 ♨ Vienna ♨ Tokyo ♨ Toronto ♨ Redmond ♨ Amsterdam ♨ Echt ♨ Lismore ♨ Mt. Arbel 58 Hackathons ♨ Taipei ♨ Vienna2 ♨ Vienna ♨ Tokyo ♨ Toronto ♨ Redmond ♨ Amsterdam ♨ Chicago ♨ Echt ♨ Lismore ♨ Mt. Arbel 58 Hackathons ♨ Taipei ♨ Vienna2 ♨ Vienna ♨ Tokyo ♨ Toronto ♨ Redmond ♨ Amsterdam ♨ Chicago ♨ Echt ♨ Boston ♨ Lismore ♨ Mt. Arbel 58 Hackathons ♨ Taipei ♨ Vienna2 ♨ Vienna ♨ Tokyo ♨ Toronto ♨ Redmond ♨ Amsterdam ♨ Chicago ♨ Echt ♨ Boston ♨ Lismore ♨ Portland ♨ Mt. Arbel 58 Hackathons ♨ Taipei ♨ Vienna2 ♨ Vienna ♨ Tokyo ♨ Toronto ♨ Redmond ♨ Amsterdam ♨ Chicago ♨ Echt ♨ Boston ♨ Lismore ♨ Portland ♨ Mt. Arbel ♨ Sao Paulo 58 Hackathons ♨ Taipei ♨ Vienna2 ♨ Vienna ♨ Tokyo ♨ Toronto ♨ Redmond ♨ Amsterdam ♨ Chicago ♨ Echt ♨ Boston ♨ Lismore ♨ Portland ♨ Mt. Arbel ♨ Sao Paulo ♨ ...and more! 58 ℙ 59 Practical 60 61 62 63 64 65 66 67 68 69 ∀ 70 Abstractions ➥ Sexy 71 Closures sub make_counter { my $start = shift; return sub { ++$start }; } my $from_ten = make_counter(10); my $from_three = make_counter(3); print $from_three‐>(); # 4 print $from_three‐>(); # 5 print $from_ten‐>(); # 11 72 Tie use Tie::Google; tie my %search => 'Tie::Google'; for (@{ $search{'Perl Pugs'} }) { print "* $_‐>{title} ‐ $_‐>{URL}\n"; } 73 Abstractions++ 74 Abstractions++ ∀ bless() 74 Abstractions++ ∀ bless() ∀ IO Layers 74 Abstractions++ ∀ bless() ∀ IO Layers ∀ BEGIN {...} 74 S 75 Shorthands ➥ Natural 76 DeCSS s''$/=\2048;while(<>){G=29;R=142;if((@a=unqT="C*",_)[20]&48){D=89;_=unqb24,qT,@ b=map{ord qB8,unqb8,qT,_^$a[‐‐D]}@INC;s/...$/1$&/;Q=unqV,qb25,_;H=73;O=$b[4]<<9 |256|$b[3];Q=Q>>8^(P=(E=255)&(Q>>12^Q>>4^Q/8^Q))<<17,O=O>>8^(E&(F=(S=O>>14&7^O) ^S*8^S<<6))<<9,_=(map{U=_%16orE^=R^=110&(S=(unqT,"\xb\ntd\xbz\x14d")[_/16%8]);E ^=(72,@z=(64,72,G^=12*(U‐2?0:S&17)),H^=_%64?12:0,@z)[_%8]}(16..271))[_]^((D>>=8 )+=P+(~F&E))for@a[128..$#a]}print+qT,@a}';s/[D‐HO‐U_]/\$$&/g;s/q/pack+/g;eval 77 Shorthands++ 78 Shorthands++ S Regex 78 Shorthands++ S Regex S Context 78 Shorthands++ S Regex S Context S Topical $_ 78 ♡ 79 Best coding ➥ No coding 80 81 CPAN 82 CPAN ♡ 11 years 82 CPAN ♡ 11 years ♡ 5000+ authors 82 CPAN ♡ 11 years ♡ 5000+ authors ♡ 10000+ modules 82 Services 83 Services ♡ Package Management 83 Services ♡ Package Management ♡ Rating & Discussion 83 Services ♡ Package Management ♡ Rating & Discussion ♡ Smoke Testing 83 Services ♡ Package Management ♡ Rating & Discussion ♡ Smoke Testing ♡ Issue Tracking 83 Vocabulary ≩ Syntax 84 “The Best thing happened to Perl” 85 But... 86 Perl 5 is not the best thing for CPAN 87 ☣ 88 Syntax Redundancy ☣ 89 90 • use v5; 90 • use v5; • sub render { 90 • use v5; • sub render { • my $self = shift; 90 • use v5; • sub render { • my $self = shift; • my %opts = (x => 1, y => 1, z => 0, %{$_[0]}); 90 • use v5; • sub render { • my $self = shift; • my %opts = (x => 1, y => 1, z => 0, %{$_[0]}); • for my $item ( $self‐>filter(@{ $self‐>{items} }) ) { 90 • use v5; • sub render { • my $self = shift; • my %opts = (x => 1, y => 1, z => 0, %{$_[0]}); • for my $item ( $self‐>filter(@{ $self‐>{items} }) ) { • print $item‐>draw({ x => $opts{x}, y => $opts{y}, z => $opts{z}, }), "\n"; 90 • use v5; • sub render { • my $self = shift; • my %opts = (x => 1, y => 1, z => 0, %{$_[0]}); • for my $item ( $self‐>filter(@{ $self‐>{items} }) ) { • print $item‐>draw({ x => $opts{x}, y => $opts{y}, z => $opts{z}, }), "\n"; • } } 90 91 • use v6‐alpha; 91 • use v6‐alpha; • method render ($x = 1, $y = 1, $z = 0) { 91 • use v6‐alpha; • method render ($x = 1, $y = 1, $z = 0) { • for @.filter(@.items) { 91 • use v6‐alpha; • method render ($x = 1, $y = 1, $z = 0) { • for @.filter(@.items) { • say .draw(:$x, :$y, :$z); } } 91 Jenga Internals ☣ 92 93 Bug‐for‐bug compatibility ☣ 94 Best Practice takes discipline 95 96 Best Practice should be Natural! 97 ⑥ 98 2000 RFCs 99 2001 Parrot 100 2002 Apocalypses 101 2003 Ponie (late, as in the late Arthur Dent) 102 2004 Synopses 103 2005 Pugs 104 2006 v6‐alpha 105 106 ☯ 107 Reconcile the Irreconcilable 108 Static vs Dynamic 109 Types ☺ 110 Typing ☹ 111 •use v5; •sub f { • sqrt($_[0] ** 2 + $_[1] ** 2) •} •my $five = f( 3, 4 ); 112 •use v6‐alpha; •sub f { • sqrt(@_[0] ** 2 + @_[1] ** 2) •} •my $five = f( 3, 4 ); 113 Gradual Typing with Annotations 114 • sub f (Num $x, Num $y) { • sqrt($x ** 2 + $y ** 2); • } • my Num $five = f( 3, 4 ); • 115 116 • subset Positive of Num where { $_ > 0 } 116 • subset Positive of Num where { $_ > 0 } • sub f ( Positive $x, Positive $y ‐‐> Positive where { $_ >= ($x & $y) } ) { 116 • subset Positive of Num where { $_ > 0 } • sub f ( Positive $x, Positive $y ‐‐> Positive where { $_ >= ($x & $y) } ) { • sqrt($x ** 2 + $y ** 2); } 116 • subset Positive of Num where { $_ > 0 } • sub f ( Positive $x, Positive $y ‐‐> Positive where { $_ >= ($x & $y) } ) { • sqrt($x ** 2 + $y ** 2); } • my $five := f(3, 4); # inferred as Positive 116 Compiler vs Runtime 117 BEGIN {...} 118 BEGIN {...} • Compiler is a REPL 118 BEGIN {...} • Compiler is a REPL • Expose the entire compiler 118 BEGIN {...} • Compiler is a REPL • Expose the entire compiler • All parts are swappable 118 BEGIN {...} • Compiler is a REPL • Expose the entire compiler • All parts are swappable • Even the lexer! 118 • macro circumfix:</* */> ($x) • is parsed /.*?/ • { '' } • • /* This is a C‐style comment */ • 119 • sub postfix:<!> ($x) { • [*] 1..$x • } • • say 10!; # 3628800 120 • macro GREETING () { • # A late‐bound macro • q:code(:COMPILING){ "Hello, $s" }; • } • my $s = "world"; • say GREETING; # Hello, world 121 Lazy vs Eager 122 123 • # "cat" for =<> { .say } 123 • # "cat" for =<> { .say } • # "cat", annotated with line numbers for each(1..*; =<>) { say "Line $^num: $^text"; } 123 124 • # Lists are lazy streams! my @fib = ( 124 • # Lists are lazy streams! my @fib = ( • 0, 1, 124 • # Lists are lazy streams! my @fib = ( • 0, 1, • each(@fib; @fib[1..*]).map(&infix:<+>) ); 124 • # Lists are lazy streams! my @fib = ( • 0, 1, • each(@fib; @fib[1..*]).map(&infix:<+>) ); • say "The first ten numbers are: @fib[^10]"; 124 125 • # Items are eager values. However... 125 • # Items are eager values. However... • my $ignored = lazy { 9 ** 9 ** 9 }; 125 • # Items are eager values.

View Full Text

Details

  • File Type
    pdf
  • Upload Time
    -
  • Content Languages
    English
  • Upload User
    Anonymous/Not logged-in
  • File Pages
    424 Page
  • File Size
    -

Download

Channel Download Status
Express Download Enable

Copyright

We respect the copyrights and intellectual property rights of all users. All uploaded documents are either original works of the uploader or authorized works of the rightful owners.

  • Not to be reproduced or distributed without explicit permission.
  • Not used for commercial purposes outside of approved use cases.
  • Not used to infringe on the rights of the original creators.
  • If you believe any content infringes your copyright, please contact us immediately.

Support

For help with questions, suggestions, or problems, please contact us