pugs: a perl 6 implementation

335
Pugs An implementation of Perl 6 Audrey Tang

Upload: -

Post on 07-May-2015

1.367 views

Category:

Technology


1 download

DESCRIPTION

2007 Pugs talk at Google.tw.

TRANSCRIPT

Page 1: Pugs: A Perl 6 Implementation

PugsAn implementation of

Perl 6Audrey Tang

Page 2: Pugs: A Perl 6 Implementation

Page 3: Pugs: A Perl 6 Implementation

Pugs...

Page 4: Pugs: A Perl 6 Implementation

Pugs...

≝ Perl 6 Compiler

Page 5: Pugs: A Perl 6 Implementation

Pugs...

≝ Perl 6 Compiler

≝ Perl 6 Runtime

Page 6: Pugs: A Perl 6 Implementation

Pugs...

≝ Perl 6 Compiler

≝ Perl 6 Runtime

≝ Perl 6 Test Suite

Page 7: Pugs: A Perl 6 Implementation
Page 8: Pugs: A Perl 6 Implementation
Page 9: Pugs: A Perl 6 Implementation
Page 10: Pugs: A Perl 6 Implementation
Page 11: Pugs: A Perl 6 Implementation

Page 12: Pugs: A Perl 6 Implementation

Perl 6 Code

Page 13: Pugs: A Perl 6 Implementation

Perl 6 Code

✓ 130+ Modules

Page 14: Pugs: A Perl 6 Implementation

Perl 6 Code

✓ 130+ Modules

✓ 160+ Examples

Page 15: Pugs: A Perl 6 Implementation

Perl 6 Code

✓ 130+ Modules

✓ 160+ Examples

✓ 18,000+ Unit Tests

Page 16: Pugs: A Perl 6 Implementation

“Official Perl 6”

Page 17: Pugs: A Perl 6 Implementation

“Official Perl 6”

✓ Defined by semantics,not by accidents of history

Page 18: Pugs: A Perl 6 Implementation

“Official Perl 6”

✓ Defined by semantics,not by accidents of history

✓ Compatibility test suite(cf. JavaTest/TCK)

Page 19: Pugs: A Perl 6 Implementation

Spec ⇔ Test

Page 20: Pugs: A Perl 6 Implementation

Test ⇔ Spec

Page 21: Pugs: A Perl 6 Implementation

Page 22: Pugs: A Perl 6 Implementation

Perl, circa 1995

Page 23: Pugs: A Perl 6 Implementation

• use 5.000;

Perl, circa 1995

Page 24: Pugs: A Perl 6 Implementation

• use 5.000;• require 'fastcwd.pl';

Perl, circa 1995

Page 25: Pugs: A Perl 6 Implementation

• use 5.000;• require 'fastcwd.pl';• require 'newgetopt.pl';

Perl, circa 1995

Page 26: Pugs: A Perl 6 Implementation

• use 5.000;• require 'fastcwd.pl';• require 'newgetopt.pl';• require 'exceptions.pl';

Perl, circa 1995

Page 27: Pugs: A Perl 6 Implementation

Perl, circa 2005

Page 28: Pugs: A Perl 6 Implementation

• use v6-alpha;

Perl, circa 2005

Page 29: Pugs: A Perl 6 Implementation

• use v6-alpha;• use perl5:DBI;

Perl, circa 2005

Page 30: Pugs: A Perl 6 Implementation

• use v6-alpha;• use perl5:DBI;• use perl5:Encode <encode decode>;

Perl, circa 2005

Page 31: Pugs: A Perl 6 Implementation

• use v6-alpha;• use perl5:DBI;• use perl5:Encode <encode decode>;• use perl5:Template;

Perl, circa 2005

Page 32: Pugs: A Perl 6 Implementation

• use v6-alpha;• use perl5:DBI;• use perl5:Encode <encode decode>;• use perl5:Template;

• # Implementation of "crypt"eval "crypt()" :lang<perl5>;

Perl, circa 2005

Page 33: Pugs: A Perl 6 Implementation

Hybrid RuncorePugs

Pugs::RuntimePugs::CompilerPugs::Grammar

Pugs.EvalPugs.Prim

Pugs.Types

Perl 5

Runtime

GHC

Runtime

Page 34: Pugs: A Perl 6 Implementation

Hybrid Runcore

⇚ Perl 5Pugs

Pugs::RuntimePugs::CompilerPugs::Grammar

Pugs.EvalPugs.Prim

Pugs.Types

Perl 5

Runtime

GHC

Runtime

Page 35: Pugs: A Perl 6 Implementation

Hybrid Runcore

⇚ Perl 5

⇚ Haskell

Pugs

Pugs::RuntimePugs::CompilerPugs::Grammar

Pugs.EvalPugs.Prim

Pugs.Types

Perl 5

Runtime

GHC

Runtime

Page 36: Pugs: A Perl 6 Implementation

Hybrid Runcore

⇚ Perl 5

⇚ Haskell

⇚ C (.so/.dll)

Pugs

Pugs::RuntimePugs::CompilerPugs::Grammar

Pugs.EvalPugs.Prim

Pugs.Types

Perl 5

Runtime

GHC

Runtime

Page 37: Pugs: A Perl 6 Implementation

Page 38: Pugs: A Perl 6 Implementation

PugsIntermediateLanguage

Page 39: Pugs: A Perl 6 Implementation

Compilation Flow

Page 40: Pugs: A Perl 6 Implementation

Pugs

JavaScript

Haskell Perl 5

Backends

Page 41: Pugs: A Perl 6 Implementation

Pugs

