Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

୭͓·͑ • LINE FukuokaͷiOSΤϯδχΞ • ৽ଔ2೥໨ / ࣾྺ3೥໨ • YouTube΍ͬͯΔͷͰݟͯ • ΞϝϦΧొஃཱྀߦVlog

Slide 3

Slide 3 text

GWʹ΍ͬͨ͜ͱ

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

ຊ୊ʹҠΔ

Slide 7

Slide 7 text

GWʹ΍ͬͨ͜ͱ

Slide 8

Slide 8 text

SwiftͰCPUΛ࡞Δ

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

nand2tetris • ޙ൒ʹͳΔʹͭΕͯ಺༰َ͕சʹͳΔ • ࢒Γͷήʔτ → CPU → ίϯϐϡʔλ → VM → ίϯύΠϥ … • ࠷ऴతʹ͸ςτϦε͕ग़དྷ্͕ΔΒ͍͠ • https://www.nand2tetris.org/

Slide 11

Slide 11 text

͜ͷຊΛࢀߟʹͨ͠

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

SwiftͰnand2tetris • ͱΓ͋͑ͣҎԼͷറΓͰ΍ͬͯΈͨ • NANDήʔτɾDFFҎ֎Ͱ if ΍ switch ͱ͍ͬͨ৚݅จݪଇېࢭ • NANDͰϋʔυ΢ΣΞΛશ෦࣮૷͢ΔͨΊ • ͨͩ͠ɺग़ྗͷϏοτ਺Λଟ͘͢ΔͨΊͱ͔͸Մೳ • ϓϦϛςΟϒͳ Boolܕ Ͱ͸ͳ͘ enum ʹΑΔ஋Ͱૢ࡞ • ͜ͷ੍໿Ͱ1ΫϩοΫ2ඵͷΫιίϯϐϡʔλʹɾɾɾ

Slide 15

Slide 15 text

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 )

Slide 16

Slide 16 text

SwiftͰnand2tetris (֤ήʔτ)

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

SwiftͰnand2tetris (ALU: ԋࢉ૷ஔ)

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

SwiftͰnand2tetris (CPU/Program Counter)

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

Ͱ͖ͨ

Slide 28

Slide 28 text

SwiftͰnand2tetris (ΞηϯϒϦ) • ͜͜·Ͱ࡞Δͱ RAM: 4KB, CPU: 16bitͷίϯϐϡʔλ͕࡞Εͨ • ࢼͯ͠ΈͨΒ 2ඵ / ΫϩοΫͩͬͨ • 0.5 Hz • ϫΠͷMacbook 2.4 GHz • 48ԯഒ஗͍

Slide 29

Slide 29 text

ͭΒ͔ͬͨ͜ͱ

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

ۮવSwiftίϯύΠϥͷόά౿Έز౓΋PC࠶ىಈ • ܕνΣοΫ͕ࣦഊ͢Δͱ͖ʹίϯύΠϥ͕๫૸͢ΔϒϥΫϥόά • Swift 5.3 dev branchͰ͸վળࡁΈ • ϝϞϦ͕΍ΒΕͨΒɺτϥοΫύου͕๫૸͢Δͱ͍͏஌ݟΛಘͨ • ๫૸͢ΔͱͲ͜ͷϓϩάϥϜϛεͬͯΔͷ͔ڭ͑ͯ͘Εͳ͍ • ͳͷͰίϯύΠϥΤϥʔ͔΋Θ͔Βͣʹ̍೔ফඅ

Slide 32

Slide 32 text

ۮવSwiftίϯύΠϥͷόά౿Έز౓΋PC࠶ىಈ ֘౰ͷίϛοτ https://github.com/freddi-kit/Swift2Tetris/commit/ 84c42b8da965608a5c7152842e168f5219427732#r39052324 
 Xcode 11.4.1Ͱ֬ೝࡁΈ

Slide 33

Slide 33 text

ಘͨ΋ͷɾֶΜͩ͜ͱ

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

Swiftͷenum͸BoolΑΓগʑ஗͍ • CPU͸ Bit ԋࢉΛ Bool Ͱ͸ͳ͘ enum ʹ͍ͨͤ͠Ͱ஗͍ • Bool͸Swiftͷ಺෦Ͱ͸ 1bit ͷ Integer (ͩͬͨ͸ͣ) • enum ͷ΄͏͕αΠζ΋ܭࢉίετ͕ඇৗʹେ͖͍ʁ • RAMΛstructʹͯ͠ίϯύΠϧ͢ΔͱίϯύΠϧ͕ऴΘΒͳ͍ • ࠓޙͷ՝୊

Slide 37

Slide 37 text

Mac͸ϝϞϦ͕ࢮ͵ͱTrackPad͕๫૸͢Δ • ྫͷίϯύΠϥͷόά • ੜ͖ͯΔ∞ϓνϓνͷΑ͏ͳײ֮ • ͳΜ͔ɺੜ͖ͯΔΑ͏Ͱ͔Θ͍͍ͷͰͥͻ • ͭ͡͸Կճ͔Θ͟ͱ΍ָͬͯ͠Μͩ • ΍Γ͍ͨํ͸ԼهϦϯΫ͔Βɺͨͩ͠೤๫૸΋͋ΔͷͰࣗݾ੹೚Ͱ https://github.com/freddi-kit/Swift2Tetris/commit/ 84c42b8da965608a5c7152842e168f5219427732#r39052324

Slide 38

Slide 38 text

࠷ޙʹ

Slide 39

Slide 39 text

࠷ޙʹ • nand2tetris ͸ SwiftͰ΋Ͱ͖Δʂ • Mac͕೤๫૸΍ϝϞϦ͕ࢮ͵ͱTrackPad͕͔Θ͍͍ • ྲྀੴʹ0.5zh͸ͻͲ͍ͷͱVM·Ͱ΍Γ͍ͨHDLͰ࣮૷͠௚͠·͢ • ͦΕ͔ϦΞϧʹճ࿏ઃܭͯ͠Ҡ২ͯ͠΋͍͍͔΋