Slide 1

Slide 1 text

LIGHTWEIGHTLANGUAGEDECADE プログラミング言語処理系を 自作してわかったこと @tokuhirom @kazuho @Constellation @yukihiro_matz @takesako

Slide 2

Slide 2 text

LIGHTWEIGHTLANGUAGEDECADE 【新作】プログラミング言語処理系の紹介 1. next Perl5プログラミング言語Toraの設計と実装 @tokuhirom 2. 世界で最も仕様に忠実なECMAScript言語処理系 @Constellation 3. 型安全なJavaScript処理系JSXを作ってみた @kazuho 4. 組み込みを意識したmrubyを作ってみた @yukihiro_matz

Slide 3

Slide 3 text

LIGHTWEIGHTLANGUAGEDECADE 【参考】Perl6 Update 司会 @takesako

Slide 4

Slide 4 text

LIGHTWEIGHTLANGUAGEDECADE 2009/04/06 Cybozu University 4 Perl1 1987

Slide 5

Slide 5 text

LIGHTWEIGHTLANGUAGEDECADE 2009/04/06 Cybozu University 5 Perl4 1991

Slide 6

Slide 6 text

LIGHTWEIGHTLANGUAGEDECADE 2009/04/06 Cybozu University 6 Perl5 1994

Slide 7

Slide 7 text

LIGHTWEIGHTLANGUAGEDECADE 2009/04/06 Cybozu University 7 Perl5.8 2002

Slide 8

Slide 8 text

LIGHTWEIGHTLANGUAGEDECADE 問題1

Slide 9

Slide 9 text

LIGHTWEIGHTLANGUAGEDECADE 【問題1】何をするプログラムでしょうか? 入力A < input #!perl -p0 s+¥.+map/¥e/g,$`.82/341x3^($^x3).$_+eg ................[LF] ................[LF] ..*.............[LF] ................[LF] ................[LF] ................[LF] ......*.........[LF] ................[LF] 出力A > output 0000000000000000[LF] 0111000000000000[LF] 01*1000000000000[LF] 0111000000000000[LF] 0000000000000000[LF] 0000011100000000[LF] 000001*100000000[LF] 0000011100000000[LF]

Slide 10

Slide 10 text

LIGHTWEIGHTLANGUAGEDECADE 【問題1】何をするプログラムでしょうか? 入力B < input #!perl -p0 s+¥.+map/¥e/g,$`.82/341x3^($^x3).$_+eg ................[LF] ................[LF] ....***.....***.[LF] ...**.*....**.*.[LF] ..**......**....[LF] ...*****...*****[LF] ...*.*.*...*.*.*[LF] ...*.***...*.***[LF] 出力B > output 0000000000000000[LF] 0001232100012321[LF] 0013***20013***2[LF] 013**5*2013**5*2[LF] 01**654311**6543[LF] 014*****214*****[LF] 003*7*8*303*7*8*[LF] 002*4***202*4***[LF]

Slide 11

Slide 11 text

LIGHTWEIGHTLANGUAGEDECADE 【解説】マジックナンバー 82/341 って何? #!perl -p0 s+¥.+map/¥e/g,$`.82/341x3^($^x3).$_+eg 割り算で 111 が並ぶ 17byte の文字列を生成 する 98/880: 0.111363636363636 (17byte) 99/888: 0.111486486486486 (17byte) 37/997: 0.037111334002006 (17byte) 83/881: 0.094211123723042 (17byte) 77/934: 0.082441113490364 (17byte) 82/341: 0.240469208211144 (17byte)

Slide 12

Slide 12 text

LIGHTWEIGHTLANGUAGEDECADE Minesweeper マインスイーパ

Slide 13

Slide 13 text

LIGHTWEIGHTLANGUAGEDECADE

Slide 14

Slide 14 text

LIGHTWEIGHTLANGUAGEDECADE 2009/04/06 Cybozu University 14 Perl5.16 2012

Slide 15

Slide 15 text

LIGHTWEIGHTLANGUAGEDECADE 問題2

Slide 16

Slide 16 text

LIGHTWEIGHTLANGUAGEDECADE 【問題2】何をするプログラムでしょうか? ""=~(("('''''''''''''(''''''')''' ''''''''''''='''''''''''''''''''' '''''''''''''''''''''='='=''''''= '''''''''''''''''''''=''''('''''' '')'''''''=''=''''''''''''(=')=)= |~~~)=~~(~~(~~)~==~~~)=~~(~~(~~)~ ==~~~~)=~~)=~~=~|~~~)=~~(~~(~~)~= =~~~(~~~~)|~=~~~)~|~~=~~")) ~ 約52,000バイト ~

Slide 17

Slide 17 text