JavaScript

Haskell Perl 5

YARV?JVM?

CLR? PyPy?

Backends

Page 42: Pugs: A Perl 6 Implementation

Perl 5 Backend

Augmentation (XS)PadWalker, Devel::Caller

autobox, re::override ...

SemanticsData::Bind, Class::MOP

Pugs::Runtime, Pugs::Compiler::Rule ...

Perl 5 SugarMoose, Moose::Autobox ...

Syntaxv6.pm

Pugs::Compiler::Perl6 ...

Core

perl

Tool SupportCPAN, PAUSE

Perldoc, Perl::Tidy ...

Stable

Experimental

Perl 6's CPAN stack

InfrastructureParse::Yapp

Module::Compile ...

Page 43: Pugs: A Perl 6 Implementation

Perl 5 Backend

⇛ Augment P5VM

Augmentation (XS)PadWalker, Devel::Caller

autobox, re::override ...

SemanticsData::Bind, Class::MOP

Pugs::Runtime, Pugs::Compiler::Rule ...

Perl 5 SugarMoose, Moose::Autobox ...

Syntaxv6.pm

Pugs::Compiler::Perl6 ...

Core

perl

Tool SupportCPAN, PAUSE

Perldoc, Perl::Tidy ...

Stable

Experimental

Perl 6's CPAN stack

InfrastructureParse::Yapp

Module::Compile ...

Page 44: Pugs: A Perl 6 Implementation

Perl 5 Backend

⇛ Augment P5VM

⇛ Deploy P6 as P5Augmentation (XS)PadWalker, Devel::Caller

autobox, re::override ...

SemanticsData::Bind, Class::MOP

Pugs::Runtime, Pugs::Compiler::Rule ...

Perl 5 SugarMoose, Moose::Autobox ...

Syntaxv6.pm

Pugs::Compiler::Perl6 ...

Core

perl

Tool SupportCPAN, PAUSE

Perldoc, Perl::Tidy ...

Stable

Experimental

Perl 6's CPAN stack

InfrastructureParse::Yapp

Module::Compile ...

Page 45: Pugs: A Perl 6 Implementation

Perl 5 Backend

⇛ Augment P5VM

⇛ Deploy P6 as P5

⇛ v6.pm on CPANAugmentation (XS)PadWalker, Devel::Caller

autobox, re::override ...

SemanticsData::Bind, Class::MOP

Pugs::Runtime, Pugs::Compiler::Rule ...

Perl 5 SugarMoose, Moose::Autobox ...

Syntaxv6.pm

Pugs::Compiler::Perl6 ...

Core

perl

Tool SupportCPAN, PAUSE

Perldoc, Perl::Tidy ...

Stable

Experimental

Perl 6's CPAN stack

InfrastructureParse::Yapp

Module::Compile ...

Page 46: Pugs: A Perl 6 Implementation

JavaScript Backend

Page 47: Pugs: A Perl 6 Implementation

JavaScript Backend

⇛ Like GWT, Hop, Links...

Page 48: Pugs: A Perl 6 Implementation

JavaScript Backend

⇛ Like GWT, Hop, Links...

⇛ Passes 90% of tests

Page 49: Pugs: A Perl 6 Implementation

JavaScript Backend

⇛ Like GWT, Hop, Links...

⇛ Passes 90% of tests

⇛ Slow - Aim for JS2/Tamarin

Page 50: Pugs: A Perl 6 Implementation

Page 51: Pugs: A Perl 6 Implementation

6.0Primitives䷁

Page 52: Pugs: A Perl 6 Implementation

6.2Functions䷗

Page 53: Pugs: A Perl 6 Implementation

6.28Objects䷒

Page 54: Pugs: A Perl 6 Implementation

6.283Grammars䷊

Page 55: Pugs: A Perl 6 Implementation

6.2831Types䷡

Page 56: Pugs: A Perl 6 Implementation

6.28318Macros䷪

Page 57: Pugs: A Perl 6 Implementation

6.283185Self Hosting

Page 58: Pugs: A Perl 6 Implementation

2πPerl 6!☯

Page 59: Pugs: A Perl 6 Implementation

Page 60: Pugs: A Perl 6 Implementation

“Frivolous Toy interpreter”(as seen on Slashdot)

Page 61: Pugs: A Perl 6 Implementation

“FrivolousToy interpreter”

Page 62: Pugs: A Perl 6 Implementation

“FrivolousToy interpreter”

Page 63: Pugs: A Perl 6 Implementation

“Toy interpreter”

Page 64: Pugs: A Perl 6 Implementation

“Toy interpreter”

Page 65: Pugs: A Perl 6 Implementation

“Toy”

Page 66: Pugs: A Perl 6 Implementation

-Ofun

Page 67: Pugs: A Perl 6 Implementation

Page 68: Pugs: A Perl 6 Implementation

Arrow length

Time

15500+ commits

290+ committers

Page 69: Pugs: A Perl 6 Implementation

Test Driven

Page 70: Pugs: A Perl 6 Implementation

Test Driven

☺Bug report ➟ Test

Page 71: Pugs: A Perl 6 Implementation

Test Driven

☺Bug report ➟ Test

☺Smoke Server

Page 72: Pugs: A Perl 6 Implementation

Test Driven

☺Bug report ➟ Test

☺Smoke Server

☺:todo<unspecced>

Page 73: Pugs: A Perl 6 Implementation

Anarchistic

Page 74: Pugs: A Perl 6 Implementation

Anarchistic

☺10+ languages

Page 75: Pugs: A Perl 6 Implementation

Anarchistic

☺10+ languages

