5 คะแนน โดย GN⁺ 2024-11-02 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • NandGame เป็นเกมพัซเซิลเพื่อการเรียนรู้ที่เริ่มจากชิ้นส่วนลอจิกอย่างง่าย และสุดท้ายประกอบเป็น คอมพิวเตอร์ที่ตั้งโปรแกรมได้
  • แต่ละเลเวลคือโจทย์ให้สร้างคอมโพเนนต์ที่ทำงานตามสเปก และชิ้นส่วนที่สร้างเสร็จจะกลายเป็น บล็อกพื้นฐาน สำหรับขั้นถัดไป
  • ไม่จำเป็นต้องมีความรู้ล่วงหน้าเกี่ยวกับสถาปัตยกรรมคอมพิวเตอร์หรือซอฟต์แวร์ และใช้คณิตศาสตร์เพียงระดับ การบวกและการลบ แต่บางโจทย์อาจใช้เวลาพอสมควร
  • โจทย์แรกคือการใช้สายไฟและรีเลย์สร้างคอมโพเนนต์ nand ที่ให้เอาต์พุตเป็น 0 เฉพาะเมื่ออินพุต a และ b เป็น 1 ทั้งคู่
  • ลากชิ้นส่วนจากกล่องเครื่องมือมาวางใน พื้นที่สีน้ำเงิน และใช้ Spacebar, ปุ่มลูกศร และ Escape เพื่อควบคุมการลากและการยกเลิก

จากชิ้นส่วนพื้นฐานสู่คอมพิวเตอร์

  • NandGame ดำเนินไปด้วยการนำคอมโพเนนต์พื้นฐานมาประกอบเป็นชิ้นส่วนที่ทรงพลังขึ้นเรื่อย ๆ และในท้ายที่สุดสร้างเป็นคอมพิวเตอร์ที่ตั้งโปรแกรมได้
  • แบ่งออกเป็นหลาย เลเวล โดยในแต่ละขั้นต้องสร้างคอมโพเนนต์ที่ทำงานตรงตามสเปกที่กำหนด
    • คอมโพเนนต์ที่สร้างเสร็จแล้วจะกลายเป็นชิ้นส่วนที่ใช้ได้ในเลเวลถัดไป
    • จุดเริ่มต้นคือคอมโพเนนต์ลอจิกที่ง่ายที่สุด

ความรู้พื้นฐานที่ต้องมีและระดับความยาก

  • ไม่จำเป็นต้องมีความรู้ล่วงหน้าเกี่ยวกับสถาปัตยกรรมคอมพิวเตอร์หรือซอฟต์แวร์
  • คณิตศาสตร์ที่ต้องใช้ไม่เกิน การบวกและการลบ
  • บางโจทย์อาจใช้เวลาในการหาคำตอบ จึงต้องอาศัยความอดทน

โจทย์แรก: สร้าง nand

  • โจทย์แรกคือการใช้สายไฟและรีเลย์เพื่อสร้างคอมโพเนนต์ nand
  • ต้องเชื่อมอินพุต a และ b เข้ากับเอาต์พุต โดยจัดวงจรให้ทำงานตรงตามสเปก
  • 1 หมายถึงสถานะที่มีกระแสไฟไหล และ 0 หมายถึงสถานะที่ไม่มีกระแสไฟไหล
  • อินพุต V ส่ง กระแสคงที่ ที่มีค่าเป็น 1 ตลอดเวลา

สเปกของ nand

  • เอาต์พุตของ nand จะเป็น 0 เฉพาะเมื่ออินพุตทั้งสองเป็น 1 พร้อมกัน
  • สเปกอินพุตและเอาต์พุตโดยละเอียดมีดังนี้
a b เอาต์พุต
0 0 1
0 1 1
1 0 1
1 1 0

วิธีควบคุม

  • ลากคอมโพเนนต์จากกล่องเครื่องมือไปวางใน พื้นที่สีน้ำเงิน
  • กด Spacebar เพื่อหยิบรายการที่ลากได้
  • ระหว่างลาก ใช้ปุ่มลูกศรเพื่อย้ายรายการ
  • กด Spacebar อีกครั้งเพื่อวางในตำแหน่งใหม่ และกด Escape เพื่อยกเลิก

