SwiftでCPUを作る

1405a601755e5fcbfdc93a2560368bb1?s=47 freddi(Yuki Aki)
May 11, 2020
62

 SwiftでCPUを作る

1405a601755e5fcbfdc93a2560368bb1?s=128

freddi(Yuki Aki)

May 11, 2020
Tweet

Transcript

  1. GWͷࣗ༝ݚڀൃදձ - 11st/May/2020 Swift ͰCPUΛ࡞Δ freddi - LINE Fukuoka

  2. ୭͓·͑ • LINE FukuokaͷiOSΤϯδχΞ • ৽ଔ2೥໨ / ࣾྺ3೥໨ • YouTube΍ͬͯΔͷͰݟͯ

    • ΞϝϦΧొஃཱྀߦVlog
  3. GWʹ΍ͬͨ͜ͱ

  4. ࣗ࡞ΩʔϘʔυͷFW࿔ͬͯύϦϐʹͳΔ

  5. ࣗ࡞ΩʔϘʔυͷFW࿔ͬͯύϦϐʹͳΔ

  6. ຊ୊ʹҠΔ

  7. GWʹ΍ͬͨ͜ͱ

  8. SwiftͰCPUΛ࡞Δ

  9. nand2tetris • 2ͭͷϓϦϛςΟϒͳήʔτͰճ࿏Λ͔ͭͬͯίϯϐϡʔλͱ͔࡞Δ • ͜͜Ͱ͸ NANDͱDFF ͕ϓϦϛςΟϒͳήʔτ • ී௨͸HDLͱ͔Ͱ࡞͍ͬͯ͘ •

    ͜͜Ͱ࡞Δίϯϐϡʔλ͸Hack Computerͱ໊෇͚ΒΕͯΔ
  10. nand2tetris • ޙ൒ʹͳΔʹͭΕͯ಺༰َ͕சʹͳΔ • ࢒Γͷήʔτ → CPU → ίϯϐϡʔλ →

    VM → ίϯύΠϥ … • ࠷ऴతʹ͸ςτϦε͕ग़དྷ্͕ΔΒ͍͠ • https://www.nand2tetris.org/
  11. ͜ͷຊΛࢀߟʹͨ͠

  12. https://github.com/freddi-kit/Swift2Tetris
 
 ※ ҰԠίϯϐϡʔλ·Ͱ͸Ͱ͖͚ͨͲςετॻ͍ͯͳ͍
 ※ ຊͰ͍͏ͱ̑ষ·Ͱ

  13. SwiftͰnand2tetris • SwiftͰCPU·Ͱͭͬͨ͘ਓؒ͸͍ͳ͍Β͍͠ • ϫΠௐ΂ 2020೥5݄ݱࡏ • Rust͸1ਓ͍ͨ

  14. SwiftͰnand2tetris • ͱΓ͋͑ͣҎԼͷറΓͰ΍ͬͯΈͨ • NANDήʔτɾDFFҎ֎Ͱ if ΍ switch ͱ͍ͬͨ৚݅จݪଇېࢭ •

    NANDͰϋʔυ΢ΣΞΛશ෦࣮૷͢ΔͨΊ • ͨͩ͠ɺग़ྗͷϏοτ਺Λଟ͘͢ΔͨΊͱ͔͸Մೳ • ϓϦϛςΟϒͳ Boolܕ Ͱ͸ͳ͘ enum ʹΑΔ஋Ͱૢ࡞ • ͜ͷ੍໿Ͱ1ΫϩοΫ2ඵͷΫιίϯϐϡʔλʹɾɾɾ
  15. SwiftͰnand2tetris (֤ήʔτ) • OR AND XOR NOT ͸͔ΜͨΜͩͬͨ • NOT

    x = x NAND x • x AND y = NOT ( x AND y ) • x OR y = ( NOT x ) NAND ( NOT y )
  16. SwiftͰnand2tetris (֤ήʔτ)

  17. SwiftͰnand2tetris ((σ)ϚϧνϓϨΫα)

  18. SwiftͰnand2tetris ((σ)ϚϧνϓϨΫα) • ৚݅෼ذͰඞཁʹͳΔ΍ͭ • ਅِ஋දॻ͍ͯΰϦԡ͠Ͱ࣮૷

  19. SwiftͰnand2tetris ((σ)ϚϧνϓϨΫα)

  20. SwiftͰnand2tetris (ALU: ԋࢉ૷ஔ) • CPUͷதͰܭࢉͯ͘͠ΕΔύʔπ • ϚϧνϓϨΫα͋ͨΓͪΌΜͱ࣮૷ͯ͠ΔͱצͰ࡞ΕΔ

  21. SwiftͰnand2tetris (ALU: ԋࢉ૷ஔ)

  22. SwiftͰnand2tetris (ϨδελɾRAM(ϝϞϦ)) • খ͍͞Ϩδελ͔ΒͲΜͲΜαΠζΛ޿͛ͯ࡞͍ͬͯ͘ • ϚϧνϓϨΫα͋ͨΓͪΌΜͱ࣮૷ͯ͠ΔͱצͰ࡞ΕΔ • ಛʹɺΞυϨεࢦఆಡΈࠐΈͷ࣮૷͸ษڧʹͳͬͨ • ಛఆͷॻ͖ํΛ͢ΔͱίϯύΠϧ͕࣌ؒϚδͰَச

  23. SwiftͰnand2tetris (ϨδελɾRAM(ϝϞϦ))

  24. SwiftͰnand2tetris (CPU/Program Counter) • ࣍ͷ໋ྩΛड͚෇͚Δ 16bitͷCPUΛ࡞Δ • 1 1 1

    a c c c c c c d d d j j j (֤ه߸ʹ͸ 0 or 1) • c ͸ ALUʹ౤͛Δԋࢉॲཧ • d d d ͸Ϩδελ/ RAM ͷσʔλ֨ೲઌ • j j j ͸ jmp ໋ྩ • ϨδελʹσʔλΛೖΕΔ͚ͩͳΒ 0 x x x x x x x x x x x x x x
  25. SwiftͰnand2tetris (CPU/Program Counter)

  26. SwiftͰnand2tetris (ΞηϯϒϦ) • ΞηϯϒϦݴޠΛͭͬͯ͘SwiftͰػցޠ΁ͷ຋༁ػΛॻ͍ͨ • ࠓ·Ͱͷ࡞ۀͰҰ൪ָͩͬͨ • ϓϩάϥϜRAMম͖ث΋ͭͬͨ͘

  27. Ͱ͖ͨ

  28. SwiftͰnand2tetris (ΞηϯϒϦ) • ͜͜·Ͱ࡞Δͱ RAM: 4KB, CPU: 16bitͷίϯϐϡʔλ͕࡞Εͨ • ࢼͯ͠ΈͨΒ

    2ඵ / ΫϩοΫͩͬͨ • 0.5 Hz • ϫΠͷMacbook 2.4 GHz • 48ԯഒ஗͍
  29. ͭΒ͔ͬͨ͜ͱ

  30. ςετ͕ਏ͍ʢಛʹRAMͱCPUʣ • όά͕ଟ͘ൃੜͨ͠ͷͰॻ͖͸͡Ίͨ • ྲྀੴʹ512BͷRAM͔Β͸ॻ͍ͯͳ͍ • 512ͩͱ 2^8bit = 256

    ݸςετέʔε͋Δ • 32k ͩͱ 2^15bit = 32768 ݸςετέʔε
  31. ۮવSwiftίϯύΠϥͷόά౿Έز౓΋PC࠶ىಈ • ܕνΣοΫ͕ࣦഊ͢Δͱ͖ʹίϯύΠϥ͕๫૸͢ΔϒϥΫϥόά • Swift 5.3 dev branchͰ͸վળࡁΈ • ϝϞϦ͕΍ΒΕͨΒɺτϥοΫύου͕๫૸͢Δͱ͍͏஌ݟΛಘͨ

    • ๫૸͢ΔͱͲ͜ͷϓϩάϥϜϛεͬͯΔͷ͔ڭ͑ͯ͘Εͳ͍ • ͳͷͰίϯύΠϥΤϥʔ͔΋Θ͔Βͣʹ̍೔ফඅ
  32. ۮવSwiftίϯύΠϥͷόά౿Έز౓΋PC࠶ىಈ ֘౰ͷίϛοτ https://github.com/freddi-kit/Swift2Tetris/commit/ 84c42b8da965608a5c7152842e168f5219427732#r39052324 
 Xcode 11.4.1Ͱ֬ೝࡁΈ

  33. ಘͨ΋ͷɾֶΜͩ͜ͱ

  34. ͕Μ͹Ε͹nand͚ͩͰίϯϐϡʔλ࡞ΕΔ • CPUͷςετ΋શύλʔϯಈ͍ͨͷͰCPUͱݴ͑Δ΋ͷ͸Ͱ͖ͨ

  35. ΞυϨεͰRAMͷ৔ॴΛࢀর͢Δํ๏ • ͜͜·Ͱͷͳ͔Ͱׂͱ໘ന͍෦෼ͩͬͨ ϝϞϦ ΞυϨε ΄͍͠஋

  36. Swiftͷenum͸BoolΑΓগʑ஗͍ • CPU͸ Bit ԋࢉΛ Bool Ͱ͸ͳ͘ enum ʹ͍ͨͤ͠Ͱ஗͍ •

    Bool͸Swiftͷ಺෦Ͱ͸ 1bit ͷ Integer (ͩͬͨ͸ͣ) • enum ͷ΄͏͕αΠζ΋ܭࢉίετ͕ඇৗʹେ͖͍ʁ • RAMΛstructʹͯ͠ίϯύΠϧ͢ΔͱίϯύΠϧ͕ऴΘΒͳ͍ • ࠓޙͷ՝୊
  37. Mac͸ϝϞϦ͕ࢮ͵ͱTrackPad͕๫૸͢Δ • ྫͷίϯύΠϥͷόά • ੜ͖ͯΔ∞ϓνϓνͷΑ͏ͳײ֮ • ͳΜ͔ɺੜ͖ͯΔΑ͏Ͱ͔Θ͍͍ͷͰͥͻ • ͭ͡͸Կճ͔Θ͟ͱ΍ָͬͯ͠Μͩ •

    ΍Γ͍ͨํ͸ԼهϦϯΫ͔Βɺͨͩ͠೤๫૸΋͋ΔͷͰࣗݾ੹೚Ͱ https://github.com/freddi-kit/Swift2Tetris/commit/ 84c42b8da965608a5c7152842e168f5219427732#r39052324
  38. ࠷ޙʹ

  39. ࠷ޙʹ • nand2tetris ͸ SwiftͰ΋Ͱ͖Δʂ • Mac͕೤๫૸΍ϝϞϦ͕ࢮ͵ͱTrackPad͕͔Θ͍͍ • ྲྀੴʹ0.5zh͸ͻͲ͍ͷͱVM·Ͱ΍Γ͍ͨHDLͰ࣮૷͠௚͠·͢ •

    ͦΕ͔ϦΞϧʹճ࿏ઃܭͯ͠Ҡ২ͯ͠΋͍͍͔΋