340 likes | 735 Views
Pugs でお手軽 Perl6 入門. Shibuya Perl Mongers テクニカルトーク #6 竹迫 良範 takesako@namazu.org. アンケート. 難しい話は一切いたしません(ご安心ください). Pugs 使ったことある人? Parrot アセンブラ使ったことある人? Perl6 の言語仕様を知っている人?. 5秒でわかる Perl6. メソッドを -> ではなく . で書けるようになった. Perl5. Perl6. $obj -> method();. $obj . method();.
E N D
Pugs でお手軽 Perl6 入門 Shibuya Perl Mongers テクニカルトーク#6 竹迫 良範 takesako@namazu.org
アンケート 難しい話は一切いたしません(ご安心ください) • Pugs 使ったことある人? • Parrot アセンブラ使ったことある人? • Perl6 の言語仕様を知っている人? Shibuya Perl Mongers テクニカルトーク#6 「Pugs でお手軽 Perl6 入門」
5秒でわかる Perl6 • メソッドを -> ではなく . で書けるようになった Perl5 Perl6 $obj->method(); $obj.method(); → これで Perl も立派なOO言語の仲間入り! Shibuya Perl Mongers テクニカルトーク#6 「Pugs でお手軽 Perl6 入門」
Perl6 の言語仕様について もうちょっと詳しく・・・
Perl6で失ったもの ~後方互換性~ • 文字列の連結は .(ドット)→ ~(チルダ)に Perl5 Perl6 # メソッド呼び出し $obj.method(); my $a = “A"; sub func { return "x"; } # 文字列の連結 my $b = $a~func(); # メソッド呼び出し $obj->method(); my $a = “A"; sub func { return "x"; } # 文字列の連結 my $b = $a.func(); 一時期 ”_ ”という案もあったが…スペース入れるのが面倒 Shibuya Perl Mongers テクニカルトーク#6 「Pugs でお手軽 Perl6 入門」
配列とハッシュのアクセス方法が変更 • はじめての人にもわかりやすく • 変数のプレフィクス $@% ルールが変更 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'} Shibuya Perl Mongers テクニカルトーク#6 「Pugs でお手軽 Perl6 入門」
// 演算子 (err演算子) • 左辺が undef のときのみ右辺を評価 • Perl5 でありがちなバグを回避 • 0(ゼロ) や ”” (空文字列)の扱い • それぞれ || → or, // → err に対応 Perl5 Perl6 $num = shift @ARGV || 1; $bar = func() or die; $num = shift @ARGS // 1; $bar = func() err die; Shibuya Perl Mongers テクニカルトーク#6 「Pugs でお手軽 Perl6 入門」
便利な zip • 2つの配列を同時にループ • 順番を保存した重複する key と value の表現 Perl5 Perl6 my @key = ("x", "y", "x"); my @value = (1, 2, 3); for zip(@key,@value) -> $a,$b { print "key:$a; value:$b\n"; } my @key = ("x", "y", "x"); my @value = (1, 2, 3); for (my $i=0; $i<@key; $i++) { my $a = $key[$i]; my $b = $value[$i]; print "key:$a; value:$b\n"; } Shibuya Perl Mongers テクニカルトーク#6 「Pugs でお手軽 Perl6 入門」
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; Shibuya Perl Mongers テクニカルトーク#6 「Pugs でお手軽 Perl6 入門」
括弧省略 • 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--; } Shibuya Perl Mongers テクニカルトーク#6 「Pugs でお手軽 Perl6 入門」
Lazy evaluation(遅延評価) • 無限リストを表現できるように • 実行時に評価される Perl5 Perl6 for my $i (1...) { last if ($i > 100); print "$i\n"; } for my $i (1..100000) { last if ($i > 100); print "$i\n"; } Shibuya Perl Mongers テクニカルトーク#6 「Pugs でお手軽 Perl6 入門」
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) Shibuya Perl Mongers テクニカルトーク#6 「Pugs でお手軽 Perl6 入門」
Perl6 の言語仕様 • Apocalypse(黙示録) • Larry Wall が Perl6 のデザインについて語る • Perl6 の歴史的な文書(Perl6 RFC がベース) • Exegesis(注釈) • Perl6 を用いたサンプルコードや Perl5 との比較 • 黙示録を Damian Conway が詳細に解説 • Synopsis(概要) • Perl6 の最新の言語仕様が書かれている • 黙示録のダイジェスト版 Shibuya Perl Mongers テクニカルトーク#6 「Pugs でお手軽 Perl6 入門」
Why Perl6? (モチベーション) • Perl5 は・・・ • 場当たり的な拡張を繰り返し • 既に Perl5 のコードは理解不能な領域に • C でゴリゴリ 職人技 • Perl6 の目指す方向 • せめて OO らしく • 後方互換性は無視 • Perl6 のプログラムには v6; とか use v6.0; # 省略可 • ただし use perl5:LWP; などでPerl5 のモジュールは使えるようにしたい • コンパイラと実行環境の分離(VM化) Shibuya Perl Mongers テクニカルトーク#6 「Pugs でお手軽 Perl6 入門」
Perl6 の実装方針(最初の戦略) • Parrot がメイン • Perl6 を Parrot で書く • Perl5 を Parrot で動くようにする (Ponie Project) Shibuya Perl Mongers テクニカルトーク#6 「Pugs でお手軽 Perl6 入門」
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」の計算結果を求めるプログラム Shibuya Perl Mongers テクニカルトーク#6 「Pugs でお手軽 Perl6 入門」
VM としての Parrot Shibuya Perl Mongers テクニカルトーク#6 「Pugs でお手軽 Perl6 入門」
セカンドシステム症候群 • 2度目にデザインするシステムは失敗作になりやすい説 • 1度目のデザインは自分の能力を把握していないので慎重になる。 • 3度目のデザインは何が普遍的で何が特殊なものか分かるので正確に作ることができる。 • しかし、2度目のデザインでは、最初のデザインで抑えたアイデア・装飾を思い切り詰め込んでしまうので、失敗作になりやすい。 人月の神話―狼人間を撃つ銀の弾はない ISBN: 4894716658 →Perl6 は構想5年! Shibuya Perl Mongers テクニカルトーク#6 「Pugs でお手軽 Perl6 入門」
救世主 Pugs の登場 • Pugs = Perl6 User’s Golfing System • Yet another Perl6 implementation →Perl6 が動いた! 2005/02/06 (1|2)+(3|4)→(4|5|6) Shibuya Perl Mongers テクニカルトーク#6 「Pugs でお手軽 Perl6 入門」
Autrijus Tang (唐宗漢) • CPAN界隈で有名 • PARの作者 • 1981年生まれ(若い!) • 国籍:台湾 Perl6 を2ヶ月で実装した天才プログラマー (しかも最初の1ヶ月はHaskellの学習) 高橋メソッドを世界に輸出した人 http://en.wikipedia.org/wiki/Autrijus_Tang Shibuya Perl Mongers テクニカルトーク#6 「Pugs でお手軽 Perl6 入門」
Pugs の拡張性 Haskellという 言語で記述 Shibuya Perl Mongers テクニカルトーク#6 「Pugs でお手軽 Perl6 入門」
Haskell とは? • 非正格純粋関数型言語 • 関数型プログラミング • どうするか(how)ではなく、何をするか(what)を純粋に書く • 大きな処理は小さな処理の組み合わせ • 強い型付け • 型推論機構(型を宣言しなくても自動判別) • コンパイルチェックに通ればコアダンプしない保証 • モナドの概念(Haskellがpureたる所以) • 計算の抽象化、合成、IOモナド • 非決定性計算が得意 Shibuya Perl Mongers テクニカルトーク#6 「Pugs でお手軽 Perl6 入門」
モナディウス • Haskellで書かれたシューティングゲーム • グラディウス20周年記念にインスパイア • Haskell の学習のために作ったプログラム http://www.geocities.jp/takascience/windows/monadius.html 90秒間のデモをどうぞ Shibuya Perl Mongers テクニカルトーク#6 「Pugs でお手軽 Perl6 入門」
いま Haskell がアツイ! • Haskellの特徴 • わかりやすい構文 • 関数型のくせに(括弧)が少ない • 無駄な機能を徹底的に排除 • 代入がない、ループがない、その他いろいろ・・・ • intを扱うのと同じように関数も命令文も扱うことができる • 直感的に書ける、コード量が少ない → バグが少ない • BNFに近い形でプログラムをそのまま書ける • Lazy evaluation(遅延評価)→ 特定の条件で高速 • けど遅い Shibuya Perl Mongers テクニカルトーク#6 「Pugs でお手軽 Perl6 入門」
実際に Pugs を使ってみよう Perl6 の世界を体験
Pugs のバージョンは 6.x.y • 6.x はメジャーバージョン →2πに収束 • 6.0: Initial release. • 6.2: Basic IO and control flow elements; mutable variables; assignment. • 6.28: Classes and traits. • 6.283: Rules and Grammars. • 6.2831: Type system and linking. • 6.28318: Macros. • 6.283185: Port Pugs to Perl 6, if needed. • y はリリース番号 (6.2.10 @ 2005/10/8) Shibuya Perl Mongers テクニカルトーク#6 「Pugs でお手軽 Perl6 入門」
Pugs をお手軽に試せる「PxPerl」 • pixigreg.com によるPerlディストリビューション • 動作環境:Windows2000/XP • exe一発でインストール完了 • Perl 5.8.7 (compiled with Intel C++ Compiler) • Pugs 6.2.9 (compiled with GHC) • Parrot 0.2.3 • CPAN modules がたくさん • GraphicsMagick 1.1.6 • GD 2.0.33 とかも • SciTE 1.65(エディタ付) ActivePerlを超えた注目ディストリビューション http://www.pxperl.com/?pxperl Shibuya Perl Mongers テクニカルトーク#6 「Pugs でお手軽 Perl6 入門」
もしも Perl6 の設計本が出版されたら・・・ • パロディ画像 Shibuya Perl Mongers テクニカルトーク#6 「Pugs でお手軽 Perl6 入門」
(例)Pugsを動かしてみよう • スペースのあり/なしで実行結果が違う Perl5 Perl6 # スペースなし print(1+2)*3; # スペースなし print(1+2)*3; → 実行結果: 3 → 実行結果: 3 # スペースあり print (1+2)*3; # スペースあり print (1+2)*3; → 実行結果: 3 → 実行結果: 9 Shibuya Perl Mongers テクニカルトーク#6 「Pugs でお手軽 Perl6 入門」
まとめ • Perl6の言語仕様は複雑 • 構想5年 • VM としての Parrot • Pugs の登場(2005年) • Perl6 のプログラムを動かしながら言語仕様を議論できるようになった • いま Haskell がアツイ!(ICFP連続優勝) • 手軽に試せる PxPerl を使ってみよう • まだ遅い(実用に耐えない) Shibuya Perl Mongers テクニカルトーク#6 「Pugs でお手軽 Perl6 入門」
Pugs-on-Javascript • CPANではなくJSANのモジュールが使えるように 2005/08/18 use jsan:Number.Roman <to_roman>; say to_roman(42); # XLII http://use.perl.org/~autrijus/journal/26358 Pugs の今後が楽しみ! Shibuya Perl Mongers テクニカルトーク#6 「Pugs でお手軽 Perl6 入門」
ご清聴ありがとうございました http://namazu.org/~takesako/
参考URL • より詳しく知りたい方のために • Perl Development: Perl 6 • http://dev.perl.org/perl6/ • perl.perl6.language • http://www.nntp.perl.org/group/perl.perl6.language • PxPerl • http://www.pxperl.com/?pxperl • Haskell • http://www.haskell.org/ Shibuya Perl Mongers テクニカルトーク#6 「Pugs でお手軽 Perl6 入門」
おまけ: できるエンジニアを募集中 • ブログに「サイボウズ・ラボ入りたい!」と書くと、スタッフが巡回して (ry 研究開発テーマ 情報共有。グループウェア、Ajax、ポータル、ブログ、Wiki など。 何か一つ作って世界へ普及させる。 まったく新しい概念でもよし。 オープンソースOK IPA未踏ソフト歓迎 50%ルール 常駐メンバーはまだ4人です! http://labs.cybozu.co.jp/ Shibuya Perl Mongers テクニカルトーク#6 「Pugs でお手軽 Perl6 入門」