20 年越しで Perl 4 to 5 した話
SATOH, Koichi

Sep 29 2012 YAPC::Asia Tokyo
謝辞

✤   「遠方からの参加者支援制度」に補助を頂きました。
    株式会社スカイアーク様に御礼申し上げます。
自己紹介

✤   佐藤光一

✤   岡山大学大学院 自然言語処理研究室

✤   Twitter: @outerinside   Github: https://github.com/sekia/

✤   Blog: http://outer-inside.blogspot.com/
研究室にありがちなこと
研究室にありがちなこと

✤   文書がない

✤   テストがない

✤   バージョン管理されてない

✤   コードが古い
研究室にありがちなこと

✤   文書がない

✤   テストがない

✤   バージョン管理されてない

✤   コードが古い

✤   コードが古い
研究室にありがちなこと

✤   文書がない

✤   テストがない

✤   バージョン管理されてない

✤   コードが古い

✤   コードが古い

✤   コードがすごく古い
研究室にありがちなこと

✤   研究室紹介にて:
    「この研究室では Perl を主に使っています」
研究室にありがちなこと

✤   研究室紹介にて:
    「この研究室では 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);
    }
研究室にありがちなこと

✤   研究室紹介にて:
    「この研究室では 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);
    }
Perl 4 to 5!




                                         Perl 5 to 6
               http://perlgeek.de/en/article/5-to-6
研究室にありがちなこと

✤   せめて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
Perl 5 の(20年前からある)新機能

✤   CPAN!

✤   Unicode (Perl 5.8+)

✤   my 変数

✤   高階関数

✤   オブジェクト指向プログラミング       Perl 4   Perl 5   Perl 6


✤   ……
CPAN

✤   これは説明不要だった

    ✤   Text::*, Lingua::* 超便利

    ✤   車輪が大分減った
Unicode

✤   私「日本語の言語資源今までどうやって処理してたんですか」
Unicode

✤   私「日本語の言語資源今までどうやって処理してたんですか」
    → 「全部 EUC-JP」「えっ」「えっ」
Unicode

✤   私「日本語の言語資源今までどうやって処理してたんですか」
    → 「全部 EUC-JP」「えっ」「えっ」
     「この XML 文書 UTF-8 で書かれてるんだけどどうやって EUC に
      したら良い?」「」




                                         404 Blog Not Found:perl - Encode 入門
                       http://blog.livedoor.jp/dankogai/archives/51031595.html
my 変数・高階関数

✤   local はグローバル変数に一時的な値を与えるだけ
    (Perl 6 だと temp)

✤   my はスコープに入る毎に別の変数。スコープ外からはアクセス不能

✤   クロージャに固有の状態を持たせたければ my を使うしかない
my 変数・高階関数

✤   local はグローバル変数に一時的な値を与えるだけ
    (Perl 6 だと temp)

✤   my はスコープに入る毎に別の変数。スコープ外からはアクセス不能

✤   クロージャに固有の状態を持たせたければ my を使うしかない

    ✤   「自由変数は関数生成時の束縛を探すんですよ」
        とか ! っぽいことを言ったら何故か理解された
オブジェクト指向

✤   私「Moose を使いましょう! Mooooooooooooooose」
    → ハードル高すぎた。DSL は中身を理解して使うもの
オブジェクト指向

✤   Perl OOP の変なところ

    ✤   名前空間 = クラス

        ✤   クラスは名前空間に所属するよ派: C++, Java, etc.

        ✤   クラス (とか) がオープンだから名前空間的に使って良いよ派:
            Ruby, JavaScript

        ✤   名前空間がクラス (のつもり) だよ派: Perl 5
オブジェクト指向

✤   のっけから use でつまづく

    ✤   「use Foo::Bar で Foo::Bar クラスが使えるんだよね」
        「いやそうとは限りませんよ」「えっ」「えっ」

        ✤   Foo/Bar.pm に package Foo::Bar が宣言されている保証はな
            い

        ✤   package Foo::Bar がクラスである保証もない
オブジェクト指向

✤   namespace 的なものを package に期待するとハマる
    package Foo::Bar {
      sub func { ... }
    }

    package Foo {
      Bar::func();   # ねーよ
    }
オブジェクト指向

✤   namespace 的なものを package に期待するとハマる
    package Foo {
      package Bar {
        say __PACKAGE__;   # "Bar" (not "Foo::Bar")
      }
    }
オブジェクト指向

✤   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"
オブジェクト指向

✤   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
オブジェクト指向

✤   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"
思ったこと(小並感)

✤   20年前のコードも動く

✤   が、読めない・書きたくない

✤   最近は比較的 Perl 5 なコードが書けて幸せ

