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

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

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

F7dd7b43a0cc6c063f7d98ba23a1d359?s=128

久保田光則

May 21, 2016
Tweet

Transcript

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

  2. ࣗݾ঺հ w ٱอాޫଇ!BOBUPP w 6*69σβΠφʔ݉
 ιϑτ΢ΣΞΤϯδχΞ w "TQFDUJWF--$୅ද w IUUQBTQFDUJWFJP

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

  4. ޷ධൃചதʂ

  5. IUUQPOTFOJP

  6. ΞδΣϯμ w ܕਪ࿦ͱ͸  w ͳͥ1)1Ͱܕਪ࿦  w ಈతݴޠͰͷܕਪ࿦ͷϝϦοτ w

    1)1ͷ"45ͷଘࡏ w ܕਪ࿦ΞϧΰϦζϜͷ঺հ
  7. ܕਪ࿦ͱ͸

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

  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)
  10. ܕਪ࿦Λ࣋ͭݴޠ w 4DBMB w )BTLFMM w 0$BNM w 4XJGU w

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

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

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

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

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

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

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

  18. +4ͰͷྫIUUQSGSOPSHdTIVESBGUTUJQEG

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

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

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

  22. 1)1Ͱͷػӡ

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

    ͷಋೖ
  24. 4DBMBS5ZQF)JOUT w JOU΍qPBU΍TUSJOH΍CPPMͳͲͷεΧϥ஋ͷܕ͕5ZQF)JOUͰ ࢦఆͰ͖Δ w ࣗಈతʹΩϟετ͞ΕΔΏΔ͍λΠϓνΣοΫ <?php function square(int $i)

    { return $i * $i; } square(3); // => 9 square(4.1); // => 16
  25. ؔ਺ͷ໭Γܕ w ؔ਺ͷ໭Γ஋ͷܕ΋ࢦఆͰ͖ΔΑ͏ʹͳͬ ͨ <?php function foo(): array { return

    [1, 2, 3]; } foo();
  26. ݫ֨ͳܕࢦఆ w એݴͨ͠ϑΝΠϧͰ͸ܕ͕ݫ֨ʹѻΘΕΔ w ҉໧ͷΩϟετ͕ߦΘΕͳ͍Ϟʔυʹ <?php declare(strict_types=1); function add(int $a,

    int $b): int { return $a + $b; } add(1.0, 2.0); // Τϥʔ
  27. 1)1Ͱͷܕͷѻ͍ͷมԽ w ໭Γ஋ͷܕνΣοΫΛએݴͰ͖ΔΑ͏ʹͳͬͨ w ݫີʹએݴͰ͖ΔΑ͏ʹͳͬͨ w ϓϦϛςΟϒͳ஋ͷܕ͕ࢦఆͰ͖ΔΑ͏ʹͳͬ ͨ w ੩తղੳ͠΍͘͢ͳͬͨ

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

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

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

    1)1Ͱͷ࣮ߦͷྲྀΕ
  31. τʔΫϯͷϦετΛੜ੒ ந৅ߏจ໦ "45 ͷੜ੒ ಺෦7.༻ͷ໋ྩΛੜ੒ ಺෦7.Ͱ࣮ߦ ࣈ۟ղੳ ߏจղੳ ίϯύΠϧ ࣮ߦ

    w 1)1Ͱ͸ɺߏจղੳ࣌ʹ͸"45Λੜ੒ w 7.༻ͷίʔυੜ੒͸ͦͷޙʹߦ͏Α͏ʹͳͬͨ 1)1Ͱͷ࣮ߦͷྲྀΕ
  32. 1)1"45֦ுϥΠϒϥϦ w ैདྷίϯύΠϧ͕ऴΘΕ͹"45͸ࣺͯΒΕΔ w 1)1͔ΒͰ΋ந৅ߏจ໦Λѻ͏͜ͱ͕Ͱ͖ ΔΑ͏ʹ͢Δ֦ுϥΠϒϥϦ w ந৅ߏจ໦ΛऔΓग़ͯ͠੩తղੳͰ͖Δ IUUQTHJUIVCDPNOJLJDQIQBTU

  33. ྫ <?php require 'path/to/util.php'; $code ='<?php $var = 42;’ echo

    ast_dump(ast\parse_code( $code, $version=30 )), "\n"; IUUQTHJUIVCDPNOJLJDQIQBTUCMPCNBTUFS3&"%.&NE
  34. ग़ྗ w WBSͱ͍͏ίʔυͷߏจ໦͕औΕ͍ͯΔ w ͜ΕͰ੩తղੳ͠์୊ͩʂ AST_STMT_LIST 0: AST_ASSIGN var: AST_VAR

    name: "var" expr: 42
  35. ܕਪ࿦ͷ֓ཁ

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

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

     &3303 0CKFDU JOUFHFS OFX 0CKFDU
  38. ਪ࿦ͷϙΠϯτ w &YQSFTTJPOͷߏจ໦ͷ຤୺͔Βਪ࿦Λ࢝ΊΔ w ਪ࿦نଇʹԠͯ͡ਪ࿦͍ͯ͘͠ w Θ͔Βͳ͍৔߹ʹ͸ܕม਺Λ෇Ճ w ੍ݶʹԠͯ͡ϢχϑΟέʔγϣϯΛߦ͏ w

    ܕม਺ͷ୅ೖɾΤϥʔͷݕ஌ w ਪ࿦͕Ͱ͖ͨ৔߹ʹ͸ܕ؀ڥʹ൓ө͍ͯ͘͠
  39. ຤୺͔Βਪ࿦͢Δ w ͋ΔܭࢉΛਪ࿦͢Δ৔߹ʹ͸ɺԼ෦ͷϊʔυ͔Βਪ࿦͍ͯ͘͠ w ߏจ໦Λ࠶ؼతʹḷͬͯߦ͘͜ͱͰՄೳ     JOUFHFS

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

    ྫF ͱF ͷܕ͕BSSBZͰ͋Δ࣌ɺ F  F ͷܕ͸BSSBZͰ͋Δ w ྫF ͷܕ͕0CKFDUͱF ͷܕ͕JOUͰ͋Δ࣌ɺλΠϓΤϥʔͰ͋Δ w ߏจ໦ΛͨͲ͍ͬͯ࣌͘ʹਪ࿦نଇΛద༻ w نଇ͸۪௚ʹίʔυΛॻ͍͍ͯ͘ w ܕ͕Θ͔ͬͨΒܕ؀ڥʹ൓ө͍ͯ͘͠
  41. ܕ؀ڥ w ؔ਺΍ΫϥεͳͲͷܕ৘ใΛొ࿥͢Δ৔ॴ w ૊ΈࠐΈؔ਺ͷܕ৘ใ͸༧Ίొ࿥ w ίʔυΛղੳͯ͠ਪ࿦Ͱ͖ͨ݁ՌΛ֨ೲ w ܕਪ࿦ثͷ࣮ߦίϯςΩετΈ͍ͨͳ΋ͷ

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

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

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

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

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

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

  48. ԾҾ਺ͷܕͱҾ਺ͷܕ w OVNͷܕͱBҾ਺ͷܕ͸ಉ͡Ͱͳ͚Ε͹ͳΒͳ͍ <?php declare(strict_types=1); function square(int $a): int {

    ... } echo square($num);
  49. SFUVSOͷܕͱฦΓ஋ͷܕએݴ w SFUVSOͷදݱͷܕͱฦΓ஋ͷܕએݴ͸ಉ͡Ͱͳ ͚Ε͹ͳΒͳ͍ <?php declare(strict_types=1); function foobar(): int {

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

    JOUJOU ੒ޭ
  51. ྫ function foobar(): int { return “hoge”; } JOUTUSJOH Τϥʔ

    w ܕ͕͋ͬͯͳ͍ͷͰΤϥʔΛग़͢
  52. ྫ w GPPCBSؔ਺ͷฦΓ஋ͷܕม਺BʹJOU͕୅ೖ͞ΕΔ function foobar() { return 1; } BJOU

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

    } JOUC ܕม਺CʹJOUΛ࣮૷ ܕม਺CΛׂΓ౰ͯ
  54. ྫ w Ҿ਺ͷܕͱฦΓ஋ͷܕ͕ಉ͡Ͱ͋Δ͜ͱ͕ਪ࿦ Ͱ͖Δ function foobar($a) { return $a; }

    ED ܕม਺DΛܕม਺Eʹ΋ׂΓ౰ͯΔ ܕม਺DΛׂΓ౰ͯ ฦΓ஋ͷܕʹܕม਺EΛׂΓ౰ͯ
  55. ؔ਺ద༻Ͱਪ࿦Ͱ͖Δྫ w JODؔ਺ͷ໭Γ஋ͷܕ͸ɺؔ਺ຊମΛݟ͚ͨͩͰ͸Θ͔Βͳ͍ w ؔ਺ద༻ͰҾ਺ͷܕݟΔͱॳΊͯ൑໌͢Δ w ؔ਺ద༻ͷࣜΛਪ࿦͢Δͱ͖ʹɺҾ਺ͷܕͱJODؔ਺ͷத਎ Λਪ࿦͠௚͢͜ͱͰJOD  ͷܕ͕Θ͔Δ

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

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

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

    w ϢχϑΟέʔγϣϯ͸ܕͷ੍ݶ͕͋ΔՕॴͰద༻͢ Δ
  59. ࢒Γ࿩͍ͨ͜͠ͱ w ΑΓৄࡉͳΞϧΰϦζϜ w ଟ૬ܕ΍ OVMMcJOUFHFS Έ͍ͨͳܕͷѻ͍ w ಈతܕ෇͚ͷ৔߹ͷΞϧΰϦζϜͷௐ੔ w

    FWBM͕͋Δͱ୆ແ͠ͳ࿩ w ίϯτϩʔϧϑϩʔΛղੳ͢Δ࿩ w ෼Ͱ͸ෆՄೳ
  60. ը૾ग़యंాਖ਼ඒஉࡔ

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