CS 6120: คอร์สออนไลน์แบบเรียนด้วยตนเองด้านคอมไพเลอร์ขั้นสูง (2020)
(cs.cornell.edu)- CS 6120 ซึ่งเป็นวิชาระดับปริญญาเอกของ Cornell CS มอบเส้นทางการเรียนแบบเป็นระบบสำหรับผู้ที่ต้องการศึกษาคอมไพเลอร์และการอิมพลีเมนต์ภาษาโปรแกรม ตั้งแต่การแทนโค้ดระดับกลาง, data flow, การปรับแต่งประสิทธิภาพ, การทำงานขนาน, JIT ไปจนถึง garbage collection
- เวอร์ชันเรียนด้วยตนเองมีรูปแบบเหมือนลงเรียนในมหาวิทยาลัยสมมติแบบ 4 หน่วยกิต ไม่ให้เกรด โดยให้ผู้เรียนตามตารางเชิงเส้นที่ประกอบด้วยวิดีโอ, โน้ตประกอบ, การอ่านเปเปอร์ และงานอิมพลีเมนต์
- ภาคปฏิบัติใช้ LLVM และ Bril ซึ่งเป็น IR เพื่อการเรียนการสอน เพื่อให้ผู้เรียนได้ยืนยันความเข้าใจแนวคิดคอมไพเลอร์เชิงนามธรรมผ่านการเขียนโค้ดจริง
- ต่างจากคลาส Cornell จริงตรงที่สามารถไม่สนใจกำหนดส่งงานได้ แต่จะเข้าร่วมการสนทนาใน Zulip ไม่ได้ และแทนที่จะมีโปรเจ็กต์ปลายภาคก็จะมีงานสุดท้ายเฉพาะของเวอร์ชันเรียนด้วยตนเอง
- สื่อการเรียนของคอร์สเปิดเผยเป็น โอเพนซอร์ส บน GitHub จึงสามารถรายงานปัญหาได้ และหลังเรียนจบยังส่งข้อเสนอแนะเพื่อปรับปรุงผ่านฟอร์ม feedback ได้
โครงสร้างคอร์สและรูปแบบการเรียน
- CS 6120 เป็นวิชาว่าด้วยการอิมพลีเมนต์ภาษาโปรแกรมที่สร้างโดย Adrian Sampson จาก Cornell CS
- ครอบคลุมทั้งหัวข้อพื้นฐานของคอมไพเลอร์ทั่วไปและหัวข้อเชิงวิจัย
- การแทนโค้ดระดับกลาง
- data flow
- การปรับแต่งประสิทธิภาพแบบคลาสสิก
- การทำงานขนาน
- JIT compilation
- garbage collection
- การเรียนต่อยอดไปสู่การอ่านเปเปอร์และงานโอเพนซอร์สแฮ็กกิง
- หลักสูตรแบบเรียนด้วยตนเองจัดเป็น ตารางเชิงเส้น ที่ผสมการดูวิดีโอและการอ่านเปเปอร์เข้าด้วยกัน
- บางบทเรียนมี งานอิมพลีเมนต์ รวมอยู่ด้วย เพื่อให้เรียนรู้แนวคิดเชิงนามธรรมผ่านการเขียนโค้ดแบบปลายเปิด
- มีความแตกต่างระหว่าง CS 6120 แบบเรียนจริงกับเวอร์ชันเรียนด้วยตนเอง
- สามารถไม่สนใจกำหนดส่งงานได้
- ไม่สามารถเข้าร่วมเธรดสนทนาใน Zulip ได้
- วิชาแบบเรียนจริงมีโปรเจ็กต์ปลายภาค
- งานปลายภาคของเวอร์ชันเรียนด้วยตนเองคือ “เปลี่ยนโลกด้วยเวทมนตร์ของคอมไพเลอร์”
- คอร์สนี้เปิดเป็น โอเพนซอร์สบน GitHub จึงสามารถรายงานบั๊กได้หากพบปัญหา
- หลังเรียนจบสามารถกรอก ฟอร์ม feedback ได้
ลำดับบทเรียนและสื่ออ่านประกอบ
-
บทนำและการแทนโปรแกรม
-
พื้นฐานของการวิเคราะห์และการปรับแต่งประสิทธิภาพ
-
LLVM กับลูปและการวิเคราะห์ข้ามโปรซีเยอร์
-
การจัดการหน่วยความจำและคอมไพเลอร์แบบไดนามิก
-
ความขนานและคอมไพเลอร์ความเร็วสูง
- Lesson 13: Concurrency & Parallelism
- Lesson 14: Fast Compilers
- มีเพียงชื่อเรื่องอยู่ในรายการ
1 ความคิดเห็น
ความคิดเห็นใน Hacker News
ส่วนของคอมไพเลอร์แบบไดนามิกนั้นแทบทั้งหมดใกล้เคียงกับเนื้อหาเรื่อง trace compilation มากกว่า โดยทั่วไปแล้ว trace compilation เป็นทางตันและถูกทอดทิ้งมาหลายครั้งแล้ว
สิ่งที่สำคัญกว่าสำหรับตรงนี้น่าจะเป็นแนวคิดเรื่อง type feedback, speculative execution กับ deoptimization, fast compiler และการทำงานแบบเป็นชั้น
โดยรวมคอร์สดูน่าสนใจมาก และการที่มีการเผยแพร่วัสดุออนไลน์จำนวนมากแบบนี้ก็ยอดเยี่ยมด้วย
อย่างที่พูดไป อยากให้มีบริบทเพิ่มขึ้นอีกหน่อยเกี่ยวกับ สิ่งที่ใช้งานได้ผลจริง ในภาคอุตสาหกรรม
แต่พื้นที่นี้อาจค่อนข้างแคบ และก็แตกต่างจากคอมไพเลอร์แบบดั้งเดิมมาก ดังนั้นถ้าดูบางอย่างที่เราทำอยู่ คุณอาจรู้สึกขัดใจพอสมควรก็ได้
แน่นอนว่าผมรู้ว่าพื้นที่ปัญหาของมันต่างจาก TraceMonkey หรือ LuaJIT แบบสุดขั้ว
ตอนนั้นผมได้คุยกับนักพัฒนาคนหนึ่ง น่าจะเป็น Jason Orendorff เขาบอกว่า tracing มักไปไม่ค่อยรอด แต่ก็คิดว่าอาจใช้ได้ในเงื่อนไขที่จำกัดบางอย่าง
เพียงแต่ผมลืมไปหมดแล้วว่าเงื่อนไขนั้นคืออะไร
LuaJIT ใช้งานได้ดีแม้กับโปรแกรมขนาดใหญ่ รวมถึงบนเซิร์ฟเวอร์และอุปกรณ์นับร้อยล้านเครื่อง
น่าเสียดายจริง ๆ ที่แม้แต่นักวิชาการก็ยังชอบพูดประโยคสำเร็จรูปนี้ซ้ำไปซ้ำมา ทำให้นึกถึงคำพูดที่ว่าไม่รู้อะไรเลยกลับสบายกว่า
โพสต์ที่เกี่ยวข้องก่อนหน้านี้:
CS 6120: Advanced Compilers: The Self-Guided Online Course - https://news.ycombinator.com/item?id=39577878 - มีนาคม 2024, ความคิดเห็น 102 รายการ
Advanced Compilers: Self-Guided Online Course - https://news.ycombinator.com/item?id=35130975 - มีนาคม 2023, ความคิดเห็น 82 รายการ
Advanced Compilers: Self-Guided Online Course - https://news.ycombinator.com/item?id=25386756 - ธันวาคม 2020, ความคิดเห็น 232 รายการ
ผมค่อนข้างงงว่าทำไมคอร์สนี้ถึงเป็น ขั้นสูง เพราะหัวข้อส่วนใหญ่ เช่น dead code elimination, data flow, dominator analysis และ SSA form ดูเหมือนจะเป็นสิ่งที่อยู่ในวิชาคอมไพเลอร์ตัวแรกด้วยซ้ำ
สรุปสั้น ๆ คือวิชาคอมไพเลอร์จริง ๆ แล้วแบ่งเป็นสองวิชา โดยวิชาแรกครอบคลุมองค์ประกอบขั้นต่ำในการสร้างคอมไพเลอร์ ได้แก่ lexical analysis, parsing, code generation และ register allocation
ส่วนวิชาที่สองว่าด้วยการสร้าง optimizing compiler
ไม่ว่าจะเป็นคอมไพเลอร์หรืออินเทอร์พรีเตอร์ ส่วน backend ในทางปฏิบัติเกือบตลอดเวลามักถูกทิ้งไว้เป็น “แบบฝึกหัดสำหรับผู้อ่าน”
ทั้งวิธีสร้าง closure, วิธีติดตาม environment, pattern matching, memory representation และเรื่องอื่น ๆ ที่ยังต้องไปค้นหาเองนั้นมีมากจนยากจะจินตนาการ
ของที่น่าสนใจจริง ๆ ต้องไปตามหาเองทั้งหมด
ป.ล. นี่เป็นแค่อ่านของหนึ่งปีจากทั้งหมดเท่านั้น: https://gist.githubusercontent.com/mamcx/e1743571b9a1ea163a7...
ผมอ่านหนังสืออินเทอร์พรีเตอร์กับคอมไพเลอร์มาสองเล่ม ซึ่งก็ไม่ได้พูดถึง backend มากนัก
อาจจะใกล้เคียงกับวิชาแนะนำ backend มากกว่าก็ได้
มี คอร์สวิทยาการคอมพิวเตอร์ระดับมหาวิทยาลัยแบบออนไลน์ที่เรียนเองได้ แนวนี้อีกไหม?
อาจารย์บางคนก็เผยแพร่คอร์สกับการบ้านไว้นอกกรอบ “mooc” ด้วย
ผมเคยถามคำถามในคอมเมนต์แล้วอาจารย์ก็มาตอบด้วย อินเทอร์เน็ตยังมีมุมที่เจ๋งอยู่มากทีเดียว
ถ้าเทียบกับ Writing a C compiler ของ Nora Sandler ประโยชน์ที่ผู้อ่านจะได้รับต่างกันอย่างไร?
ถ้าเป็นมือใหม่หรือคนที่สนใจศึกษาเป็นงานอดิเรก น่าจะดีกว่าถ้าเริ่มจากหนังสือเล่มนั้นหรือแหล่งข้อมูลระดับใกล้เคียงกันก่อน แล้วค่อยลองคอร์สนี้เพื่อเติมช่องว่าง
ก่อนจะเข้าสู่ระดับสูง มีคอร์สแบบเรียนด้วยตัวเองเกี่ยวกับ คอมไพเลอร์พื้นฐาน ที่ควรดูก่อนไหม?
ถ้าอยากเริ่มจากอินเทอร์พรีเตอร์ Essentials of Programming Languages [4] ก็ดี
ยอมรับว่า Crafting Interpreters เป็นที่นิยมทั้งในเว็บนี้และที่อื่น ๆ แต่ส่วนตัวไม่ค่อยชอบเท่าไร ถึงอย่างนั้นคนอื่นชอบกันมาก ก็เลยน่าลองและอ่านได้ฟรี
EOC และ EOPL ออกแนววิชาการอยู่บ้าง แต่ยกเว้นสำหรับคนที่ไม่ถูกกับ Scheme และ Racket ผมคิดว่าเข้าถึงได้ค่อนข้างง่าย เวอร์ชัน Python ของ EOC ช่วยลดปัญหานั้นลงได้
หลังจากนั้นหนังสือคอมไพเลอร์ที่ลึกและเชิงวิชาการกว่านี้ก็จะอ่านง่ายขึ้นมาก
[1] https://mitpress.mit.edu/9780262047760/essentials-of-compila... - เวอร์ชัน Racket มีฉบับเปิดให้อ่านฟรี
[2] https://mitpress.mit.edu/9780262048248/essentials-of-compila... - เวอร์ชัน Python มีฉบับเปิดให้อ่านฟรี
[3] https://nostarch.com/writing-c-compiler - เลือกภาษาในการเขียนได้
[4] https://mitpress.mit.edu/9780262062794/essentials-of-program... - เป็น Scheme แต่ใช้กับ Racket ได้
แบ่งเป็นสองส่วน ส่วนแรกสร้างอินเทอร์พรีเตอร์แบบ tree-walk ด้วย Java แล้วค่อยต่อยอดไปเป็นเวอร์ชันที่เขียนด้วย C
https://github.com/jamiebuilds/the-super-tiny-compiler
ถ้าอ่านควบคู่กับหนังสือสมัยใหม่ที่มีคนแนะนำไว้ที่นี่สักสองสามเล่มก็น่าจะเพียงพอ
David Gries - https://www.cs.cornell.edu/gries/ และ https://en.wikipedia.org/wiki/David_Gries
Dick Grune นักวิทยาการคอมพิวเตอร์ชาวดัตช์ เขียนถึง Compiler Construction for Digital Computers ว่า “ผู้สร้างคอมไพเลอร์มาหลายชั่วรุ่นเติบโตมากับหนังสือเล่มนี้ และพวกเขาไม่เคยเสียใจ”
Dick Grune เองก็มีชื่อเสียงจากหนังสือด้านคอมไพเลอร์และภาษาโปรแกรม - https://dickgrune.com/index.html และ https://en.wikipedia.org/wiki/Dick_Grune
ผมเคยดูพอดแคสต์เกี่ยวกับคอมไพเลอร์ Rust แล้วเหมือนเขาบอกว่า ณ จุดหนึ่งมีการใช้ อัลกอริทึมการเรียนรู้ของเครื่อง เพื่อตัดสินว่าโค้ดสามารถทำให้ระบบล่มได้หรือไม่
มีแหล่งอ้างอิงไหม?
สงสัยจริง ๆ ว่าช่วงนี้ alexia massalin ทำอะไรอยู่บ้าง นอกจากรับ ค่าลิขสิทธิ์สิทธิบัตร microunity