✤   自分を救うために今からでも Perl 4 to 5

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

  • 1.
    20 年越しで Perl4 to 5 した話 SATOH, Koichi Sep 29 2012 YAPC::Asia Tokyo
  • 2.
    謝辞 ✤ 「遠方からの参加者支援制度」に補助を頂きました。 株式会社スカイアーク様に御礼申し上げます。
  • 3.
    自己紹介 ✤ 佐藤光一 ✤ 岡山大学大学院 自然言語処理研究室 ✤ Twitter: @outerinside Github: https://github.com/sekia/ ✤ Blog: http://outer-inside.blogspot.com/
  • 4.
  • 5.
    研究室にありがちなこと ✤ 文書がない ✤ テストがない ✤ バージョン管理されてない ✤ コードが古い
  • 6.
    研究室にありがちなこと ✤ 文書がない ✤ テストがない ✤ バージョン管理されてない ✤ コードが古い ✤ コードが古い
  • 7.
    研究室にありがちなこと ✤ 文書がない ✤ テストがない ✤ バージョン管理されてない ✤ コードが古い ✤ コードが古い ✤ コードがすごく古い
  • 8.
    研究室にありがちなこと ✤ 研究室紹介にて: 「この研究室では Perl を主に使っています」
  • 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.
    研究室にありがちなこと ✤ 研究室紹介にて: 「この研究室では 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.
    Perl 4 to5! Perl 5 to 6 http://perlgeek.de/en/article/5-to-6
  • 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.
    Perl 5 の(20年前からある)新機能 ✤ CPAN! ✤ Unicode (Perl 5.8+) ✤ my 変数 ✤ 高階関数 ✤ オブジェクト指向プログラミング Perl 4 Perl 5 Perl 6 ✤ ……
  • 14.
    CPAN ✤ これは説明不要だった ✤ Text::*, Lingua::* 超便利 ✤ 車輪が大分減った
  • 15.
    Unicode ✤ 私「日本語の言語資源今までどうやって処理してたんですか」
  • 16.
    Unicode ✤ 私「日本語の言語資源今までどうやって処理してたんですか」 → 「全部 EUC-JP」「えっ」「えっ」
  • 17.
    Unicode ✤ 私「日本語の言語資源今までどうやって処理してたんですか」 → 「全部 EUC-JP」「えっ」「えっ」 「この XML 文書 UTF-8 で書かれてるんだけどどうやって EUC に したら良い?」「」 404 Blog Not Found:perl - Encode 入門 http://blog.livedoor.jp/dankogai/archives/51031595.html
  • 18.
    my 変数・高階関数 ✤ local はグローバル変数に一時的な値を与えるだけ (Perl 6 だと temp) ✤ my はスコープに入る毎に別の変数。スコープ外からはアクセス不能 ✤ クロージャに固有の状態を持たせたければ my を使うしかない
  • 19.
    my 変数・高階関数 ✤ local はグローバル変数に一時的な値を与えるだけ (Perl 6 だと temp) ✤ my はスコープに入る毎に別の変数。スコープ外からはアクセス不能 ✤ クロージャに固有の状態を持たせたければ my を使うしかない ✤ 「自由変数は関数生成時の束縛を探すんですよ」 とか ! っぽいことを言ったら何故か理解された
  • 20.
    オブジェクト指向 ✤ 私「Moose を使いましょう! Mooooooooooooooose」 → ハードル高すぎた。DSL は中身を理解して使うもの
  • 21.
    オブジェクト指向 ✤ Perl OOP の変なところ ✤ 名前空間 = クラス ✤ クラスは名前空間に所属するよ派: C++, Java, etc. ✤ クラス (とか) がオープンだから名前空間的に使って良いよ派: Ruby, JavaScript ✤ 名前空間がクラス (のつもり) だよ派: Perl 5
  • 22.
    オブジェクト指向 ✤ のっけから use でつまづく ✤ 「use Foo::Bar で Foo::Bar クラスが使えるんだよね」 「いやそうとは限りませんよ」「えっ」「えっ」 ✤ Foo/Bar.pm に package Foo::Bar が宣言されている保証はな い ✤ package Foo::Bar がクラスである保証もない
  • 23.
    オブジェクト指向 ✤ namespace 的なものを package に期待するとハマる package Foo::Bar { sub func { ... } } package Foo { Bar::func(); # ねーよ }
  • 24.
    オブジェクト指向 ✤ namespace 的なものを package に期待するとハマる package Foo { package Bar { say __PACKAGE__; # "Bar" (not "Foo::Bar") } }
  • 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.
    オブジェクト指向 ✤ 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.
    オブジェクト指向 ✤ 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.
    思ったこと(小並感) ✤ 20年前のコードも動く ✤ が、読めない・書きたくない ✤ 最近は比較的 Perl 5 なコードが書けて幸せ ✤ 自分を救うために今からでも Perl 4 to 5