Putting the “You” in CPU - คู่มืออธิบายวิธีที่ CPU รันโปรแกรม เขียนโดยวัย 17 ปี
(github.com/hackclub)- เป็นบทความอธิบายเชิงเทคนิคว่าคอมพิวเตอร์รันโปรแกรมตั้งแต่ต้นจนจบอย่างไร โดยมุ่งช่วยให้เข้าใจว่าคอมพิวเตอร์ทำงานอย่างไรตั้งแต่การเริ่มต้นระบบไปจนถึงการรันโปรแกรม
- เริ่มต้นจากคำถามว่าในตอนที่รันโปรแกรมจริง ๆ แล้วเกิดอะไรขึ้น โปรแกรมถูกรันโดยตรงบน CPU หรือไม่, syscalls คืออะไรและทำงานอย่างไร, และหลายโปรแกรมรันพร้อมกันได้อย่างไร
- เบื้องหลังของบทความนี้คือความตระหนักว่าหากไม่ได้เรียนมหาวิทยาลัย แหล่งข้อมูลด้านระบบที่ครอบคลุมมีไม่มากนัก จึงต้องไล่อ่านหลายแหล่งที่คุณภาพต่างกันและบางครั้งก็ขัดแย้งกัน
- จากการค้นคว้าหลายสัปดาห์และโน้ตยาวเกือบ 40 หน้า ผู้เขียนตั้งใจรวบรวมสิ่งที่ได้เรียนรู้ให้เป็นบทความชิ้นเดียวที่แน่นและอ่านเข้าใจง่าย
- สำหรับผู้อ่านที่อยากอ่านแบบรวดเร็วหรือรู้สึกว่ารู้อยู่แล้ว มีลิงก์ Chapter 3: How to Run a Program แยกไว้ให้
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
สวัสดีค่ะ! ฉันชื่อ Lexi เป็นคนเขียนบทความ/มินิบุ๊กนี้เอง
มีคำถามคลาสสิกว่า “เกิดอะไรขึ้นเมื่อเปิดเว็บไซต์?” แต่ฉันสงสัยมาตลอดว่า “เกิดอะไรขึ้นเมื่อรันโปรแกรม?” ราว 3 เดือนก่อน ฉันรู้สึกหงุดหงิดมากที่ตัวเองตอบคำถามนั้นไม่ได้ เลยตัดสินใจศึกษาเอง
สิ่งที่ฉันรู้เกี่ยวกับการเขียนโปรแกรมทั้งหมดเรียนรู้ด้วยตัวเอง ก็เลยคิดว่าเรื่องนี้น่าจะง่ายเหมือนกัน แต่ไม่ใช่เลย แหล่งข้อมูลออนไลน์เกี่ยวกับวิธีการทำงานของระบบปฏิบัติการและ CPU ส่วนใหญ่แย่มาก และตัวข้อมูลเองก็มีน้อยมากด้วย ระหว่างศึกษา ฉันจึงคิดว่าควรทำแหล่งข้อมูลดี ๆ ขึ้นมาเอง พอจัดระเบียบสิ่งที่เรียนรู้ไปเรื่อย ๆ ก็กลายเป็น Google Doc ยาว 60 หน้า และฉันก็เริ่มเขียนจากตรงนั้น
แต่พอเขียนไปก็พบว่าส่วนใหญ่ของเอกสารขนาดมหึมานั้นผิด เลยต้องค้นคว้าเพิ่มเติม แก้ซ้ำไปซ้ำมา คุณภาพของข้อมูลบนอินเทอร์เน็ตก็ยังแย่อยู่ ฉันจึงต้องทำให้บทความดีขึ้นอีก จำเป็นต้องมีภาพประกอบและไดอะแกรมด้วย แต่ฉันวาดรูปไม่เป็น เลยเปิด Figma มาลองผิดลองถูก และวาดบางส่วนด้วยแท็บเล็ต Wacom ที่ได้มาจากแฮกกาธอน
ผ่านมาราว 3 เดือน ตอนนี้ฉันได้ผลงานที่ภูมิใจมากจริง ๆ ฉันดีใจที่ได้แชร์ฉบับสมบูรณ์ของ Putting the "You" in CPU รวมถึงภาพประกอบเก้ ๆ กัง ๆ ด้วย งานนี้ทำขึ้นเป็นส่วนหนึ่งของ Hack Club(https://hackclub.com) ซึ่งเป็นชุมชนของนักเรียนมัธยมที่ชอบคอมพิวเตอร์
เมื่อไม่กี่สัปดาห์ก่อน เวอร์ชันที่ยังทำไม่เสร็จบังเอิญได้รับความสนใจบน HN และฉันรู้สึกขอบคุณมากสำหรับฟีดแบ็กที่ได้รับ หลังจากนั้นฉันจัดระเบียบและปรับแก้อีกค่อนข้างมาก และตอนนี้ก็พอใจกับมันมากพอที่จะนำมาแชร์ต่อโลกด้วยตัวเองแล้ว
เว็บไซต์เป็นโปรเจกต์ HTML/CSS แบบ static และฉันเขียนเองทั้งหมดตั้งแต่ต้น โดยเฉพาะคอมโพเนนต์นำทางที่ฉันชอบมาก หวังว่าจะอ่านกันอย่างสนุก และหวังว่าจะเป็นแหล่งข้อมูลที่ทุกคนใช้เรียนรู้ได้
การเขียนแหล่งข้อมูลแบบนี้ตอนเรียนรู้เรื่องใหม่ด้วยตัวเองเป็นวิธีที่ดีมาก มันช่วยทำให้กระบวนการคิดชัดเจนขึ้น และช่วยให้เจอส่วนที่ตอนแรกคิดว่าเข้าใจแล้ว แต่จริง ๆ ยังคลุมเครืออยู่
ผมชอบประโยคท้าย ๆ นี้ด้วย: “ระหว่างเขียนบทความนี้ ฉันคุยกับ GPT-3.5 และ GPT-4 ค่อนข้างเยอะ มันโกหกเยอะมากและข้อมูลส่วนใหญ่ก็ใช้ไม่ได้ แต่บางครั้งก็ช่วยได้มากในการแก้ปัญหา ถ้ารู้ข้อจำกัดของ LLM และสงสัยทุกอย่างที่มันพูดอย่างสุด ๆ ผลรวมของความช่วยเหลืออาจเป็นบวกได้ แต่การเขียนของมันแย่มาก อย่าให้มันเขียนแทน” เป็นโปรเจกต์ที่ยอดเยี่ยม
เช่น ในบริบทอย่าง “CPU รับผิดชอบการคำนวณทั้งหมด เป็นพี่ใหญ่ เป็นชาซาม อะลาคาบแลม…” ถ้าตัดประโยคเล่น ๆ ออก แล้วเขียนว่า “CPU รับผิดชอบการคำนวณทั้งหมด ตั้งแต่วินาทีที่คุณเปิดคอมพิวเตอร์ มันจะเริ่มทำคำสั่งทีละคำสั่ง” จะอ่านได้ลื่นกว่ามาก
ผมไม่ใช่คนที่ลึกทางเทคนิคมากนัก แต่ในฐานะคนที่ได้ค่าจ้างจากการเขียน ผมมองแบบนั้น ตัวงานเองยอดเยี่ยมมาก ทำต่อไปนะ
หัวข้อแบบนี้มักถูกครอบคลุมอย่างดีในวิชา สถาปัตยกรรมคอมพิวเตอร์ และระบบปฏิบัติการระดับปริญญาตรี ทุกวันนี้มันไม่ค่อยเป็นกระแสแล้ว เลยกลายเป็นวิชาเลือกเป็นส่วนใหญ่ก็จริง
มหาวิทยาลัยหลายแห่งเปิดคอร์สฟรี และก็มีหนังสือที่อาจารย์ในสาขานี้เขียนไว้ด้วย ถ้าอยากตามให้ใกล้กับแนวโน้มล่าสุดมากขึ้น งานบรรยายในคอนเฟอเรนซ์สายเทคนิคที่เกี่ยวข้องก็มีประโยชน์ไม่น้อย
ถึงอย่างนั้น การสอนก็เป็นศิลปะที่ถูกประเมินค่าต่ำไป และการทำให้ข้อมูลเข้าถึงได้ง่ายขึ้น หรือทำให้น่าสนุกและโต้ตอบได้มากขึ้น ก็มีคุณค่าอย่างชัดเจน
ผมเคยทำงานเป็นวิศวกรวิจัย ในกรณีของผมคือเป็นวิศวกรซอฟต์แวร์ที่ทำวิจัยด้านความปลอดภัยคอมพิวเตอร์ในแล็บมหาวิทยาลัย อย่างที่อีกคอมเมนต์บอกว่าวิชาระบบปฏิบัติการเป็นวิชาเลือก แม้แต่นักศึกษาบัณฑิตศึกษาบางคนก็ยังไม่มีความเข้าใจระบบปฏิบัติการในระดับนี้
ข้อมูลดี ๆ หาได้ยากก็จริง แต่มีอยู่แน่นอน การที่คุณรวบรวมข้อมูลที่หายากให้กลายเป็นรูปแบบที่ดีกว่าได้ก็คือหลักฐานของเรื่องนั้น ปริญญาของผมเป็นคณิตศาสตร์ แต่ความรู้ด้านคอมพิวติ้งผมเรียนเอง ความสามารถในการเรียนรู้แบบนี้และการถ่ายทอดข้อมูลเชิงเทคนิคขั้นสูงให้เข้าถึงได้ง่ายนั้นสำคัญจริง ๆ และไม่ควรถูกประเมินค่าต่ำ
ขอแชร์ลิงก์แค่สองลิงก์ ไม่อย่างนั้นคงยาวไม่รู้จบ ลิงก์แรกคือ https://git.lain.faith/sys64738/airs-notes.git และสารบัญส่วน linker https://lwn.net/Articles/276782/ ถ้าแค่แตะผิวของ ELF และการลิงก์ ซีรีส์บล็อก 20 ตอนของ Ian Lance Taylor พร้อมหัวข้อเพิ่มเติมก็ครอบคลุมแทบทุกอย่างที่คุณอยากรู้เกี่ยวกับ ELF รวมถึงเนื้อหาที่ทำให้คุณเริ่มสงสัยว่าคำสั่งต่าง ๆ มันทำงานได้อย่างไรกันแน่ นอกจากนี้ยังกล่าวถึง DWARF คู่หูของ ELF แบบสั้น ๆ ซึ่งเป็น virtual machine ที่ถูกใช้ทุกครั้งที่เกิด exception ใน C++ ด้วย
ลิงก์ที่สอง https://0xax.gitbooks.io/linux-insides/content/ ก็เป็นโปรเจกต์ที่ยอดเยี่ยมเช่นกัน มันไล่ตามอย่างอ่านเข้าใจง่ายว่า Linux kernel ทำสิ่งต่าง ๆ อย่างไร เกือบจะแน่นอนว่าเคยถูกแชร์บน HN แล้ว
เขียนได้ดีมาก และขอชื่นชมที่ ขุดลึก ในหัวข้อนี้
เด็กอายุ 17 สมัยนี้อาจ “เขียนโปรแกรม” ด้วยการเอาสิ่งที่ตัวเองยังไม่เข้าใจมาประกอบกันแล้วก็ยังพอผ่านไปได้ระดับหนึ่ง แต่สุดท้ายผมคิดว่ามันจะไปชนเพดานอยู่ดี ดังนั้นสิ่งที่คุณกำลังทำอยู่ตอนนี้จึงมีคุณค่ามากจริง ๆ ทั้งต่อตัวคุณเองและต่อทุกคนที่จะได้เรียนรู้จากเนื้อหานี้
ทำได้ดีมาก :) ถ้ายังไม่เคยลอง ตอนนี้ลองใช้ อีมูเลเตอร์ ดูครับ สนุกสุด ๆ
ถ้า “สักวันจะไปชนเพดาน” จริง ๆ ก็อยากรู้เหมือนกันว่าจะเกิดขึ้นเร็ว ๆ นี้ไหม
ผมสร้างเฟรมเวิร์ก MVC ตั้งแต่ศูนย์ สร้างทั้งอินเทอร์พรีเตอร์และคอมไพเลอร์ และยังเคยพยายามคิดค้นแมชชีนเลิร์นนิงกับการประมวลผลภาษาธรรมชาติขึ้นมาใหม่เองตั้งแต่ศูนย์โดยไม่ตั้งใจด้วย ทำอะไรเจ๋ง ๆ และสนุก ๆ สารพัด
แล้วผมก็ได้ค้นพบเรื่องเงินและเทคโนโลยีที่มีมาก่อนแล้ว การยอมรับสิ่งที่คนอื่นบอกว่า “ก็แค่ใช้อันนี้ก็พอ” ทำให้สร้างอะไรได้เร็วขึ้นมาก เฟรมเวิร์กก็เช่นกัน น่าทึ่งมากที่ jQuery ทำให้ชีวิตง่ายขึ้นได้ขนาดนี้
หลายปีผ่านไป ตอนนี้สิ่งที่เมื่อก่อนดูเหมือน “แค่เอามาต่อ ๆ กัน” กลับถูกมองว่าเป็น “งานขั้นสูงในระดับต่ำมาก” เพราะเราได้สร้าง abstraction ใหม่ ๆ ซ้อนขึ้นไปบน abstraction เหล่านั้นอีกที
สิ่งที่มือใหม่ในตอนนี้ “พอทำให้สำเร็จได้” จะกลายเป็นเขตอันตรายระดับต่ำสำหรับคนรุ่นต่อไป การเขียนโปรแกรมยอดเยี่ยมก็ตรงนี้แหละ
ตรงกันข้าม คนที่เข้าหาการเขียนโปรแกรมในเชิงวิชาการอาจมีแนวโน้มจะถูกงานที่ต้องเข้าใจเทคโนโลยีหลายอย่างในระดับพื้นฐานแล้วเดินหน้าต่อกดทับจนทำอะไรไม่ถูกมากกว่า
ถ้าอยู่ในบริษัทยักษ์ใหญ่ที่มีผู้จัดการโปรเจกต์กับดีไซเนอร์ช่วยตีกรอบสเปกให้แคบลงจนคุณโฟกัสแค่การลงมือทำได้ก็คงอีกเรื่อง แต่สำหรับคนส่วนใหญ่ นั่นเป็นสถานการณ์ที่พบได้ยาก
จำได้แต่ไดโนเสาร์บนปก เลยต้องกลับไปค้นชื่อหนังสือใหม่
ขอแสดงความยินดีที่ทำคู่มือนี้สำเร็จ
ถ้าไม่ได้เข้ามหาวิทยาลัย จะเห็นได้ว่าต้องไปคุ้ยหาเอกสารด้านระบบแบบครอบคลุมจำนวนมาก ซึ่งคุณภาพก็ไม่สม่ำเสมอและบางครั้งก็ขัดแย้งกันเอง
แหล่งข้อมูลที่ดีที่สุดเท่าที่หาได้คือ Code: The Hidden Language of Computer Hardware and Software ของ Charles Petzold ครับ ฉบับพิมพ์ครั้งที่ 2 เพิ่งออกมา
https://codehiddenlanguage.com/
https://mitpress.mit.edu/9780262539807/the-elements-of-compu...
https://www.nand2tetris.org/
มันพาคุณจาก NAND gate ไปจนถึง function call ได้อย่างยอดเยี่ยม และดำเนินไปในรูปแบบโต้ตอบที่สนุกมาก แทนที่จะอ่านแล้วจินตนาการในหัวว่ามันทำงานอย่างไร คุณจะได้สร้างมันเอง
ผมถึงกับสร้าง SIMD/GPU ขนาดเล็กที่ขับ LED matrix ด้วย assembly ของ CPU ที่ผมออกแบบเองและภาษา programmable shader ของผมเอง
ตอนซื้อเมื่อ 15 ปีก่อน พอถึงส่วนสถาปัตยกรรม CPU ผมอ่านแล้วตาลายไปหมด แต่ตอนนี้อาจพร้อมแล้วก็ได้ ผมเพิ่งซื้อฉบับพิมพ์ครั้งที่ 2 มาด้วย
เป็นบทความที่ผมเก็บไว้ในรายการอ่านครับ ก่อนหน้านี้รายละเอียดเล็ก ๆ อย่างหนึ่งทำให้ผมประทับใจ
“เราใส่พื้นที่ว่างไว้ด้านล่างของทุกหน้า เพื่อให้ผู้อ่านรักษา ระดับสายตาที่สม่ำเสมอ ได้”
เป็นรายละเอียดที่เล็กมาก และเมื่อมองย้อนกลับไปก็ดูชัดเจนว่าควรเป็นแบบนั้น แต่กลับทำให้อ่านสบายอย่างคาดไม่ถึง ตอนที่สังเกตเห็นจุดนั้น ผมรู้เลยว่านี่เป็นโปรเจกต์ที่ทำด้วยแพสชัน
ดูเหมือนเขาคิดเยอะมากว่าจะนำเสนอหนังสือบนเว็บอย่างไร และสร้างธรรมเนียมใหม่ ๆ แบบที่คาดหวังได้จากคนรุ่นใหม่ขึ้นมา เช่น วิธีที่บทก่อนหน้า/บทถัดไปแสดงแบบโปร่งแสงเล็กน้อยในวิดเจ็ตนำทางบทด้านบน ผมไม่เคยเห็นมาก่อนเลย
ผมเกือบ 40 แล้ว แต่ไม่เคยทำอะไรแบบนี้สำเร็จเลย กำลังจะปลอบ ภาวะแอบอ้าง ของตัวเองอยู่พอดี คงต้องปลอบเพิ่มอีกหน่อย
ทำได้ดีมากจริง ๆ :p
คุณยังมีเวลาเหลืออีกมาก และก็แทบไม่มีเหตุผลต้องรีบร้อน เลือกไอเดียสักอย่างที่จุดประกายให้คุณ แล้วค่อย ๆ ทำไปในเวลาว่างเล็ก ๆ น้อย ๆ เท่าที่มี
หัวใจสำคัญน่าจะอยู่ที่การรู้สึกภูมิใจในตัวเองที่ได้ทำสิ่งนั้น ส่วนผลงานสุดท้ายก็จะตามมาเอง
OP อย่าเอาอายุมาเป็นข้อแก้ตัวให้งานของคุณเลย บทความนี้ดีกว่าสิ่งที่คนส่วนใหญ่จะทำได้ตลอดชีวิตเสียอีก งานยอดเยี่ยมมาก
newมีเต็มไปหมด เขาเลือกใช้อายุเป็นองค์ประกอบทางการตลาด และมันก็ได้ผลชัดเจนถ้าสร้างคอนเทนต์แบบนี้ได้ตอนอายุ 17 ก็จินตนาการไม่ออกเลยว่าเขาจะทำเรื่องน่าทึ่งอะไรได้อีกเมื่อเลือกสายนี้เป็นอาชีพ สุดยอดจริง ๆ
ผมไม่อยากให้จิตวิญญาณของเขาถูกบดขยี้ด้วยงานบริหารจุกจิก เป้าหมายองค์กรที่ยิ่งจุกจิกกว่าเดิม และการเติบโตในอาชีพที่ไร้ความหมาย เขากำลังทำสิ่งที่ยอดเยี่ยมอยู่แล้วตอนนี้ เลยอยากให้มีอะไรอย่าง fellowship ที่ช่วยให้เขาทำต่อไปได้โดยไม่ต้องเอาจิตวิญญาณไปปั่นอยู่ในวงล้อหนูแฮมสเตอร์ของวงการเทคโนโลยี
OP น่าจะลองดูคอร์สของ Casey Muratori ที่ computerenhance.com
แบบฝึกหัดช่วงแรกของคอร์สคือการสร้างซิมูเลเตอร์ Intel 8086 ปี 1978 และ x86_64 assembly ยุคใหม่ก็ยังค่อนข้างคล้ายกับมันอยู่ คุณจะได้เรียนรู้ความรู้ด้านคอมพิวเตอร์มากมายที่หาได้ยากจริง ๆ จากที่อื่น
ในฐานะคนที่ก็เกือบอายุ 17 เหมือนกัน ทำได้ดีมากครับ! :^)
แค่ 20 นาทีก่อน ผมยังเพิ่งรู้จัก endianness ตอนกำลังหาวิธีดึงไบต์แรกของจำนวนเต็ม 16 บิตอยู่เลย แต่คุณกำลังเขียนหนังสือทั้งเล่มเกี่ยวกับ CPU แล้ว
พออ่าน Crafting Interpreters จบแล้ว ผมจะอ่านแน่นอนครับ แต่อาจต้องใช้เวลาหน่อย เพราะเหมือนโปรเจกต์อื่น ๆ อีกมากมาย ความคืบหน้ามันช้าลงอย่างเห็นได้ชัด lol
เป็นบทความที่ดีมาก และผมก็ชอบสไตล์ด้วย การผสมผสานระหว่างบทความกับภาพประกอบ/มีมนั้นสนุกจริง ๆ
ส่วนเรื่อง คำศัพท์ RISC/CISC ผมขอสงวนท่าทีไว้นิดหน่อย แต่นั่นอาจเป็นเรื่องรสนิยมของแต่ละคนก็ได้ >.>
ในฐานะคนที่เคยใช้เวลาไปกับการหาว่าส่วนต่าง ๆ ของเคอร์เนลทำงานอย่างไร ผมเข้าใจเลยว่ากระบวนการทำบทความนี้คงเจ็บปวดแค่ไหน แต่ดูจากบทความแล้วก็คุ้มค่าอย่างยิ่ง
ฝั่ง NT นั้น Windows Internals ครอบคลุมเรื่องที่อยากรู้ไว้มาก และเอกสารของ Microsoft ก็ไม่แย่เลย สำหรับผมถือว่าดีกว่าเอกสารเคอร์เนล Linux อย่างชัดเจน และเป็นจุดเริ่มต้นที่ดีมาก
ถ้าอยากรู้เกี่ยวกับ Windows มากขึ้น ผมแนะนำฟอรัม/แหล่งข้อมูลสายเกมแฮ็กกิงด้วย มีหลายอย่างที่ต้องคัดกรองออก แต่ในหัวข้อเฉพาะทางบางอย่าง ก็เป็นแหล่งข้อมูลที่ดีทีเดียว
สุดท้าย ตอนดูบนสมาร์ตโฟน ฟอนต์ของโค้ดบล็อกบางส่วนค่อนข้างใหญ่จนอ่านยาก เช่น บทที่ 6
main.cอีกอย่าง ประโยคที่ว่า “ถ้าคุณเป็นวัยรุ่นที่ชอบคอมพิวเตอร์และยังไม่ได้อยู่ใน Hack Club Slack ให้เข้าร่วมตอนนี้เลย” ทำให้ผมนึกขึ้นมาได้ชัดเจนเกินไปว่าตัวเองกำลังแก่ลง lol