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

「CPUとは何か」をPHPで考える / What is a CPU?

「CPUとは何か」をPHPで考える / What is a CPU?

PHPカンファレンス 2019 の発表資料です

HASEGAWA Tomoki

December 01, 2019
Tweet

More Decks by HASEGAWA Tomoki

Other Decks in Technology

Transcript

  1. લ࠲ ʙʮ$16ͱ͸Կ͔ʯ Λ1)1Ͱߟ͑Δ "     # 

       :     ೖྗ ग़ྗ " # :
  2. લ࠲ ʙʮ$16ͱ͸Կ͔ʯ Λ1)1Ͱߟ͑Δ "     # 

       :     ೖྗ ग़ྗ " # :
  3. લ࠲ ʙʮ$16ͱ͸Կ͔ʯ Λ1)1Ͱߟ͑Δ "     # 

       :     ೖྗ ग़ྗ " # :
  4. લ࠲ ʙʮ$16ͱ͸Կ͔ʯ Λ1)1Ͱߟ͑Δ "     # 

       :     ೖྗ ग़ྗ " # :
  5. લ࠲ ʙʮ$16ͱ͸Կ͔ʯ Λ1)1Ͱߟ͑Δ "     # 

       :     ೖྗ ग़ྗ " # :
  6. ϥΠϑϫʔΫ ςοΫΧϯϑΝϨϯεӡӦࢀՃ  8FCJ04ΞϓϦ։ൃ Ϗʔϧ  $16 ϨτϩήʔϜػ ిࢠ޻࡞ 

    αοΧʔ؍ઓ  ϨϯλϧΧʔτϨʔε ʜ σδλϧαʔΧεגࣜձࣾ ෭ஂ௕$50 !UPN[PI
  7. 5%ͷϚγϯޠ Φϖίʔυ     Φϖϥϯυʢ*Nʣ   

      "Ϩδελʹ*Nͷ஋Λ଍͢ "%%" *N
  8. 5%ͷϚγϯޠ Φϖίʔυ     Φϖϥϯυʢ*Nʣ   

      ""  "Ϩδελʹ*Nͷ஋Λ଍͢ "%%" *N
  9. 5%ͷ໋ྩηοτ ໋ྩ ʢχʔϞχοΫʣ ಈ࡞ 0QDPEF ʢਐʣ 0QDPEF ʢਐʣ "%%" *N

    "Ϩδελʹ*NΛ଍͢ C Y .07" # #Ϩδελͷ஋Λ"Ϩδελʹసૹ͢Δ C Y */" *0ϙʔτ͔Β"Ϩδελʹ஋ΛಡΈࠐΉ C Y .07" *N "Ϩδελʹ*Nͷ஋Λసૹ͢Δ C Y +.1*N *Nʹδϟϯϓ͢Δ C YG
  10. 5%ͷ໋ྩηοτ ໋ྩ ʢχʔϞχοΫʣ ಈ࡞ 0QDPEF ʢਐʣ 0QDPEF ʢਐʣ "%%" *N

    "Ϩδελʹ*NΛ଍͢ C Y .07" # #Ϩδελͷ஋Λ"Ϩδελʹసૹ͢Δ C Y */" *0ϙʔτ͔Β"Ϩδελʹ஋ΛಡΈࠐΉ C Y .07" *N "Ϩδελʹ*Nͷ஋Λసૹ͢Δ C Y +.1*N *Nʹδϟϯϓ͢Δ C YG શ໋ྩ
  11. 5%ͷϚγϯޠϓϩάϥϜ ΞυϨε όΠφϦ ໋ྩ ҙຯ  # 065 065ϙʔτʹYYYY 

    # 065 Λग़ྗ͢Δ  # 065  # 065  # 065  # 065  ' +.1 ʹδϟϯϓ͢Δ
  12. ϝϞϦͱ͸ͲΜͳ΋ͷʁ wΞυϨεʢ൪஍ʣ͝ͱʹόΠτͷσʔλΛ อ࣋͢ΔσόΠε ΞυϨε όΠφϦ ໋ྩ ҙຯ  # 065

    065ϙʔτʹYYYY  # 065 Λग़ྗ͢Δ  # 065  # 065  # 065  # 065  ' +.1 ʹδϟϯϓ͢Δ
  13. Ͳͷ༷ʹϝϞϦΛදݱ͢Δʁ ΞυϨε όΠφϦ ໋ྩ ҙຯ  # 065 065ϙʔτʹYYYY 

    # 065 Λग़ྗ͢Δ  # 065  # 065  # 065  # 065  ' +.1 ʹδϟϯϓ͢Δ
  14. Ͳͷ༷ʹϝϞϦΛදݱ͢Δʁ ΞυϨε όΠφϦ ໋ྩ ҙຯ  # 065 065ϙʔτʹYYYY 

    # 065 Λग़ྗ͢Δ  # 065  # 065  # 065  # 065  ' +.1 ʹδϟϯϓ͢Δ 21)1ʹɺ͜ΕΛදݱ͢Δͷʹ ϐολϦͷݴޠ࢓༷͕ ͋Γ·͢ΑͶɻԿͰ͠ΐ͏ʁ
  15. class Cpu { public function __construct() { $this->ram = array_fill(0,

    0b1111, 0); $this->pc = $this->a = $this->b = 0; } private $ram; private $pc; private $a; private $b; ϝϞϦͷॳظԽͱϨδελͷ࣮૷
  16. 5%ͷϚγϯޠ 0QDPEF     *Nʢ0QFSBOE   

      ""  "Ϩδελʹ*Nͷ஋Λ଍͢ "%%" *N
  17. $opcode = $byte >> 4; $im = $byte & 0b00001111;

    public function executeInstruction() { $byte = $this->ram[$this->pc]; 0QDPEF     *Nʢ0QFSBOE    
  18. $opcode = $byte >> 4; $im = $byte & 0b00001111;

    public function executeInstruction() { $byte = $this->ram[$this->pc];
  19. $opcode = $byte >> 4; $im = $byte & 0b00001111;

    public function executeInstruction() { switch ($opcode){ case 0b0000: // ADD A, Im $this->a += $im; break; } $byte = $this->ram[$this->pc];
  20. $opcode = $byte >> 4; $im = $byte & 0b00001111;

    public function executeInstruction() { switch ($opcode){ case 0b0000: // ADD A, Im $this->a += $im; break; } $byte = $this->ram[$this->pc]; case 0b0001:
  21. $opcode = $byte >> 4; $im = $byte & 0b00001111;

    public function executeInstruction() { switch ($opcode){ case 0b0000: // ADD A, Im $this->a += $im; break; } $this->pc++; } $byte = $this->ram[$this->pc]; case 0b0001:
  22. case 0b0110: // IN B $this->b = $this->in; break; case

    0b1001: // OUT B $this->out = $this->b; break;
  23. case 0b0110: // IN B $this->b = $this->in; break; case

    0b1001: // OUT B $this->out = $this->b; break; case 0b1011: // OUT Im $this->out = $operand; break;
  24. DQVOFX5Ea$QV  do { printf("PC: 0b%04b > ", $cpu->pc); $stdin

    = fgets(STDIN); $cpu->in = bindec($stdin); $cpu->executeInstruction(); printf("IN: 0b%04b OUT: 0b%04b\n", $cpu->in, $cpu->out); } while(true);
  25.  QIQ SFRVJSF@PODFWFOEPSBVUPMPBEQIQ DQVOFX5Ea$QV  DQVSBN< C  C 

    C  C  C  C  C       > EP\ NBJOMPPQ ^XIJMF USVF 
  26.  QIQ SFRVJSF@PODFWFOEPSBVUPMPBEQIQ DQVOFX5Ea$QV  DQVSBN< C  C 

    C  C  C  C  C       > EP\ NBJOMPPQ ^XIJMF USVF 
  27.  QIQ SFRVJSF@PODFWFOEPSBVUPMPBEQIQ DQVOFX5Ea$QV  DQVSBN< C  C 

    C  C  C  C  C       > EP\ NBJOMPPQ ^XIJMF USVF  ϝϞϦʹϓϩάϥϜΛ ಡΈࠐΜͰ͍Δ
  28.  QIQ SFRVJSF@PODFWFOEPSBVUPMPBEQIQ DQVOFX5Ea$QV  DQVSBN< C  C 

    C  C  C  C  C       > EP\ NBJOMPPQ ^XIJMF USVF  ϝϞϦʹϓϩάϥϜΛ ಡΈࠐΜͰ͍Δ 04ͷ໾ׂ
  29. "%%" *Nͷ৔߹ 0QDPEF     *Nʢ0QFSBOE  

       "Ϩδελʹ*Nͷ஋Λ଍͢ "%%" *N
  30. "%%" *Nͷ৔߹ 0QDPEF     *Nʢ0QFSBOE  

       ""  "Ϩδελʹ*Nͷ஋Λ଍͢ "%%" *N
  31. .07" #ͷ৔߹ 0QDPEF     *Nʢ0QFSBOE  

       "Ϩδελʹ#Ϩδελͷ஋Λ సૹ͢Δ .07" #
  32. .07" #ͷ৔߹ 0QDPEF     *Nʢ0QFSBOE  

       "Ϩδελʹ#Ϩδελͷ஋Λ సૹ͢Δ .07" # "# 
  33. */ ϙʔτ " Ϩδελ # Ϩδελ 065 ϙʔτ 1$ Ϩδελ

    Ճࢉػ ϝϞϦ ηϨΫλ ԿͱԿΛ଍ͯ͠Ͳ͜ʹసૹ͢Δ͔
  34. */ ϙʔτ " Ϩδελ # Ϩδελ 065 ϙʔτ 1$ Ϩδελ

    Ճࢉػ ϝϞϦ ηϨΫλ ԿͱԿΛ଍ͯ͠Ͳ͜ʹసૹ͢Δ͔
  35. */ ϙʔτ " Ϩδελ # Ϩδελ 065 ϙʔτ 1$ Ϩδελ

    Ճࢉػ ϝϞϦ ηϨΫλ ԿͱԿΛ଍ͯ͠Ͳ͜ʹసૹ͢Δ͔
  36. */ ϙʔτ " Ϩδελ # Ϩδελ 065 ϙʔτ 1$ Ϩδελ

    Ճࢉػ ϝϞϦ ηϨΫλ 0QDPEF     *Nʢ0QFSBOE     ԿͱԿΛ଍ͯ͠Ͳ͜ʹసૹ͢Δ͔
  37. */ ϙʔτ ԼҐCJU " Ϩδελ # Ϩδελ 065 ϙʔτ 1$

    Ϩδελ Ճࢉػ ϝϞϦ ηϨΫλ 0QDPEF     *Nʢ0QFSBOE     ԿͱԿΛ଍ͯ͠Ͳ͜ʹసૹ͢Δ͔
  38. */ ϙʔτ ԼҐCJU " Ϩδελ # Ϩδελ 065 ϙʔτ 1$

    Ϩδελ Ճࢉػ ϝϞϦ ηϨΫλ ԿͱԿΛ଍ͯ͠Ͳ͜ʹసૹ͢Δ͔
  39. */ ϙʔτ ԼҐCJU " Ϩδελ # Ϩδελ 065 ϙʔτ 1$

    Ϩδελ Ճࢉػ ϝϞϦ ηϨΫλ ԿͱԿΛ଍ͯ͠Ͳ͜ʹసૹ͢Δ͔
  40. */ ϙʔτ ԼҐCJU " Ϩδελ # Ϩδελ 065 ϙʔτ 1$

    Ϩδελ Ճࢉػ ϝϞϦ ηϨΫλ ԿͱԿΛ଍ͯ͠Ͳ͜ʹసૹ͢Δ͔
  41. ԿͱԿΛ଍ͯ͠Ͳ͜ʹసૹ͢Δ͔ */ ϙʔτ ԼҐCJU " Ϩδελ # Ϩδελ 065 ϙʔτ

    1$ Ϩδελ Ճࢉػ ϝϞϦ ηϨΫλ ͦΕΛͲ͏ܾΊΔʁ ͦΕ໋͕ͦ͜ྩͳͷͩʂ
  42. ԿͱԿΛ଍ͯ͠Ͳ͜ʹసૹ͢Δ͔ */ ϙʔτ ԼҐCJU " Ϩδελ # Ϩδελ 065 ϙʔτ

    1$ Ϩδελ Ճࢉػ ϝϞϦ ηϨΫλ ͦΕΛͲ͏ܾΊΔʁ ͦΕ໋͕ͦ͜ྩͳͷͩʂ 0QDPEF     *Nʢ0QFSBOE    
  43. ԿͱԿΛ଍ͯ͠Ͳ͜ʹసૹ͢Δ͔ */ ϙʔτ ԼҐCJU " Ϩδελ # Ϩδελ 065 ϙʔτ

    1$ Ϩδελ Ճࢉػ ϝϞϦ ηϨΫλ 0QDPEF     *Nʢ0QFSBOE    
  44. ԿͱԿΛ଍ͯ͠Ͳ͜ʹసૹ͢Δ͔ ্ҐCJU */ ϙʔτ ԼҐCJU " Ϩδελ # Ϩδελ 065

    ϙʔτ 1$ Ϩδελ Ճࢉػ ϝϞϦ ηϨΫλ 0QDPEF     *Nʢ0QFSBOE    
  45. ԿͱԿΛ଍ͯ͠Ͳ͜ʹసૹ͢Δ͔ ্ҐCJU */ ϙʔτ ԼҐCJU " Ϩδελ # Ϩδελ 065

    ϙʔτ 1$ Ϩδελ Ճࢉػ ϝϞϦ ηϨΫλ 0QDPEF     *Nʢ0QFSBOE    
  46. ΫϩοΫ ্ҐCJU */ ϙʔτ ԼҐCJU " Ϩδελ # Ϩδελ 065

    ϙʔτ 1$ Ϩδελ Ճࢉػ ϝϞϦ ηϨΫλ
  47. ΫϩοΫ ্ҐCJU */ ϙʔτ ԼҐCJU " Ϩδελ # Ϩδελ 065

    ϙʔτ 1$ Ϩδελ Ճࢉػ ϝϞϦ ηϨΫλ 1$
  48. ΫϩοΫ ্ҐCJU */ ϙʔτ ԼҐCJU " Ϩδελ # Ϩδελ 065

    ϙʔτ 1$ Ϩδελ Ճࢉػ ϝϞϦ ηϨΫλ 1$ 1$
  49. ΫϩοΫ ্ҐCJU */ ϙʔτ ԼҐCJU " Ϩδελ # Ϩδελ 065

    ϙʔτ 1$ Ϩδελ Ճࢉػ ϝϞϦ ηϨΫλ 1$ 1$ 1$
  50. ΫϩοΫ ্ҐCJU */ ϙʔτ ԼҐCJU " Ϩδελ # Ϩδελ 065

    ϙʔτ 1$ Ϩδελ Ճࢉػ ϝϞϦ ηϨΫλ 1$ 1$ 1$
  51. Y  .07"  "ϨδελʹΛసૹ Y  "%%"  "ϨδελʹΛ଍͢

    Y  .07# " #Ϩδελʹ"Ϩδελͷ ஋Λసૹ Y  065# #Ϩδελͷ஋Λ*0 ϙʔτʹग़ྗ Y ' +.1Y Yʹδϟϯϓ ϚγϯޠͰॻ͔ΕͨϓϩάϥϜ