☺30+ sub-projects

Page 76: Pugs: A Perl 6 Implementation

Anarchistic

☺10+ languages

☺30+ sub-projects

☺Aggressive recruiting

Page 77: Pugs: A Perl 6 Implementation

Patches Welcome !

Page 78: Pugs: A Perl 6 Implementation

Patches Welcome !

Page 79: Pugs: A Perl 6 Implementation

Commits Welcome!

Page 80: Pugs: A Perl 6 Implementation

Page 81: Pugs: A Perl 6 Implementation

irc.freenode.net#perl6

Page 82: Pugs: A Perl 6 Implementation

λ Camels

Page 83: Pugs: A Perl 6 Implementation

λ Camels

✆ 200+ People

Page 84: Pugs: A Perl 6 Implementation

λ Camels

✆ 200+ People✆ 20+ Regulars

Page 85: Pugs: A Perl 6 Implementation

λ Camels

✆ 200+ People✆ 20+ Regulars✆ TimToady++

Page 86: Pugs: A Perl 6 Implementation

svnbot6

Page 87: Pugs: A Perl 6 Implementation

evalbot6

Page 88: Pugs: A Perl 6 Implementation

devbot6

Page 89: Pugs: A Perl 6 Implementation

lambdabot

Page 90: Pugs: A Perl 6 Implementation

IRC.pugscode.org

Page 91: Pugs: A Perl 6 Implementation

Run.pugscode.org

Page 92: Pugs: A Perl 6 Implementation

Dev.pugscode.org

Page 93: Pugs: A Perl 6 Implementation

Invite.pugscode.org

Page 94: Pugs: A Perl 6 Implementation

Smoke.pugscode.org

Page 95: Pugs: A Perl 6 Implementation

Spec.pugscode.org

Page 96: Pugs: A Perl 6 Implementation

Blog.pugscode.org

Page 97: Pugs: A Perl 6 Implementation

Mailing Lists

Page 98: Pugs: A Perl 6 Implementation

Mailing Lists

✆ perl6-users

Page 99: Pugs: A Perl 6 Implementation

Mailing Lists

✆ perl6-users

✆ perl6-language

Page 100: Pugs: A Perl 6 Implementation

Mailing Lists

✆ perl6-users

✆ perl6-language

✆ perl6-compiler

Page 101: Pugs: A Perl 6 Implementation

Repositories

Page 102: Pugs: A Perl 6 Implementation

http://svn.pugscode.org/pugs/

Repositories

Page 103: Pugs: A Perl 6 Implementation

http://svn.pugscode.org/pugs/

http://darcs.pugscode.org/pugs/

Repositories

Page 104: Pugs: A Perl 6 Implementation

http://svn.pugscode.org/pugs/

http://darcs.pugscode.org/pugs/

SVK

Repositories

Page 105: Pugs: A Perl 6 Implementation

Page 106: Pugs: A Perl 6 Implementation

Erdösing

Page 107: Pugs: A Perl 6 Implementation

Erdösing

♨ 2006..*

Page 108: Pugs: A Perl 6 Implementation

Hackathons

Page 109: Pugs: A Perl 6 Implementation

Hackathons♨ Taipei

Page 110: Pugs: A Perl 6 Implementation

Hackathons♨ Taipei

♨ Vienna

Page 111: Pugs: A Perl 6 Implementation

Hackathons♨ Taipei

♨ Vienna

♨ Toronto

Page 112: Pugs: A Perl 6 Implementation

Hackathons♨ Taipei

♨ Vienna

♨ Toronto

♨ Amsterdam

Page 113: Pugs: A Perl 6 Implementation

Hackathons♨ Taipei

♨ Vienna

♨ Toronto

♨ Amsterdam

♨ Echt

Page 114: Pugs: A Perl 6 Implementation

Hackathons♨ Taipei

♨ Vienna

♨ Toronto

♨ Amsterdam

♨ Echt

♨ Lismore

Page 115: Pugs: A Perl 6 Implementation

Hackathons♨ Taipei

♨ Vienna

♨ Toronto

♨ Amsterdam

♨ Echt

♨ Lismore

♨ Mt. Arbel

Page 116: Pugs: A Perl 6 Implementation

Hackathons♨ Taipei

♨ Vienna

♨ Toronto

♨ Amsterdam

♨ Echt

♨ Lismore

♨ Mt. Arbel

♨ Vienna2

Page 117: Pugs: A Perl 6 Implementation

Hackathons♨ Taipei

♨ Vienna

♨ Toronto

♨ Amsterdam

♨ Echt

♨ Lismore

♨ Mt. Arbel

♨ Vienna2

♨ Tokyo

Page 118: Pugs: A Perl 6 Implementation

Hackathons♨ Taipei

♨ Vienna

♨ Toronto

♨ Amsterdam

♨ Echt

♨ Lismore

♨ Mt. Arbel

♨ Vienna2

♨ Tokyo

♨ Redmond

Page 119: Pugs: A Perl 6 Implementation

Hackathons♨ Taipei

♨ Vienna

♨ Toronto

♨ Amsterdam

♨ Echt

♨ Lismore

♨ Mt. Arbel

♨ Vienna2

♨ Tokyo

♨ Redmond

♨ Chicago

Page 120: Pugs: A Perl 6 Implementation

Hackathons♨ Taipei

♨ Vienna

♨ Toronto

♨ Amsterdam

♨ Echt

♨ Lismore

♨ Mt. Arbel

♨ Vienna2

♨ Tokyo

♨ Redmond

♨ Chicago

♨ Boston

