Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PHPに型推論を実装する ~入門編~ / Type inference on PHP

PHPに型推論を実装する ~入門編~ / Type inference on PHP

PHPカンファレンス福岡2016の資料です。

久保田光則

May 21, 2016
Tweet

More Decks by 久保田光則

Other Decks in Programming

Transcript

  1. 1)1ʹܕਪ࿦Λ࣮૷͢Δʙೖ໳ฤʙ
    ٱอాޫଇ!BOBUPP

    View Slide

  2. ࣗݾ঺հ
    w ٱอాޫଇ!BOBUPP
    w 6*69σβΠφʔ݉

    ιϑτ΢ΣΞΤϯδχΞ
    w "TQFDUJWF--$୅ද
    w IUUQBTQFDUJWFJP

    View Slide

  3. w "TQFDUJWF--$͸1)1ΧϯϑΝϨϯε෱Ԭʹڠࢍ͍ͯ͠·͢

    View Slide

  4. ޷ධൃചதʂ

    View Slide

  5. IUUQPOTFOJP

    View Slide

  6. ΞδΣϯμ
    w ܕਪ࿦ͱ͸
    w ͳͥ1)1Ͱܕਪ࿦
    w ಈతݴޠͰͷܕਪ࿦ͷϝϦοτ
    w 1)1ͷ"45ͷଘࡏ
    w ܕਪ࿦ΞϧΰϦζϜͷ঺հ

    View Slide

  7. ܕਪ࿦ͱ͸

    View Slide

  8. ܕਪ࿦8JLJQFEJB
    IUUQTKBXJLJQFEJBPSHXJLJ&&#&&"&"#

    lܕਪ࿦ʢ͔͍ͨ͢ΖΜʣͱ͸ϓϩάϥϛϯάݴ
    ޠͷػೳͷͭͰɺ੩తͳܕ෇͚Λ࣋ͭݴޠʹ
    ͓͍ͯɺม਺΍ؔ਺ͷܕΛએݴ͠ͳͯ͘΋ͦΕ
    Λಋ͘ͷʹ࢖ΘΕͨؔ਺ͷܕγάωνϟͳͲ͔
    ΒࣗಈతʹܕΛܾఆ͢Δػߏͷ͜ͱɻz

    View Slide

  9. ྫ4XJGU
    w ܕ৘ใΛॻ͔ͳͯ͘΋ܕΛਪ࿦ͯ͠ίϯύΠϧͯ͘͠ΕΔ
    w ͋͘·Ͱ੩తܕ෇͚ͳͷͰpC/VNCFSͷܕ͸*OU
    func fib(number: Int) -> Int {
    if number <= 1 {
    return number
    } else {
    return fib(number - 1) + fib(number - 2)
    }
    }
    var fibNumber = fib(8)

    View Slide

  10. ܕਪ࿦Λ࣋ͭݴޠ
    w 4DBMB
    w )BTLFMM
    w 0$BNM
    w 4XJGU
    w શͯ੩తܕ෇͚ͷݴޠ

    View Slide

  11. ಈతܕ෇͚ݴޠͰ͸
    w 1)1͸ಈతܕ෇͚ݴޠ
    w ίϯύΠϧ࣌ʹܕ͕ܾ·Δඞཁ͸ͳ͍
    w ܕਪ࿦Λॻ͘ඞཁͳΜͯͳ͍ͷͰ͸

    View Slide

  12. w ಈతܕ෇͚ͷݴޠͰ΋ܕਪ࿦ͷϝϦοτ͸
    ͋Δ
    w ͱ͍͏͔ɺ͢ͰʹΈͳ͞Μ࣮͸ܕਪ࿦ͷԸ
    ܙΛҰ෦त͔͍ͬͯΔ

    View Slide

  13. ಈతݴޠͰͷϝϦοτ
    w ίϯύΠϧ࣌࠷దԽ
    w ΤσΟλ΍*%&Ͱͷิ׬
    w ࣄલͷΤϥʔݕ஌

    View Slide

  14. ίϯύΠϧ࣌࠷దԽ
    w ಈతݴޠͰ͸ɺ࣮ߦ࣌ʹͲͷܕ͕ೖͬͯ΋
    ໰୊ͳ࣮͘ߦͰ͖ΔΑ͏ʹઃܭ͞Ε͍ͯΔ
    w ͦͷͨΊ࣮ߦ࣌ͷ੩తܕ෇͚ݴޠʹൺ΂Δ
    ͱΦʔόʔϔου͕େ͖͍

    View Slide

  15. ྫ1)1ͷԋࢉࢠͷॲཧ

    View Slide

  16. IUUQTHJUIVCDPNQIQQIQTSDCMPCNBTUFS;FOE[[email protected]
    w ࣮ߦ࣌ʹͲͷܕͷ૊Έ߹Θ͔ͤΛTXJUDIจͰ෼ذ

    View Slide

  17. ܕਪ࿦Λ࢖͑͹
    w ྫ͑͹zBCzͷBͱCͷܕ͕ܕਪ࿦ͰΘ͔Ε
    ͹ɺίϯύΠϧ࣌ʹͦΕઐ༻ͷߴ଎ͳॲཧ
    ʹࠩ͠ସ͑Δ͜ͱ͕Ͱ͖Δ͸ͣ
    w ֦ுϥΠϒϥϦͰΦϓςΟϚΠβॻ࣌͘ʹ
    ໾ཱͪͦ͏

    View Slide

  18. +4ͰͷྫIUUQSGSOPSHdTIVESBGUTUJQEG

    View Slide

  19. *%&Ͱͷϝιουͷิ׬
    w *%& 1IQ4UPSNͱ͔
    Ͱɺ͋Δม਺ͷΠϯελϯεϝιου
    ͕ิ׬͞ΕΔͷ͸ɺܕਪ࿦͞Ε͍ͯΔ͔ΒʹଞͳΒͳ͍

    View Slide

  20. Τϥʔݕ஌ɾ-JOU
    w ܕਪ࿦Ͱܕͷໃ६͕ݟ͔ͭΕ͹ɺ࣮ߦલʹ
    ΤϥʔΛग़͢͜ͱ͕Ͱ͖Δ
    w *%&΍ΤσΟλͷΤϥʔݕ஌΍ɺ-JOUπʔϧ
    ͳͲͰԠ༻Ͱ͖Δ

    View Slide

  21. ༻్·ͱΊ
    w ิ׬΍MJOUπʔϧͳͲɺ։ൃऀΛࢧԉ͢Δ੩
    తղੳπʔϧͷ࣮૷ʹ໾ཱͯΒΕΔ
    w ֦ுϥΠϒϥϦͰ͕Μ͹Ε͹ɺ࠷దԽ͞Ε
    ͨPQDPEFΛు͘ࣄ΋Մೳ

    View Slide

  22. 1)1Ͱͷػӡ

    View Slide

  23. 1)1Ͱͷػӡ
    w 4DBMBS5ZQF)JOUT͕ಋೖ͞Εͨ
    w ؔ਺ͷฦΓ஋ͷܕΛࢦఆ͕Մೳʹ
    w ݫີͳܕνΣοΫͷಋೖ
    w "45 ந৅ߏจ໦
    ͷಋೖ

    View Slide

  24. 4DBMBS5ZQF)JOUT
    w JOU΍qPBU΍TUSJOH΍CPPMͳͲͷεΧϥ஋ͷܕ͕5ZQF)JOUͰ
    ࢦఆͰ͖Δ
    w ࣗಈతʹΩϟετ͞ΕΔΏΔ͍λΠϓνΣοΫ
    function square(int $i) {
    return $i * $i;
    }
    square(3); // => 9
    square(4.1); // => 16

    View Slide

  25. ؔ਺ͷ໭Γܕ
    w ؔ਺ͷ໭Γ஋ͷܕ΋ࢦఆͰ͖ΔΑ͏ʹͳͬ
    ͨ
    function foo(): array {
    return [1, 2, 3];
    }
    foo();

    View Slide

  26. ݫ֨ͳܕࢦఆ
    w એݴͨ͠ϑΝΠϧͰ͸ܕ͕ݫ֨ʹѻΘΕΔ
    w ҉໧ͷΩϟετ͕ߦΘΕͳ͍Ϟʔυʹ
    declare(strict_types=1);
    function add(int $a, int $b): int {
    return $a + $b;
    }
    add(1.0, 2.0); // Τϥʔ

    View Slide

  27. 1)1Ͱͷܕͷѻ͍ͷมԽ
    w ໭Γ஋ͷܕνΣοΫΛએݴͰ͖ΔΑ͏ʹͳͬͨ
    w ݫີʹએݴͰ͖ΔΑ͏ʹͳͬͨ
    w ϓϦϛςΟϒͳ஋ͷܕ͕ࢦఆͰ͖ΔΑ͏ʹͳͬ
    ͨ
    w ੩తղੳ͠΍͘͢ͳͬͨ

    View Slide

  28. 1)1ͷ"45
    w ैདྷͰ͸ɺ"45͸ੜ੒ͤͣʹ;FOE&OHJOF
    ༻ͷ໋ྩΛίϯύΠϧ͍ͯͨ͠
    w 1)1Ͱ͸ɺίϯύΠϧ࣌ʹ"45Λੜ੒͢Δ
    Α͏ʹͳͬͨ

    View Slide

  29. "45 ந৅ߏจ໦
    ͱ͸
    w ύʔεͨ͠ίʔυͷந৅తͳπϦʔߏ଄ͷσʔλ
    IUUQTpSFCFBSTUVEJPDPNCMPHIPXUPHFUSFBEZGPSQIQIUNM
    for ($i = 0; $i < 4; $i++) {
    ...
    }

    View Slide

  30. ࣈ۟ղੳ
    ߏจղੳίϯύΠϧ
    ࣮ߦ
    w 1)1Ͱ͸ɺߏจղੳ͠ͳ͕Β7.༻ίʔυΛੜ੒
    w CJTPOͷηϚϯςΟοΫΞΫγϣϯͰ׬݁
    τʔΫϯͷϦετΛੜ੒
    ύʔεͭͭ͠7.༻ͷ໋ྩΛੜ੒
    ಺෦7.Ͱ࣮ߦ
    1)1Ͱͷ࣮ߦͷྲྀΕ

    View Slide

  31. τʔΫϯͷϦετΛੜ੒
    ந৅ߏจ໦ "45
    ͷੜ੒
    ಺෦7.༻ͷ໋ྩΛੜ੒
    ಺෦7.Ͱ࣮ߦ
    ࣈ۟ղੳ
    ߏจղੳ
    ίϯύΠϧ
    ࣮ߦ
    w 1)1Ͱ͸ɺߏจղੳ࣌ʹ͸"45Λੜ੒
    w 7.༻ͷίʔυੜ੒͸ͦͷޙʹߦ͏Α͏ʹͳͬͨ
    1)1Ͱͷ࣮ߦͷྲྀΕ

    View Slide

  32. 1)1"45֦ுϥΠϒϥϦ
    w ैདྷίϯύΠϧ͕ऴΘΕ͹"45͸ࣺͯΒΕΔ
    w 1)1͔ΒͰ΋ந৅ߏจ໦Λѻ͏͜ͱ͕Ͱ͖
    ΔΑ͏ʹ͢Δ֦ுϥΠϒϥϦ
    w ந৅ߏจ໦ΛऔΓग़ͯ͠੩తղੳͰ͖Δ
    IUUQTHJUIVCDPNOJLJDQIQBTU

    View Slide


  33. require 'path/to/util.php';
    $code ='$var = 42;’
    echo ast_dump(ast\parse_code(
    $code, $version=30
    )), "\n";
    IUUQTHJUIVCDPNOJLJDQIQBTUCMPCNBTUFS3&"%.&NE

    View Slide

  34. ग़ྗ
    w WBSͱ͍͏ίʔυͷߏจ໦͕औΕ͍ͯΔ
    w ͜ΕͰ੩తղੳ͠์୊ͩʂ
    AST_STMT_LIST
    0: AST_ASSIGN
    var: AST_VAR
    name: "var"
    expr: 42

    View Slide

  35. ܕਪ࿦ͷ֓ཁ

    View Slide

  36. ܕਪ࿦ثͷ௒جຊతͳಈ͖
    w ͱ͍͏දݱΛܕਪ࿦ثʹ༩͑Δ৔߹
    w ܕਪ࿦ث͸ɺந৅ߏจ໦ͷܭࢉ΍એݴΛਫ਼ࠪͯ͠ਪ࿦نଇ
    Λݩʹܕ৘ใΛܭࢉ͍ͯ͘͠




    JOUFHFS
    JOUFHFS JOUFHFS

    View Slide

  37. ޡΓ͕͋Δ৔߹
    w OFX0CKFDU
    ͱ͍͏ίʔυΛਪ࿦ثʹ౉͢৔߹
    w ܕϨϕϧͰޡΓ͕͋Ε͹࣮ߦલʹΤϥʔΛग़͢

    OFX
    0CKFDU




    &3303
    0CKFDU JOUFHFS
    OFX
    0CKFDU

    View Slide

  38. ਪ࿦ͷϙΠϯτ
    w &YQSFTTJPOͷߏจ໦ͷ຤୺͔Βਪ࿦Λ࢝ΊΔ
    w ਪ࿦نଇʹԠͯ͡ਪ࿦͍ͯ͘͠
    w Θ͔Βͳ͍৔߹ʹ͸ܕม਺Λ෇Ճ
    w ੍ݶʹԠͯ͡ϢχϑΟέʔγϣϯΛߦ͏
    w ܕม਺ͷ୅ೖɾΤϥʔͷݕ஌
    w ਪ࿦͕Ͱ͖ͨ৔߹ʹ͸ܕ؀ڥʹ൓ө͍ͯ͘͠

    View Slide

  39. ຤୺͔Βਪ࿦͢Δ
    w ͋ΔܭࢉΛਪ࿦͢Δ৔߹ʹ͸ɺԼ෦ͷϊʔυ͔Βਪ࿦͍ͯ͘͠
    w ߏจ໦Λ࠶ؼతʹḷͬͯߦ͘͜ͱͰՄೳ




    JOUFHFS JOUFHFS


    JOUFHFS
    JOUFHFS JOUFHFS

    View Slide

  40. ਪ࿦نଇʹΑͬͯਪ࿦͍ͯ͘͠
    w ྫF
    ͱF
    ͷܕ͕JOUͰ͋Δ࣌ɺ F
    F

    ͷܕ͸JOUͰ͋Δ
    w ྫF
    ͱF
    ͷܕ͕BSSBZͰ͋Δ࣌ɺ F
    F

    ͷܕ͸BSSBZͰ͋Δ
    w ྫF
    ͷܕ͕0CKFDUͱF
    ͷܕ͕JOUͰ͋Δ࣌ɺλΠϓΤϥʔͰ͋Δ
    w ߏจ໦ΛͨͲ͍ͬͯ࣌͘ʹਪ࿦نଇΛద༻
    w نଇ͸۪௚ʹίʔυΛॻ͍͍ͯ͘
    w ܕ͕Θ͔ͬͨΒܕ؀ڥʹ൓ө͍ͯ͘͠

    View Slide

  41. ܕ؀ڥ
    w ؔ਺΍ΫϥεͳͲͷܕ৘ใΛొ࿥͢Δ৔ॴ
    w ૊ΈࠐΈؔ਺ͷܕ৘ใ͸༧Ίొ࿥
    w ίʔυΛղੳͯ͠ਪ࿦Ͱ͖ͨ݁ՌΛ֨ೲ
    w ܕਪ࿦ثͷ࣮ߦίϯςΩετΈ͍ͨͳ΋ͷ

    View Slide

  42. ܕ͕Θ͔Βͳ͍৔߹
    w Bͷܕ͕Θ͔Βͳ͍
    w ܕม਺ΛׂΓ౰ͯͯɺ൑அΛ஗Ԇͤ͞Δ

    B
    JOUFHFS

    View Slide

  43. ܕม਺
    w ܕͱͯ͠ѻ͑ΔೖΕ෺ɻޙͰதʹ࣮ࡍͷܕΛ୅ೖͰ͖Δ
    w ܕ͕Θ͔Βͳ͍৔߹ʹ͸ܕม਺ΛׂΓ౰ͯΔ
    JOU
    TUSJOH
    'PP

    View Slide

  44. ׂΓ౰ͯΔྫ
    w ྫ͑͹ؔ਺ͷԾҾ਺΍ฦΓ஋ʹܕ͕ࢦఆ͞
    Ε͍ͯͳ͍৔߹
    function foobar($a, $b) {
    ...
    }

    View Slide

  45. ܕม਺΁ͷ୅ೖ
    w ϢχϑΟέʔγϣϯΛ௨ͯ͡୅ೖ͢Δ
    JOU
    =

    View Slide

  46. ϢχϑΟέʔγϣϯ ୯ҰԽ

    w ܕਪ࿦தʹ૒ํ޲ͷ୅ೖΛߦ͏ͨΊͷ࢓૊Έ
    w ࣦഊͨ͠৔߹͸ܕϨϕϧͰؒҧ͍͕͋ΔͱΈͳ
    ͯ͠Τϥʔ
    w ܕͷ੍ݶ͕͋ΔՕॴͰϢχϑΟέʔγϣϯΛߦ
    ͏

    View Slide

  47. ϢχϑΟέʔγϣϯ͸ܕͷ੍
    ݶ͕͔͔ΔՕॴͰ࣮ߦ͢Δ

    View Slide

  48. ԾҾ਺ͷܕͱҾ਺ͷܕ
    w OVNͷܕͱBҾ਺ͷܕ͸ಉ͡Ͱͳ͚Ε͹ͳΒͳ͍
    function square(int $a): int {
    ...
    }
    echo square($num);

    View Slide

  49. SFUVSOͷܕͱฦΓ஋ͷܕએݴ
    w SFUVSOͷදݱͷܕͱฦΓ஋ͷܕએݴ͸ಉ͡Ͱͳ
    ͚Ε͹ͳΒͳ͍
    function foobar(): int {
    return $num;
    }

    View Slide


  50. w Կ΋͠ͳ͍ɻܕ͕͋ͬͯΔͷͰେৎ෉
    function foobar(): int {
    return 1;
    }
    JOUJOU
    ੒ޭ

    View Slide


  51. function foobar(): int {
    return “hoge”;
    }
    JOUTUSJOH
    Τϥʔ
    w ܕ͕͋ͬͯͳ͍ͷͰΤϥʔΛग़͢

    View Slide


  52. w GPPCBSؔ਺ͷฦΓ஋ͷܕม਺BʹJOU͕୅ೖ͞ΕΔ
    function foobar() {
    return 1;
    }
    BJOU
    BʹJOUΛ୅ೖ
    ฦΓ஋ͷܕʹܕม਺BΛׂΓ౰ͯ

    View Slide


  53. w ΋͠ܕม਺ʹผͷܕ͕͢Ͱʹೖ͍ͬͯΔ৔߹ʹ
    ͸Τϥʔ
    function foobar(): int {
    return $globalNum;
    }
    JOUC
    ܕม਺CʹJOUΛ࣮૷
    ܕม਺CΛׂΓ౰ͯ

    View Slide


  54. w Ҿ਺ͷܕͱฦΓ஋ͷܕ͕ಉ͡Ͱ͋Δ͜ͱ͕ਪ࿦
    Ͱ͖Δ
    function foobar($a) {
    return $a;
    }
    ED
    ܕม਺DΛܕม਺Eʹ΋ׂΓ౰ͯΔ
    ܕม਺DΛׂΓ౰ͯ
    ฦΓ஋ͷܕʹܕม਺EΛׂΓ౰ͯ

    View Slide

  55. ؔ਺ద༻Ͱਪ࿦Ͱ͖Δྫ
    w JODؔ਺ͷ໭Γ஋ͷܕ͸ɺؔ਺ຊମΛݟ͚ͨͩͰ͸Θ͔Βͳ͍
    w ؔ਺ద༻ͰҾ਺ͷܕݟΔͱॳΊͯ൑໌͢Δ
    w ؔ਺ద༻ͷࣜΛਪ࿦͢Δͱ͖ʹɺҾ਺ͷܕͱJODؔ਺ͷத਎
    Λਪ࿦͠௚͢͜ͱͰJOD
    ͷܕ͕Θ͔Δ
    function inc($a) { return $a + 1; };
    $n = inc(3);

    View Slide

  56. ͱΓ͋͑ͣҎ্
    w ಈతܕ෇͚ͳͷͰɺਪ࿦Ͱ͖Δͱ͜Ζ͚ͩ
    ෦෼తʹਪ࿦ͯ͠ऴΘΓͰ΋໰୊ͳ͍
    w ੩తܕ෇͚ͷݴޠͱ͸ҧͬͯ׬શʹ͢΂ͯ
    ܕ෇͚͠ͳͯ͘΋ྑ͍
    w ϝιουิ׬ͳͲͷ໨తͷͨΊʹ׬ᘳʹਪ
    ࿦͠Α͏ͱ͢Ε͹͢Δ΄Ͳ೉͘͠ͳΔ

    View Slide

  57. ·ͱΊ
    w 1)1Ͱ͸"45ͷಋೖͰ੩తղੳ͕͠΍͘͢
    ͳͬͨ
    w ಈతܕ෇͚Ͱ΋ܕਪ࿦Λߦ͏ϝϦοτ͸͋Δ
    w ࣮ߦલΤϥʔݕ஌
    w ίϯύΠϧ࣌࠷దԽ
    w ิ׬ࢧԉ

    View Slide

  58. ·ͱΊ
    w ܕਪ࿦͸"45Λḷͬͯਪ࿦نଇΛݩʹਪ࿦͍ͯ͘͠
    w ؔ਺΍ϝιουͷܕ͸ܕ؀ڥʹొ࿥͍ͯ͘͠
    w ͦͷ৔Ͱ͸Θ͔Βͳ͍ܕ͸ɺܕม਺ΛׂΓ౰ͯΔ
    w Τϥʔͷݕ஌΍ܕม਺΁ͷ୅ೖ͸ϢχϑΟέʔγϣ
    ϯΛ༻͍Δ
    w ϢχϑΟέʔγϣϯ͸ܕͷ੍ݶ͕͋ΔՕॴͰద༻͢
    Δ

    View Slide

  59. ࢒Γ࿩͍ͨ͜͠ͱ
    w ΑΓৄࡉͳΞϧΰϦζϜ
    w ଟ૬ܕ΍ OVMMcJOUFHFS
    Έ͍ͨͳܕͷѻ͍
    w ಈతܕ෇͚ͷ৔߹ͷΞϧΰϦζϜͷௐ੔
    w FWBM͕͋Δͱ୆ແ͠ͳ࿩
    w ίϯτϩʔϧϑϩʔΛղੳ͢Δ࿩
    w ෼Ͱ͸ෆՄೳ

    View Slide

  60. ը૾ग़యंాਖ਼ඒஉࡔ

    View Slide

  61. View Slide

  62. ͝ਗ਼ௌ͋Γ͕ͱ͏
    ͍͟͝·ͨ͠

    View Slide