LIGHTWEIGHTLANGUAGEDECADE 【問題2】何をするプログラムでしょうか? ""=~(("('''''''''''''(''''''')''' ''''''''''''='''''''''''''''''''' '''''''''''''''''''''='='=''''''= '''''''''''''''''''''=''''('''''' '')'''''''=''=''''''''''''(=')=)= |~~~)=~~(~~(~~)~==~~~)=~~(~~(~~)~ ==~~~~)=~~)=~~=~|~~~)=~~(~~(~~)~= =~~~(~~~~)|~=~~~)~|~~=~~")) ~ 約52,000バイト の Perl 正規表現 ~

Slide 18

Slide 18 text

LIGHTWEIGHTLANGUAGEDECADE Demo

Slide 19

Slide 19 text

LIGHTWEIGHTLANGUAGEDECADE 37秒で上級をクリア(爆弾99個)

Slide 20

Slide 20 text

LIGHTWEIGHTLANGUAGEDECADE Perl 5 “Hello, world!” package Earth;sub Greet{ %_=('Y','~');$_='$;=!(Middle Earth.age~~~,~~~~~~~~~~~~~~~~~~~~~~~~~~YY ~~~~~~~~~~~@_~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~"~~~~~~~~~~~~~~~~~~~';; s,(~|¥r|¥n|¥s),,g;s.Y.¥x7e.g; eval};Greet;'the world'; http://www.perlmonks.org/index.pl?node_id=329174 by jbware on Feb 15, 2004 at 21:08 UTC (#329174=obfuscated)

Slide 21

Slide 21 text

LIGHTWEIGHTLANGUAGEDECADE Unreadable Perl5→ 読みにくいプログラムを量産し続けるPerl5

Slide 22

Slide 22 text

LIGHTWEIGHTLANGUAGEDECADE Readable Perl6! 読みやすいプログラムを書けるPerl6になる!

Slide 23

Slide 23 text

LIGHTWEIGHTLANGUAGEDECADE Perl 6 で書くと・・・ ね、簡単でしょ? say "Hello, world!";

Slide 24

Slide 24 text

LIGHTWEIGHTLANGUAGEDECADE 2004

Slide 25

Slide 25 text

LIGHTWEIGHTLANGUAGEDECADE Perl6 言語仕様 (language specification) 1. Apocalypse(黙示録)  Larry Wall が Perl6 のデザインについて語る  Perl6 の歴史的な文書(33個のRFCがベース) 2. Exegesis(注釈)  Perl6 を用いたサンプルコードや Perl5 との比較  黙示録を Damian Conway が詳細に解説 3. Synopsis(概要)  Perl6 の最新の言語仕様が書かれている  黙示録のダイジェスト版

Slide 26

Slide 26 text

LIGHTWEIGHTLANGUAGEDECADE Why Perl 6 ? (モチベーション) Perl 5 は・・・ 場当たり的な拡張を繰り返し 既に Perl5 のコードは理解不能な領域に C でゴリゴリ 職人技 (needs more C hacker) Perl 6 の目指す方向 せめて OO らしく 他の言語で良いところは取り入れよう 後方互換性は無視 コンパイラと実行環境の分離 Parrot で VM 化 No more C hacker

Slide 27

Slide 27 text

LIGHTWEIGHTLANGUAGEDECADE 2005

Slide 28

Slide 28 text

LIGHTWEIGHTLANGUAGEDECADE Neko operator(範囲演算子) Damian Conway氏が OSCON2005 で発音 http://www.rubyist.net/~matz/20050803.html 末尾を含まない「..^」 先頭を含まない「^..」 先頭と末尾を含まない「^..^」 Perl6 my @a = (1..^5); # (1,2,3,4) my @b = (1^..5); # (2,3,4,5) my @c = (1^..^5); # (2,3,4)

Slide 29

Slide 29 text

LIGHTWEIGHTLANGUAGEDECADE ネコ演算子 neko operator ^..^ ネコ耳モード♪ Damian Conway 日本の漫画好き? http://www.amazon.co.jp/dp/4847034864/

Slide 30

Slide 30 text

LIGHTWEIGHTLANGUAGEDECADE ・・・

Slide 31

Slide 31 text

LIGHTWEIGHTLANGUAGEDECADE 救世主 Pugs の登場 Pugs = Perl6 User’s Golfing System Yet another Perl6 implementation → Perl6 が動いた! 2005/02/06 (1|2)+(3|4)→(4|5|6)

Slide 32

Slide 32 text

LIGHTWEIGHTLANGUAGEDECADE Audrey Tang (唐鳳) CPAN界隈で有名 PARの作者 1981年生まれ 国籍:台湾 http://en.wikipedia.org/wiki/Audrey_Tang 高橋メソッドを世界に輸出した人 Perl6(Pugs)を Haskell で実装した天才プログラマー