Page 121: Pugs: A Perl 6 Implementation

Hackathons♨ Taipei

♨ Vienna

♨ Toronto

♨ Amsterdam

♨ Echt

♨ Lismore

♨ Mt. Arbel

♨ Vienna2

♨ Tokyo

♨ Redmond

♨ Chicago

♨ Boston

♨ Portland

Page 122: Pugs: A Perl 6 Implementation

Hackathons♨ Taipei

♨ Vienna

♨ Toronto

♨ Amsterdam

♨ Echt

♨ Lismore

♨ Mt. Arbel

♨ Vienna2

♨ Tokyo

♨ Redmond

♨ Chicago

♨ Boston

♨ Portland

♨ Sao Paulo

Page 123: Pugs: A Perl 6 Implementation

Hackathons♨ Taipei

♨ Vienna

♨ Toronto

♨ Amsterdam

♨ Echt

♨ Lismore

♨ Mt. Arbel

♨ Vienna2

♨ Tokyo

♨ Redmond

♨ Chicago

♨ Boston

♨ Portland

♨ Sao Paulo

♨ Mountain View?

Page 124: Pugs: A Perl 6 Implementation

Perl 6 Reconciling the

IrreconcilableAudrey Tang

Page 125: Pugs: A Perl 6 Implementation

Page 126: Pugs: A Perl 6 Implementation

Practical

Page 127: Pugs: A Perl 6 Implementation
Page 128: Pugs: A Perl 6 Implementation
Page 129: Pugs: A Perl 6 Implementation
Page 130: Pugs: A Perl 6 Implementation
Page 131: Pugs: A Perl 6 Implementation
Page 132: Pugs: A Perl 6 Implementation
Page 133: Pugs: A Perl 6 Implementation
Page 134: Pugs: A Perl 6 Implementation
Page 135: Pugs: A Perl 6 Implementation
Page 136: Pugs: A Perl 6 Implementation

Page 137: Pugs: A Perl 6 Implementation

Abstractions➥ Sexy

Page 138: Pugs: A Perl 6 Implementation

Closuressub make_counter { my $start = shift; return sub { ++$start };} my $from_ten = make_counter(10);my $from_three = make_counter(3); print $from_three->(); # 4print $from_three->(); # 5print $from_ten->(); # 11

Page 139: Pugs: A Perl 6 Implementation

Staged EvaluationBEGIN { print "Compile-time"; eval $generated_code; print "Still in compiler";}print "Normal runtime";eval $more_generated_code;

Page 140: Pugs: A Perl 6 Implementation

Runtime Typecasting

my $piece = Pawn->new;bless $piece, Queen;

Page 141: Pugs: A Perl 6 Implementation

S

Page 142: Pugs: A Perl 6 Implementation

Shorthands➥ Natural

Page 143: Pugs: A Perl 6 Implementation

Contexts

# Scalar vs. List context

my $one = <STDIN>; # Read one linemy @all = <STDIN>; # Read all lines

# String vs. Numeric context

print "Lines: @all" if @all < 10;

Page 144: Pugs: A Perl 6 Implementation

Tied Variables

tie my %search => 'Tie::Google';print $search{'Perl Pugs'}[0]{URL};# http://www.pugscode.org/

Page 145: Pugs: A Perl 6 Implementation

Regular Expresisons

# DeCSSs''$/=\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

Page 146: Pugs: A Perl 6 Implementation

Page 147: Pugs: A Perl 6 Implementation

Best coding➥ No coding

Page 148: Pugs: A Perl 6 Implementation
Page 149: Pugs: A Perl 6 Implementation

CPAN

Page 150: Pugs: A Perl 6 Implementation

♡ 11 years

CPAN

Page 151: Pugs: A Perl 6 Implementation

♡ 11 years

♡ 5500+ authors

CPAN

Page 152: Pugs: A Perl 6 Implementation

♡ 11 years

♡ 5500+ authors

♡ 11000+ modules

CPAN

Page 153: Pugs: A Perl 6 Implementation

Services

Page 154: Pugs: A Perl 6 Implementation

♡ Package Management

Services

Page 155: Pugs: A Perl 6 Implementation

♡ Package Management

♡ Rating & Discussion

Services

Page 156: Pugs: A Perl 6 Implementation

♡ Package Management

♡ Rating & Discussion

♡ Smoke Testing

Services

Page 157: Pugs: A Perl 6 Implementation

♡ Package Management

♡ Rating & Discussion

♡ Smoke Testing

♡ Issue Tracking

Services

Page 158: Pugs: A Perl 6 Implementation

Vocabulary≩ Syntax

Page 159: Pugs: A Perl 6 Implementation

“The Best thing happened to Perl”

Page 160: Pugs: A Perl 6 Implementation

But...

Page 161: Pugs: A Perl 6 Implementation

Perl 5is not the best thing

for CPAN

Page 162: Pugs: A Perl 6 Implementation

Page 163: Pugs: A Perl 6 Implementation

SyntaxRedundancy

Page 164: Pugs: A Perl 6 Implementation
Page 165: Pugs: A Perl 6 Implementation

• use v5;

Page 166: Pugs: A Perl 6 Implementation