1 ความคิดเห็น

 
GN⁺ 2024-11-02
ความคิดเห็นบน Hacker News
  • เพราะชอบเกมนี้ เลยซื้อ บอร์ดพัฒนา FPGA ขนาดเล็กมาลองสร้างชุดคำสั่งกับซอฟต์ CPU เอง
    ไม่ได้ใช้งานได้จริงนัก แต่เป็นแบบฝึกหัดที่สนุก และผมเลือกบอร์ด iCE40 เพราะระบบนิเวศโอเพนซอร์สดีและราคาถูก: https://www.digikey.com/en/products/detail/lattice-semicondu...
    ตอนนี้อาจมีตัวเลือกที่ดีกว่านี้แล้วก็ได้

    • Niklaus Wirth ก็เคยทำอะไรคล้าย ๆ กัน โดยข้ออ้างคือเขาหากล่องสำเร็จรูปที่จะสื่อสารกับ เมาส์ที่ระลึกจาก Xerox PARC ซึ่งเขาชอบไม่ได้
      ปกติคนทั่วไปคงทำตัวแปลง USB แบบลวก ๆ ไปแล้ว แต่ Wirth อยากจัดการให้ถูกต้อง จึงเอาบอร์ด FPGA มาสร้างซอฟต์ CPU แล้ววาง OS, ระบบหน้าต่าง, ทูลเชนภาษา ฯลฯ ไว้บนนั้น
      ผลก็คือเขาสามารถรันแอปออกแบบฮาร์ดแวร์กับตัวแก้ไขข้อความ และใช้เมาส์ตัวโปรดทดลองออกแบบซอฟต์ CPU ได้มากขึ้น
    • ขั้นต่อไปน่าจะเป็น Tiny Tapeout: https://www.tinytapeout.com/
  • เคยเล่นเกมคล้าย ๆ กันชื่อ Turing Complete แล้วสนุกมาก: https://store.steampowered.com/app/1444480/Turing_Complete/
    คล้ายกับหนังสือ Nand2Tetris มาก

    • หลังจากทุ่มเวลาให้ Turing Complete ไป 30 ชั่วโมง ถึงเพิ่งรู้ตัวว่าเกิดอะไรขึ้น
      ผมอัปเกรดเครื่องเป็น คำสั่ง 32 บิต และถึงขั้นเขียนเอกสารภาษาแอสเซมบลีให้เข้ากับมันด้วย
      แม้จะยังเป็น Early Access แต่ก็เป็นเกมที่ยอดเยี่ยม
    • Turing Complete เป็นเกมที่แนะนำได้อย่างแน่นอน
      หน้าตาดี งานทำออกมาสมบูรณ์ และค่อนข้างติดหนึบ
      ดีที่มีบน GOG ด้วย: https://www.gog.com/game/turing_complete
  • บทความที่เกี่ยวข้อง:
    NandGame – Build a Computer from Scratch - https://news.ycombinator.com/item?id=36862274 - กรกฎาคม 2023
    NandGame – Build a Computer from Scratch - https://news.ycombinator.com/item?id=31055307 - เมษายน 2022
    NandGame – Build a Computer from Scratch - https://news.ycombinator.com/item?id=25282507 - ธันวาคม 2020
    Show HN: Online challenge: Build a CPU from scratch - https://news.ycombinator.com/item?id=17508151 - กรกฎาคม 2018

    • ไม่รู้เหมือนกันว่าผมพลาดบทความเก่า ๆ เหล่านี้ไปได้อย่างไร แต่ผมอ่านหนังสือแล้ว และลองอิมพลีเมนต์คอมพิวเตอร์เองด้วย
      เป็นแบบฝึกหัดที่สนุกจริง ๆ
  • เห็นสิ่งนี้แล้วนึกขึ้นได้ว่าผมลืมไปมากแค่ไหน รู้สึกขมขื่นอยู่เหมือนกัน
    กว่า 20 ปีก่อน ผมเรียน วิศวกรรมไฟฟ้า ที่มหาวิทยาลัยและเชี่ยวชาญด้านสถาปัตยกรรมคอมพิวเตอร์ แต่ในสายงานจริงไม่ได้ใช้เลย แล้วก็ไปทางซอฟต์แวร์แทน
    ผมจำไม่ได้เลยว่าต้องทำสิ่งต่าง ๆ ตรงนี้อย่างไร และกว่าจะสร้าง half-adder ได้ก็ต้องลองผิดลองถูกอยู่พักใหญ่

    • เข้าใจความรู้สึกนั้นนะ แต่ผมคิดว่าการเรียนที่เคยผ่านมาน่าจะช่วยให้คุณตัดสินใจไปใน ทิศทางที่ถูกต้อง ซ้ำ ๆ ได้
      มันคล้ายกับการโทษตัวเองที่จำไม่ได้ว่าใครเป็นคนผ่านกฎหมาย Corn Laws หรือใครเป็นผู้เริ่มการขนส่งแบบแช่เย็นในสหรัฐฯ
      ถ้ามีความเข้าใจฉากหลังของเรื่องเล่าหลัก ๆ เช่น สงครามต้องการวิศวกรรม ตามมาด้วยการปฏิวัติเกษตรกรรมและการปฏิวัติอุตสาหกรรม และประวัติศาสตร์คือการต่อสู้ทางชนชั้น ข้อมูลใหม่ ๆ ก็จะเข้าที่เข้าทางเหมือนชิ้นส่วนในสนามแม่เหล็ก
      ดังนั้นอย่าโทษตัวเองมากเกินไป และผ่อนปรนกับตัวเองมากขึ้นก็ได้
  • หลังจากลองทั้งเกมนี้และคอร์ส Nand2Tetris แล้ว ถึงเพิ่งรู้ว่าทั้งสองอย่างอิมพลีเมนต์คอมพิวเตอร์เครื่องเดียวกัน
    เกมนี้เป็นเวอร์ชันกราฟิกแบบอินเทอร์แอ็กทีฟ ส่วน Nand2Tetris ดั้งเดิมใช้วิธีเขียนเป็น HDL แบบข้อความ แทนที่จะคลิกแล้วลากการเชื่อมต่อระหว่างลอจิกเกต
    ทั้งคู่สนุกและให้ความรู้ แต่ NandGame สนุกกว่า
    อย่างไรก็ตาม ควรรู้ความเชื่อมโยงของทั้งสองไว้ เพราะหลังจบ NandGame แล้วสามารถต่อไปยังงานถัดไปของ Nand2Tetris คือการทำซอฟต์แวร์คอมพิวเตอร์ในชั้นที่สูงขึ้นได้ และยังช่วยให้แชร์ประสบการณ์กับเนื้อหากับคนที่เคยทำอีกเวอร์ชันได้ง่ายขึ้นด้วย

    • ผมเคยลอง nand2tetris และถึงแม้ตอนมหาวิทยาลัยจะทำวิชาฮาร์ดแวร์ได้ค่อนข้างดี แต่คอร์สกับหนังสือนี้ก็ให้ความรู้สึกเหมือน “วาดนกฮูกที่เหลือให้เสร็จ” มากกว่า
      เพื่อทำการบ้าน ต้องกลับไปค้นตำรามหาวิทยาลัยกับข้อสอบเก่า ๆ และผมก็ยอมแพ้แถว ๆ จุดที่ต้องทำส่วนสำคัญของ CPU ให้เกือบเสร็จ
      พูดตามตรง ผมรู้สึกว่าบทบรรยายกับตัวบทขาดไปมาก และไม่รู้ว่านี่เป็นเรื่องปกติในยุคอินเทอร์เน็ตหรือเปล่า แต่ผมคาดหวังว่าคอร์สกับตำราจะมีความครบถ้วนในตัวเองระดับหนึ่ง
    • ยังมีซิมูเลเตอร์แบบลากแล้ววางที่เข้ากันได้กับ Nand2Tetris อย่างน้อยอีกตัวหนึ่ง
      คือ LogicSimX/Logic Simulator 2 แบบเดสก์ท็อปของ Andrew Wilkes: https://logicsimx.com/about/ https://andrew-wilkes.itch.io/logic-simulator-2
      ดูใช้ได้ แต่ผมไม่รู้จักดีพอที่จะประเมินอย่างจริงจัง
  • ประเด็นชวนคิดคือ หากตัดส่วนที่ต้องสร้าง NAND gate จริง ๆ ในขั้นแรกออกไป เมื่อทำกระบวนการนี้จนจบ สุดท้ายจะได้รูปแบบที่คล้ายกับ โครงข่ายประสาทเทียม มาก
    การแทน NAND gate หนึ่งตัวต้องใช้ neuron 2 ตัว และดูเหมือนโครงสร้างที่มีชั้นลึก n ชั้น มีค่า 0 จำนวนมากในเมทริกซ์น้ำหนัก และมีพื้นที่จัดเก็บเล็กน้อย
    คำถามคือ เมื่อให้มาเฉพาะความหมายของอินพุต/เอาต์พุตในระดับ assembly จะฝึกโครงข่ายประสาทเทียมเปล่า ๆ ให้กลายเป็นโครงสร้างแบบนี้ได้ไหม? แน่นอนว่า backpropagation คงใช้ไม่ได้ แต่การค้นหาแบบมีทิศทางบางรูปแบบอาจเป็นไปได้หรือเปล่า?

    • ปีที่แล้วผมลองทำสิ่งนี้กับเพื่อน
      ลองใช้ 3-majority gate และ gate อื่น ๆ หลายแบบ แต่พอเกินหนึ่งชั้นแล้ว backpropagation ทำงานได้ไม่ดี น่าจะเพราะความละเอียดระดับบิตไม่พอ
      ปัญหา “การฝึกโดยไม่ใช้ backpropagation” จริง ๆ แล้วค่อนข้างยาก และสุดท้ายก็ยอมแพ้
      มีวิธีดี ๆ ในการฝึกโครงข่ายประสาทเทียมโดยไม่ใช้ backpropagation ไหม? ดูเหมือนว่าจะมีคอขวดของข้อมูลอยู่บ้าง แต่การประเมิน mutual information โดยไม่ใช้โครงข่ายประสาทเทียมนั้นทำได้ยาก
    • เมื่อหลายสิบปีก่อน การทดลอง โครงข่ายประสาทเทียม ในยุคแรก ๆ บางส่วนมีเป้าหมายเพื่อแสดงให้เห็นว่าสามารถสร้างแบบจำลองของ logic gate ได้สำเร็จ
  • ผมไม่มีประสบการณ์ด้านนี้เลย เลยอยากให้ช่วยอธิบายว่าแต่ละส่วนประกอบทำอะไร
    ไม่รู้ว่า relay ทำอะไร และไม่รู้ว่า c กับ in คืออะไร
    ยังสับสนด้วยว่าทำไมถึงมีแหล่งจ่ายไฟแยกอยู่แล้ว แต่ถ้าเชื่อม a หรือ b เข้ากับแหล่งจ่ายไฟแล้วเปิด แค่นั้นก็เหมือนมีไฟเข้าได้อย่างไร

    • relay คือ สวิตช์ที่ควบคุมด้วยไฟฟ้า
      เมื่อจ่ายไฟให้คอยล์ (c) สถานะของสวิตช์จะเปลี่ยนจากสถานะปกติไปเป็นสถานะตรงข้าม
      สวิตช์แบบปกติเปิดให้ผ่านจะส่งค่า in ไปยังเอาต์พุตเมื่อ c = 0 แต่ถ้า c = 1 คอยล์จะได้รับไฟ ทำให้สวิตช์เปิดวงจรหรือดับ
      สวิตช์แบบปกติปิดให้ผ่านจะทำงานตรงกันข้าม
      c คือคอยล์ และเมื่อมีไฟเข้าก็จะสลับสถานะสวิตช์
      in คือค่าที่ผ่านไปเมื่อสวิตช์ปิดวงจรอยู่ ในที่นี้คือ 1 หรือ 0
      แหล่งจ่ายไฟแยกจำเป็นเพื่อให้ได้ค่า 1 โดยไม่ขึ้นกับอินพุตทั้งสองค่า
      ตัวอย่างเช่น หากต้องการให้เอาต์พุตเป็น 1 เสมอเมื่ออินพุตทั้งสองเป็น 0 ก็ต้องมีค่าสูงให้ดึงขึ้นมา ซึ่งแหล่งจ่ายไฟทำหน้าที่นั้น
    • C น่าจะเป็น C ของ coil หรือ control
      relay คือสวิตช์เชิงกลที่ควบคุมด้วยแม่เหล็กไฟฟ้าซึ่งทำจากคอยล์พันรอบแกนเหล็ก
      เมื่อมีกระแสไหลผ่านคอยล์ มันจะดึงสปริงโลหะ และผลที่ได้คือทำให้กระแสไหลจาก in ไปยังเอาต์พุตได้ หรือในทางกลับกันก็ตัดกระแสนั้นได้
      ชิ้นส่วน relay สองชนิดที่ให้มานั้นแสดงการทำงานสองแบบนี้พอดี
  • เจ๋งมาก แนะนำให้ทุกคนลองไปดูหรือเล่น MHRD ด้วย
    https://store.steampowered.com/app/576030/MHRD/

  • ดูเท่ดี เสียดายที่ทำตามหนังสือจนจบไม่ได้ และอยากลองทำสิ่งนี้ให้มากขึ้น