Slide 33

Slide 33 text

LIGHTWEIGHTLANGUAGEDECADE Pugs の拡張性 powered by Haskell

Slide 34

Slide 34 text

LIGHTWEIGHTLANGUAGEDECADE 2010

Slide 35

Slide 35 text

LIGHTWEIGHTLANGUAGEDECADE 待望の Perl6 – Rakudo Star リリース!

Slide 36

Slide 36 text

LIGHTWEIGHTLANGUAGEDECADE http://rakudo.org/

Slide 37

Slide 37 text

LIGHTWEIGHTLANGUAGEDECADE http://github.com/rakudo/star/downloads

Slide 38

Slide 38 text

LIGHTWEIGHTLANGUAGEDECADE Get your own Parrot!

Slide 39

Slide 39 text

LIGHTWEIGHTLANGUAGEDECADE 5秒でわかる Perl 6 メソッドを -> ではなく . で書けるように なった Perl 5 $obj->method(); Perl 6 $obj.method(); → これで Perl も立派なOO言語の仲間入り!

Slide 40

Slide 40 text

LIGHTWEIGHTLANGUAGEDECADE Perl 5 Sigils

Slide 41

Slide 41 text

LIGHTWEIGHTLANGUAGEDECADE $ @ %

Slide 42

Slide 42 text

LIGHTWEIGHTLANGUAGEDECADE 配列とハッシュのアクセス方法が変更 はじめての人にもわかりやすく 変数のプレフィクス $@% ルールが変更 Perl5 Perl6 my @array = (1, 2, 3); my %hash = ('a'=> 1); # 配列のメンバにアクセス my $x = $array[0]; # ハッシュのメンバにアクセス my $y = $hash{'a'} my @array = (1, 2, 3); my %hash = ('a'=> 1); # 配列のメンバにアクセス my $x = @array[0]; # ハッシュのメンバにアクセス my $y = %hash{'a'}

Slide 43

Slide 43 text

LIGHTWEIGHTLANGUAGEDECADE Perl 5 の変数(sigils rules) scalar array hash ------- ------ ------- $s @a %h $$s $a[0] $h{'?'} $s->foo ☹ ☹

Slide 44

Slide 44 text

LIGHTWEIGHTLANGUAGEDECADE Perl 6 の変数(Sigils rule) scalar array hash ------- ------ ------- $s @a %h $$s @a[0] %h> $s.foo @a.foo %h.foo ☺

Slide 45

Slide 45 text

LIGHTWEIGHTLANGUAGEDECADE Perl 6 で失ったもの ~後方互換性~ 文字列の連結 .(ドット)→ ~(チルダ)に Perl5 # メソッド呼び出し $obj->method(); sub func { return "x"; } # 文字列の連結 my $a = "str"; my $b = $a.func(); Perl6 一時期 ” _ ” という案もあったが…スペース入れるのが面倒 # メソッド呼び出し $obj.method(); sub func { return "x"; } # 文字列の連結 my $a = "str"; my $b = $a~func();

Slide 46

Slide 46 text

LIGHTWEIGHTLANGUAGEDECADE () 括弧省略 if, for, while, do ブロックでの(括弧省略) キータイプの量が少なくなった Perl5 Perl6 if ($a eq $b) { print "a=b¥n"; } while ($i > 0) { $i--; } if $a eq $b { say "a=b"; } while $i > 0 { $i--; }

Slide 47

Slide 47 text

LIGHTWEIGHTLANGUAGEDECADE Piping operators(<==, ==>) Perl6 @result = map { floor($^x / 2) } grep { /^ ¥d+ $/ } @data; @result <== map { floor($^x / 2) } <== grep { /^ ¥d+ $/ } <== @data; @data ==> grep { /^ ¥d+ $/ } ==> map { floor($^x / 2) } ==> @result;

Slide 48

Slide 48 text

LIGHTWEIGHTLANGUAGEDECADE ・・・

Slide 49

Slide 49 text

LIGHTWEIGHTLANGUAGEDECADE

Slide 50

Slide 50 text

LIGHTWEIGHTLANGUAGEDECADE

Slide 51

Slide 51 text

LIGHTWEIGHTLANGUAGEDECADE 2009/04/06 Cybozu University 51 Parrot

Slide 52

Slide 52 text

LIGHTWEIGHTLANGUAGEDECADE Parrot Parrot Assembler (PASM) PASM set I1, 33 set I2, 5 mod I3, I1, I2 if I3, REMA print "5 is an integer divisor of 33" branch DONE REMA: print "5 divides 33 with remainder " print I3 DONE: print "¥n" end 33÷5=6、余り2 を計算する (5 into 33 is 6, remainder 2)