• use v5;• sub render {

Page 167: Pugs: A Perl 6 Implementation

• use v5;• sub render {• my $self = shift;

Page 168: Pugs: A Perl 6 Implementation

• use v5;• sub render {• my $self = shift;• my %opts = (x => 1, y => 1, z => 0, %{$_[0]});

Page 169: Pugs: A Perl 6 Implementation

• use v5;• sub render {• my $self = shift;• my %opts = (x => 1, y => 1, z => 0, %{$_[0]});• for my $item ( $self->filter(@{ $self->{items} }) ) {

Page 170: Pugs: A Perl 6 Implementation

• 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";

Page 171: Pugs: A Perl 6 Implementation

• 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";

• }}

Page 172: Pugs: A Perl 6 Implementation
Page 173: Pugs: A Perl 6 Implementation

• use v6-alpha;

Page 174: Pugs: A Perl 6 Implementation

• use v6-alpha;• method render ($x = 1, $y = 1, $z = 0) {

Page 175: Pugs: A Perl 6 Implementation

• use v6-alpha;• method render ($x = 1, $y = 1, $z = 0) {• for @.filter(@.items) {

Page 176: Pugs: A Perl 6 Implementation

• use v6-alpha;• method render ($x = 1, $y = 1, $z = 0) {• for @.filter(@.items) {• say .draw(:$x, :$y, :$z);

}}

Page 177: Pugs: A Perl 6 Implementation

JengaInternals☣

Page 178: Pugs: A Perl 6 Implementation
Page 179: Pugs: A Perl 6 Implementation

Bug-for-bug compatibility

Page 180: Pugs: A Perl 6 Implementation

Best Practicetakes discipline

Page 181: Pugs: A Perl 6 Implementation
Page 182: Pugs: A Perl 6 Implementation

Best Practiceshould be Natural!

Page 183: Pugs: A Perl 6 Implementation

Page 184: Pugs: A Perl 6 Implementation

2000RFCs

Page 185: Pugs: A Perl 6 Implementation

2001Parrot

Page 186: Pugs: A Perl 6 Implementation

2002Apocalypses

Page 187: Pugs: A Perl 6 Implementation

2003Ponie

(late, as in the late Arthur Dent)

Page 188: Pugs: A Perl 6 Implementation

2004Synopses

Page 189: Pugs: A Perl 6 Implementation

2005Pugs

Page 190: Pugs: A Perl 6 Implementation

2006v6-alpha

Page 191: Pugs: A Perl 6 Implementation
Page 192: Pugs: A Perl 6 Implementation

Page 193: Pugs: A Perl 6 Implementation

Reconcile the Irreconcilable

Page 194: Pugs: A Perl 6 Implementation

Static Typingvs

Dynamic Typing

Page 195: Pugs: A Perl 6 Implementation

Types☺

Page 196: Pugs: A Perl 6 Implementation

Typing☹

Page 197: Pugs: A Perl 6 Implementation

Static(C++, OCaml...)

Page 198: Pugs: A Perl 6 Implementation

☯ Efficient

Static(C++, OCaml...)

Page 199: Pugs: A Perl 6 Implementation

☯ Efficient

☯ Robust

Static(C++, OCaml...)

Page 200: Pugs: A Perl 6 Implementation

☯ Efficient

☯ Robust

Static(C++, OCaml...)

Dynamic

(Python, Ruby, ...)

Page 201: Pugs: A Perl 6 Implementation

☯ Efficient

☯ Robust

☯ Productive

Static(C++, OCaml...)

Dynamic

(Python, Ruby, ...)

Page 202: Pugs: A Perl 6 Implementation

☯ Efficient

☯ Robust

☯ Productive

☯ Flexible

Static(C++, OCaml...)

Dynamic

(Python, Ruby, ...)

Page 203: Pugs: A Perl 6 Implementation

Gradual Typingwith Annotationsand Type Inference

Page 204: Pugs: A Perl 6 Implementation

•use v5;•sub f {• sqrt($_[0]**2 + $_[1]**2);•}•my $five = f( 3, 4 );

Page 205: Pugs: A Perl 6 Implementation

•use v6-alpha;•sub f {• sqrt(@_[0]**2 + @_[1]**2);•}•my $five = f( 3, 4 );

Page 206: Pugs: A Perl 6 Implementation

•sub f (Num $x, Num $y) {• sqrt($x**2 + $y**2);•}•my Num $five = f( 3, 4 );

Page 207: Pugs: A Perl 6 Implementation
Page 208: Pugs: A Perl 6 Implementation

• subset Positive of Num where { $_ > 0 }

Page 209: Pugs: A Perl 6 Implementation

• subset Positive of Num where { $_ > 0 }

• sub f ( Positive $x, Positive $y --> Positive where { $_ > ($x & $y) }) {

Page 210: Pugs: A Perl 6 Implementation

• subset Positive of Num where { $_ > 0 }

• sub f ( Positive $x, Positive $y --> Positive where { $_ > ($x & $y) }) {

• sqrt($x ** 2 + $y ** 2);}

Page 211: Pugs: A Perl 6 Implementation

• 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

Page 212: Pugs: A Perl 6 Implementation

Domain Specific vs

General Purpose

Page 213: Pugs: A Perl 6 Implementation

DSL(SQL, Regex, ...)

Page 214: Pugs: A Perl 6 Implementation

☯ Concise

DSL(SQL, Regex, ...)

Page 215: Pugs: A Perl 6 Implementation

☯ Concise

☯ Expressive

DSL(SQL, Regex, ...)

Page 216: Pugs: A Perl 6 Implementation

☯ Concise

☯ Expressive

DSL(SQL, Regex, ...)

GPL

(Lisp, C, ...)

Page 217: Pugs: A Perl 6 Implementation

☯ Concise

☯ Expressive

☯ Versatile

DSL(SQL, Regex, ...)

GPL

(Lisp, C, ...)

Page 218: Pugs: A Perl 6 Implementation

☯ Concise

☯ Expressive

☯ Versatile

☯ Reusable

DSL(SQL, Regex, ...)

GPL

(Lisp, C, ...)

Page 219: Pugs: A Perl 6 Implementation

Extensible Compilation

Page 220: Pugs: A Perl 6 Implementation

Macros

Page 221: Pugs: A Perl 6 Implementation

Macros

☯ Compile-time evaluation

Page 222: Pugs: A Perl 6 Implementation

Macros

☯ Compile-time evaluation

☯ All parts are swappable

Page 223: Pugs: A Perl 6 Implementation

Macros

☯ Compile-time evaluation

☯ All parts are swappable

☯ Even the lexer!

Page 224: Pugs: A Perl 6 Implementation

• macro circumfix:</* */> ($x)• is parsed /.*?/• { '' }• • /* This is a C-style comment */

Page 225: Pugs: A Perl 6 Implementation

• sub postfix:<!> ($x) {• [*] 1..$x• }• • say 10!; # 3628800

Page 226: Pugs: A Perl 6 Implementation

• macro GREETING () {• # A late-bound macro• q:code(:COMPILING){ "Hello, $s" };• }

• my $s = "world";• say GREETING; # Hello, world

Page 227: Pugs: A Perl 6 Implementation

Lazy Evaluationvs

Eager Evaluation

Page 228: Pugs: A Perl 6 Implementation

Lazy(Haskell, Unix pipes)

Page 229: Pugs: A Perl 6 Implementation

☯Modular

Lazy(Haskell, Unix pipes)

Page 230: Pugs: A Perl 6 Implementation

☯Modular

☯ Reasonable

Lazy(Haskell, Unix pipes)

Page 231: Pugs: A Perl 6 Implementation

☯Modular

☯ Reasonable

Lazy(Haskell, Unix pipes)

Eager

(everybody else)

Page 232: Pugs: A Perl 6 Implementation

☯Modular

☯ Reasonable

☯ Direct

Lazy(Haskell, Unix pipes)

Eager

(everybody else)

Page 233: Pugs: A Perl 6 Implementation

☯Modular

☯ Reasonable

☯ Direct

☯ Predictable

Lazy(Haskell, Unix pipes)

Eager

(everybody else)

Page 234: Pugs: A Perl 6 Implementation

Return-type Polymorphism with Laziness Annotations

Page 235: Pugs: A Perl 6 Implementation
Page 236: Pugs: A Perl 6 Implementation

• # "cat"for =<> { .say }

Page 237: Pugs: A Perl 6 Implementation

• # "cat"for =<> { .say }

• # "cat", together with line numbersfor each(1..*; =<>) { say "Line $^num: $^text";}

Page 238: Pugs: A Perl 6 Implementation
Page 239: Pugs: A Perl 6 Implementation

• # Lists are lazy by default

Page 240: Pugs: A Perl 6 Implementation

• # Lists are lazy by default• my @fib := (

Page 241: Pugs: A Perl 6 Implementation

• # Lists are lazy by default• my @fib := (• 0, 1,

Page 242: Pugs: A Perl 6 Implementation

• # Lists are lazy by default• my @fib := (• 0, 1,• each(@fib; @fib[1..*]).map(&infix:<+>)

);

Page 243: Pugs: A Perl 6 Implementation

• # Lists are lazy by default• my @fib := (• 0, 1,• each(@fib; @fib[1..*]).map(&infix:<+>)

);•

say "The first ten numbers are: @fib[^10]";

Page 244: Pugs: A Perl 6 Implementation
Page 245: Pugs: A Perl 6 Implementation

• # Items are eager values. However...

Page 246: Pugs: A Perl 6 Implementation

• # Items are eager values. However...• my $ignored = lazy { 10 ** (10 * 10) };

Page 247: Pugs: A Perl 6 Implementation

• # Items are eager values. However...• my $ignored = lazy { 10 ** (10 * 10) };• my $unused = lazy { say 1..$ignored };

Page 248: Pugs: A Perl 6 Implementation

• # Items are eager values. However...• my $ignored = lazy { 10 ** (10 * 10) };• my $unused = lazy { say 1..$ignored };

• say "Hello, world!";

Page 249: Pugs: A Perl 6 Implementation

Classesvs

Prototypes

Page 250: Pugs: A Perl 6 Implementation

Classes(Java, Smalltalk, ...)

Page 251: Pugs: A Perl 6 Implementation

☯ Typeful

Classes(Java, Smalltalk, ...)

Page 252: Pugs: A Perl 6 Implementation

☯ Typeful

☯ Disciplined

Classes(Java, Smalltalk, ...)

Page 253: Pugs: A Perl 6 Implementation

☯ Typeful

☯ Disciplined

Classes(Java, Smalltalk, ...)

Prototypes

(JavaScript, Lua, ...)

Page 254: Pugs: A Perl 6 Implementation

☯ Typeful

☯ Disciplined

☯ Adaptive

Classes(Java, Smalltalk, ...)

Prototypes

(JavaScript, Lua, ...)

Page 255: Pugs: A Perl 6 Implementation

☯ Typeful

☯ Disciplined

☯ Adaptive

☯ Convenient

Classes(Java, Smalltalk, ...)

Prototypes

(JavaScript, Lua, ...)

Page 256: Pugs: A Perl 6 Implementation

Meta-ObjectProtocol

Page 257: Pugs: A Perl 6 Implementation
Page 258: Pugs: A Perl 6 Implementation

• class Dog is Mammal does Companion {

Page 259: Pugs: A Perl 6 Implementation

• class Dog is Mammal does Companion {•

my $.count where 0..100;

Page 260: Pugs: A Perl 6 Implementation

• class Dog is Mammal does Companion {•

my $.count where 0..100;•

has $!brain;

Page 261: Pugs: A Perl 6 Implementation

• class Dog is Mammal does Companion {•

my $.count where 0..100;•

has $!brain;

• has &.vocalize = &say; has $.name is rw = "Fido";

Page 262: Pugs: A Perl 6 Implementation

• class Dog is Mammal does Companion {•

my $.count where 0..100;•

has $!brain;

• has &.vocalize = &say; has $.name is rw = "Fido";

• has $.fur handles Groomable; has $.tail handles <wag hang>;

Page 263: Pugs: A Perl 6 Implementation

• class Dog is Mammal does Companion {•

my $.count where 0..100;•

has $!brain;

• has &.vocalize = &say; has $.name is rw = "Fido";

• has $.fur handles Groomable; has $.tail handles <wag hang>;

• method companion handles s/^owner_// { ... }}

Page 264: Pugs: A Perl 6 Implementation
Page 265: Pugs: A Perl 6 Implementation

• my Dog $fido .= new;

Page 266: Pugs: A Perl 6 Implementation

• my Dog $fido .= new;•

$fido.HOW; # the meta object for Dog

Page 267: Pugs: A Perl 6 Implementation

• my Dog $fido .= new;•

$fido.HOW; # the meta object for Dog• $fido.WHAT; # the Dog prototype object

Page 268: Pugs: A Perl 6 Implementation

• my Dog $fido .= new;•

$fido.HOW; # the meta object for Dog• $fido.WHAT; # the Dog prototype object• $fido.WHICH; # $fido’s Object ID

Page 269: Pugs: A Perl 6 Implementation

• my Dog $fido .= new;•

$fido.HOW; # the meta object for Dog• $fido.WHAT; # the Dog prototype object• $fido.WHICH; # $fido’s Object ID

• Dog.isa(Dog); $fido.isa(Dog);

Page 270: Pugs: A Perl 6 Implementation
Page 271: Pugs: A Perl 6 Implementation

• $fido.HOW.add_method( 'bark', method () { $.vocalize('Woof!') });

Page 272: Pugs: A Perl 6 Implementation

• $fido.HOW.add_method( 'bark', method () { $.vocalize('Woof!') });

• Dog.can('bark'); $fido.can('bark');

Page 273: Pugs: A Perl 6 Implementation

Threadsvs

Processes

Page 274: Pugs: A Perl 6 Implementation

Threads(Implicit sharing)

Page 275: Pugs: A Perl 6 Implementation

☯ Intuitive

Threads(Implicit sharing)

Page 276: Pugs: A Perl 6 Implementation

☯ Intuitive

☯ Parallelizable

Threads(Implicit sharing)

Page 277: Pugs: A Perl 6 Implementation

☯ Intuitive

☯ Parallelizable

Threads(Implicit sharing)

Processes

(Explicit sharing)

Page 278: Pugs: A Perl 6 Implementation

☯ Intuitive

☯ Parallelizable

☯ Deterministic

Threads(Implicit sharing)

Processes

(Explicit sharing)

Page 279: Pugs: A Perl 6 Implementation

☯ Intuitive

☯ Parallelizable

☯ Deterministic

☯Manageable

Threads(Implicit sharing)

Processes

(Explicit sharing)

Page 280: Pugs: A Perl 6 Implementation

Concurrency☺ ☺ ☺

Page 281: Pugs: A Perl 6 Implementation

Locking☹ ☹ ☹

Page 282: Pugs: A Perl 6 Implementation
Page 283: Pugs: A Perl 6 Implementation

•async { $x.withdraw(3);

$y.deposit(3);}

Page 284: Pugs: A Perl 6 Implementation

•async { $x.withdraw(3);

$y.deposit(3);}

☣ Race Condition ☣

Page 285: Pugs: A Perl 6 Implementation
Page 286: Pugs: A Perl 6 Implementation

• async { $x.lock; $y.lock;

Page 287: Pugs: A Perl 6 Implementation

• async { $x.lock; $y.lock;

• $x.withdraw(3); $y.deposit(3);}

Page 288: Pugs: A Perl 6 Implementation

• async { $x.lock; $y.lock;

• $x.withdraw(3); $y.deposit(3);}

• async { $y.lock; $x.lock;}

Page 289: Pugs: A Perl 6 Implementation

• async { $x.lock; $y.lock;

• $x.withdraw(3); $y.deposit(3);}

• async { $y.lock; $x.lock;}

☣ Deadlock ☣

Page 290: Pugs: A Perl 6 Implementation

SoftwareTransactional

Memory

Page 291: Pugs: A Perl 6 Implementation
Page 292: Pugs: A Perl 6 Implementation

•async {• contend { # begin transaction• $x.withdraw(3); $y.deposit(3);

• } # commit or rollback•}

Page 293: Pugs: A Perl 6 Implementation
Page 294: Pugs: A Perl 6 Implementation

• # Retry with "defer"method withdraw ($n) { defer if $.balance < $n; $.balance -= $n;}

Page 295: Pugs: A Perl 6 Implementation

• # Retry with "defer"method withdraw ($n) { defer if $.balance < $n; $.balance -= $n;}

•# Choice with "maybe"sub transfer ($x1, $x2, $y) { maybe { $x1.withdraw(3) } maybe { $x2.withdraw(3) } $y.deposit(3);}

Page 296: Pugs: A Perl 6 Implementation

• # Retry with "defer"method withdraw ($n) { defer if $.balance < $n; $.balance -= $n;}

•# Choice with "maybe"sub transfer ($x1, $x2, $y) { maybe { $x1.withdraw(3) } maybe { $x2.withdraw(3) } $y.deposit(3);}

•# Composable with nested "maybe"contend { maybe { transfer($x1, $x2, $y) } maybe { transfer($x3, $x4, $y) }}

Page 297: Pugs: A Perl 6 Implementation

SIMDvs

MIMD

Page 298: Pugs: A Perl 6 Implementation

SIMD(APL, Fortran)

Page 299: Pugs: A Perl 6 Implementation

☯ Simple

SIMD(APL, Fortran)

Page 300: Pugs: A Perl 6 Implementation

☯ Simple

☯ Scalable

SIMD(APL, Fortran)

Page 301: Pugs: A Perl 6 Implementation

☯ Simple

☯ Scalable

SIMD(APL, Fortran)

MIMD

(everybody else)

Page 302: Pugs: A Perl 6 Implementation

☯ Simple

☯ Scalable

☯ Richer types

SIMD(APL, Fortran)

MIMD

(everybody else)

Page 303: Pugs: A Perl 6 Implementation

☯ Simple

☯ Scalable

☯ Richer types

☯ Familiar flow

SIMD(APL, Fortran)

MIMD

(everybody else)

Page 304: Pugs: A Perl 6 Implementation
Page 305: Pugs: A Perl 6 Implementation

• # Hyper Operator (SSE/GPU friendly)[1, 1, 2, 3, 5] »+« [1, 2, 3, 5, 8];

Page 306: Pugs: A Perl 6 Implementation

• # Hyper Operator (SSE/GPU friendly)[1, 1, 2, 3, 5] »+« [1, 2, 3, 5, 8];

• # === [2, 3, 5, 8, 13]

Page 307: Pugs: A Perl 6 Implementation
Page 308: Pugs: A Perl 6 Implementation

•# Recursive Visits-« [[1, 2], 3];

Page 309: Pugs: A Perl 6 Implementation

•# Recursive Visits-« [[1, 2], 3];

•# === [[-1, -2], -3]

Page 310: Pugs: A Perl 6 Implementation
Page 311: Pugs: A Perl 6 Implementation

•# Hyper Methods[1, 4, 9, 16]».sqrt;

Page 312: Pugs: A Perl 6 Implementation

•# Hyper Methods[1, 4, 9, 16]».sqrt;

•# === [1, 2, 3, 4]

Page 313: Pugs: A Perl 6 Implementation
Page 314: Pugs: A Perl 6 Implementation

• % time pugs -e '(1..100000)>>.sqrt'real 9.387suser 9.219s

Page 315: Pugs: A Perl 6 Implementation

• % time pugs -e '(1..100000)>>.sqrt'real 9.387suser 9.219s

•% time env GHCRTS=-N2 pugs -e '(1..100000)>>.sqrt'real 5.807suser 6.959s

Page 316: Pugs: A Perl 6 Implementation
Page 317: Pugs: A Perl 6 Implementation

• # Junctionssub is_prime (Int $n --> Bool) { $n % all(2 .. $n.sqrt+1);}

Page 318: Pugs: A Perl 6 Implementation

• # Junctionssub is_prime (Int $n --> Bool) { $n % all(2 .. $n.sqrt+1);}

•sub has_twin_prime (Int $n --> Bool) { is_prime($n & ($n ± 2));}

Page 319: Pugs: A Perl 6 Implementation

• # Junctionssub is_prime (Int $n --> Bool) { $n % all(2 .. $n.sqrt+1);}

•sub has_twin_prime (Int $n --> Bool) { is_prime($n & ($n ± 2));}

•sub infix:<±> ($x, $y) { ($x + $y) | ($x - $y);}

Page 320: Pugs: A Perl 6 Implementation

• # Junctionssub is_prime (Int $n --> Bool) { $n % all(2 .. $n.sqrt+1);}

•sub has_twin_prime (Int $n --> Bool) { is_prime($n & ($n ± 2));}

•sub infix:<±> ($x, $y) { ($x + $y) | ($x - $y);}

Page 321: Pugs: A Perl 6 Implementation

My Languagevs

Your Language

Page 322: Pugs: A Perl 6 Implementation

Perl 6

Page 323: Pugs: A Perl 6 Implementation

☯ Better

Perl 6

Page 324: Pugs: A Perl 6 Implementation

☯ Better

☯ Better

Perl 6

Page 325: Pugs: A Perl 6 Implementation

☯ Better

☯ Better

Perl 6 Others

Page 326: Pugs: A Perl 6 Implementation

☯ Better

☯ Better

☯ Better

Perl 6 Others

Page 327: Pugs: A Perl 6 Implementation

☯ Better

☯ Better

☯ Better

☯ Better

Perl 6 Others

Page 328: Pugs: A Perl 6 Implementation
Page 329: Pugs: A Perl 6 Implementation

•use jsan:DOM;•use perl5:DBI;•use haskell:Numeric;•use your_language:FavouriteModule;

Page 330: Pugs: A Perl 6 Implementation

Pugs

JavaScript

Haskell Perl 5

YARV?JVM?

CLR? PyPy?

Page 331: Pugs: A Perl 6 Implementation

Page 332: Pugs: A Perl 6 Implementation

When willPerl 6 be released?

Page 333: Pugs: A Perl 6 Implementation

By Christmas!

Page 334: Pugs: A Perl 6 Implementation

When Perl 6 arrives,every day will be like

Christmas!❆

Page 335: Pugs: A Perl 6 Implementation

Thank you!