20年越しで Perl 4 to 5 した話

6,611 views
6,566 views

Published on

株式会社スカイアーク様の支援で YAPC::Asia Tokyo 2012 で発表した LT のスライドです

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
6,611
On SlideShare
0
From Embeds
0
Number of Embeds
5,499
Actions
Shares
0
Downloads
0
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • 20年越しで Perl 4 to 5 した話

    1. 1. 20 年越しで Perl 4 to 5 した話SATOH, KoichiSep 29 2012 YAPC::Asia Tokyo
    2. 2. 謝辞✤ 「遠方からの参加者支援制度」に補助を頂きました。 株式会社スカイアーク様に御礼申し上げます。
    3. 3. 自己紹介✤ 佐藤光一✤ 岡山大学大学院 自然言語処理研究室✤ Twitter: @outerinside Github: https://github.com/sekia/✤ Blog: http://outer-inside.blogspot.com/
    4. 4. 研究室にありがちなこと
    5. 5. 研究室にありがちなこと✤ 文書がない✤ テストがない✤ バージョン管理されてない✤ コードが古い
    6. 6. 研究室にありがちなこと✤ 文書がない✤ テストがない✤ バージョン管理されてない✤ コードが古い✤ コードが古い
    7. 7. 研究室にありがちなこと✤ 文書がない✤ テストがない✤ バージョン管理されてない✤ コードが古い✤ コードが古い✤ コードがすごく古い
    8. 8. 研究室にありがちなこと✤ 研究室紹介にて: 「この研究室では Perl を主に使っています」
    9. 9. 研究室にありがちなこと✤ 研究室紹介にて: 「この研究室では Perl を主に使っています」 OpenPipe(/usr/local/bin/chasen, C_OUT, C_IN); sub OpenPipe { ← IPC::Open2 (コアモジュール) の再発明 local($pid); local($prg, *OUT, *IN) = @_; ← local 変数・型グロブ pipe(R, IN); ← Bare word なファイルハンドル pipe(OUT, W); unless ($pid = fork) { close(IN); close(OUT); open(STDIN, <&R) || die "Errorn"; open(STDOUT, >&W) || die "Errorn"; open(STDERR, >&W) || die "Errorn"; close(R); close(W); select(STDIN); $| = 1; select(STDOUT); $| = 1; select(STDERR); $| = 1; exec($prg); print STDERR "Open error!n"; exit(0); } close(R); close(W); select(IN); $| = 1; select(STDOUT); }
    10. 10. 研究室にありがちなこと✤ 研究室紹介にて: 「この研究室では Perl 4 を主に使っています」(処理系は Perl 5) OpenPipe(/usr/local/bin/chasen, C_OUT, C_IN); sub OpenPipe { ← IPC::Open2 (コアモジュール) の再発明 local($pid); local($prg, *OUT, *IN) = @_; ← local 変数・型グロブ pipe(R, IN); ← Bare word なファイルハンドル pipe(OUT, W); unless ($pid = fork) { close(IN); close(OUT); open(STDIN, <&R) || die "Errorn"; open(STDOUT, >&W) || die "Errorn"; open(STDERR, >&W) || die "Errorn"; close(R); close(W); select(STDIN); $| = 1; select(STDOUT); $| = 1; select(STDERR); $| = 1; exec($prg); print STDERR "Open error!n"; exit(0); } close(R); close(W); select(IN); $| = 1; select(STDOUT); }
    11. 11. Perl 4 to 5! Perl 5 to 6 http://perlgeek.de/en/article/5-to-6
    12. 12. 研究室にありがちなこと✤ せめて10年近代化したい Perl 4.036 1993 (last release of Perl 4) 1994 Perl 5.000 1998 Perl 5.005 2000 Perl 5.6.0 2002 Perl 5.8.0 2007 Perl 5.10.0 2010 Perl 5.12.0 Perl 4 Perl 5 Perl 6 2011 Perl 5.14.0 2012 Perl 5.16.0
    13. 13. Perl 5 の(20年前からある)新機能✤ CPAN!✤ Unicode (Perl 5.8+)✤ my 変数✤ 高階関数✤ オブジェクト指向プログラミング Perl 4 Perl 5 Perl 6✤ ……
    14. 14. CPAN✤ これは説明不要だった ✤ Text::*, Lingua::* 超便利 ✤ 車輪が大分減った
    15. 15. Unicode✤ 私「日本語の言語資源今までどうやって処理してたんですか」
    16. 16. Unicode✤ 私「日本語の言語資源今までどうやって処理してたんですか」 → 「全部 EUC-JP」「えっ」「えっ」
    17. 17. Unicode✤ 私「日本語の言語資源今までどうやって処理してたんですか」 → 「全部 EUC-JP」「えっ」「えっ」 「この XML 文書 UTF-8 で書かれてるんだけどどうやって EUC に したら良い?」「」 404 Blog Not Found:perl - Encode 入門 http://blog.livedoor.jp/dankogai/archives/51031595.html
    18. 18. my 変数・高階関数✤ local はグローバル変数に一時的な値を与えるだけ (Perl 6 だと temp)✤ my はスコープに入る毎に別の変数。スコープ外からはアクセス不能✤ クロージャに固有の状態を持たせたければ my を使うしかない
    19. 19. my 変数・高階関数✤ local はグローバル変数に一時的な値を与えるだけ (Perl 6 だと temp)✤ my はスコープに入る毎に別の変数。スコープ外からはアクセス不能✤ クロージャに固有の状態を持たせたければ my を使うしかない ✤ 「自由変数は関数生成時の束縛を探すんですよ」 とか ! っぽいことを言ったら何故か理解された
    20. 20. オブジェクト指向✤ 私「Moose を使いましょう! Mooooooooooooooose」 → ハードル高すぎた。DSL は中身を理解して使うもの
    21. 21. オブジェクト指向✤ Perl OOP の変なところ ✤ 名前空間 = クラス ✤ クラスは名前空間に所属するよ派: C++, Java, etc. ✤ クラス (とか) がオープンだから名前空間的に使って良いよ派: Ruby, JavaScript ✤ 名前空間がクラス (のつもり) だよ派: Perl 5
    22. 22. オブジェクト指向✤ のっけから use でつまづく ✤ 「use Foo::Bar で Foo::Bar クラスが使えるんだよね」 「いやそうとは限りませんよ」「えっ」「えっ」 ✤ Foo/Bar.pm に package Foo::Bar が宣言されている保証はな い ✤ package Foo::Bar がクラスである保証もない
    23. 23. オブジェクト指向✤ namespace 的なものを package に期待するとハマる package Foo::Bar { sub func { ... } } package Foo { Bar::func(); # ねーよ }
    24. 24. オブジェクト指向✤ namespace 的なものを package に期待するとハマる package Foo { package Bar { say __PACKAGE__; # "Bar" (not "Foo::Bar") } }
    25. 25. オブジェクト指向✤ Perl の OOP は単に関数解決の約束事 (言い過ぎ) package Foo; sub new { bless +{ msg => $_[1] } => $_[0] } sub say { say shift->{msg} } package main; my $obj = Foo->new(hello); $obj->say; # "hello"
    26. 26. オブジェクト指向✤ Perl の OOP は単に関数解決の約束事 (言い過ぎ) package Foo; sub new { bless +{ msg => $_[1] } => $_[0] } sub say { say shift->{msg} } package main; my $obj = Foo->new(hello); $obj->say; # "hello" my $meth = $obj->can(say); $obj->$meth; # ditto
    27. 27. オブジェクト指向✤ Perl の OOP は単に関数解決の約束事 (言い過ぎ) package Foo; sub new { bless +{ msg => $_[1] } => $_[0] } sub say { say shift->{msg} } package main; my $obj = Foo->new(hello); $obj->say; # "hello" my $meth = $obj->can(say); $obj->$meth; # ditto +{ msg => baa }->$meth; # "baa"
    28. 28. 思ったこと(小並感)✤ 20年前のコードも動く✤ が、読めない・書きたくない✤ 最近は比較的 Perl 5 なコードが書けて幸せ✤ 自分を救うために今からでも Perl 4 to 5

    ×