Slide 53

Slide 53 text

LIGHTWEIGHTLANGUAGEDECADE Perl6 の実装方針 Parrot Perl6 を Parrot で書く Perl5 を Parrot で動くようにする (Ponie Project)

Slide 54

Slide 54 text

LIGHTWEIGHTLANGUAGEDECADE Parrot エイプリルフールネタ

Slide 55

Slide 55 text

LIGHTWEIGHTLANGUAGEDECADE all your language are belong to us - Project Perl 6 -

Slide 57

Slide 57 text

LIGHTWEIGHTLANGUAGEDECADE Perl 6 cheat sheet »ö« * / % %% div next, last, redo # loop controls + - proceed, succeed # switch controls x xx TYPES ~ Bool Bit Int Rat FatRat UInt Num Complex int32 complex64 etc. & Str Cat Blob Char Byte Codepoint Grapheme Buf buf8 buf32 utf8 | ^ IO Mu Any Cool Junction Whatever Match sleep abs sin temp Parcel Capture Signature <=> leg cmp .. but SCOPE DECLARATORS Pair Range Set Bag ~~ > == gt eq === eqv !op my lexical scope KeyHash KeySet KeyBag && our package scope Scalar Array Hash Code || ^^ // min max has instance scope Enum Order TrigBase ??!! ff anon no scope at all Block Routine Sub = := op= => state persistent lexical Method Regex so not augment benign parasitic Failure Exception , : supersede deadly parasitic Instant Duration X Xop Z Zop ... Date DateTime say die map etc. OPERATOR DOMAINS and Numeric: == !==(!=) + < > <=> <= >= or xor Stringy: eq !eq(ne) ~ lt gt leg le ge <== ==> Value: eqv !eqv before after cmp !after !before ObjectID: === !===

Slide 58

Slide 58 text

LIGHTWEIGHTLANGUAGEDECADE Perl 6 cheat sheet »ö« METAOPERATORS LINKS IRC [op] reduce listop to A op B op C... perl6.org #perl6 irc.freenode.net op= A = A op B rakudo.org #parrot irc.perl.org !op !(A op B) »op« hyper/vectorize REGEX METACHARS REGEX MODIFIERS Zop zip with op ^ $ string begin/end :i ignore case Xop cross with op ^^ $$ line begin/end :m ignore marks Rop reverse args + one or more :g global Sop sequentialize * zero or more :r ratchet ? zero or one :s sigspace SPECIAL VARIABLES **1..3 repeat in range :4th nth occurrence $_ current topic () capture to $0,$1 :4x n times $/ regex result [] no capture $! error object subrule REGEX CHARCLASSES @*ARGS command line <[]> character class . == anychar, ¥N non ¥n @*INC include path | parallel or ¥s == , ¥S non %*ENV environment || serial or ¥d == , ¥D non $*PID process id « » word boundary ¥w == <+alpha+digit+[_]>

Slide 59

Slide 59 text

LIGHTWEIGHTLANGUAGEDECADE O’REILLY

Slide 60

Slide 60 text

LIGHTWEIGHTLANGUAGEDECADE NOT’REALLY

Slide 61

Slide 61 text

LIGHTWEIGHTLANGUAGEDECADE

Slide 62

Slide 62 text

LIGHTWEIGHTLANGUAGEDECADE Second System Syndrome (The Mythical Man-Month)  2度目にデザインするシステ ムは失敗作になりやすい説  1度目のデザインは自分の能力 を把握していないので慎重に  3度目のデザインは何が普遍的 で何が特殊なものか分かるので 正確に作ることができる  しかし2度目のデザインでは、 最初のデザインで抑えたアイデ ア・装飾を思い切り詰め込んで しまうので失敗作になりやすい 人月の神話―狼人間を撃つ銀の弾はない ISBN: 4894716658 → Perl6 は構想10年!

Slide 63

Slide 63 text

LIGHTWEIGHTLANGUAGEDECADE next Perl5プログラミング言語 Toraの設計と実装 @tokuhirom

Slide 64

Slide 64 text

LIGHTWEIGHTLANGUAGEDECADE 世界で最も仕様に忠実な ECMAScript言語処理系 @Constellation

Slide 65

Slide 65 text

LIGHTWEIGHTLANGUAGEDECADE 型安全なJavaScript処理系 JSXを作ってみた @kazuho

Slide 66

Slide 66 text

LIGHTWEIGHTLANGUAGEDECADE 組み込みを意識した mrubyを作ってみた @yukihiro_matz

Slide 67

Slide 67 text

LIGHTWEIGHTLANGUAGEDECADE Q&A

Slide 68

Slide 68 text

LIGHTWEIGHTLANGUAGEDECADE 68