CS 6120: คอร์สออนไลน์แบบเรียนด้วยตนเองด้านคอมไพเลอร์ขั้นสูง
(cs.cornell.edu)- เป็นหลักสูตรแบบเรียนด้วยตนเองที่รวบรวมวิดีโอบรรยาย โน้ต การอ่านเปเปอร์ และงานเขียนโปรแกรมไว้ด้วยกัน เพื่อให้สามารถเรียนตามวิชา CS 6120 ระดับปริญญาเอกของ Cornell CS ได้ทางออนไลน์
- ครอบคลุมตั้งแต่ หัวข้อแกนหลักของคอมไพเลอร์ เช่น intermediate representation, data flow และการทำ optimization แบบคลาสสิก ไปจนถึง parallelization, JIT compilation และ garbage collection
- ภาคปฏิบัติใช้ LLVM และ IR เพื่อการศึกษาชื่อ Bril และต่อยอดไปสู่งานโอเพนซอร์สเชิงลงมือทำที่ให้ลองสร้างแนวคิดเชิงนามธรรมด้วยตัวเอง
- เวอร์ชันเรียนด้วยตนเองสามารถไม่ต้องสนใจกำหนดส่งได้ แต่ไม่สามารถเข้าร่วม การสนทนาใน Zulip ของคลาสจริงและโปรเจ็กต์ปลายภาคได้
- เอกสารถูกเผยแพร่เป็นโอเพนซอร์สบน GitHub จึงสามารถรายงานปัญหาได้ และหลังเรียนจบสามารถกรอกแบบฟอร์มฟีดแบ็กได้
วิธีเรียนและขอบเขตเนื้อหา
- CS 6120 เป็นวิชาด้านการสร้างภาษาการเขียนโปรแกรมของ Adrian Sampson จาก Cornell CS
- ขอบเขตของคอร์สครอบคลุมทั้งพื้นฐานร่วมของการสร้างคอมไพเลอร์และหัวข้อเชิงวิจัย
- intermediate representation
- data flow
- การทำ optimization แบบ “คลาสสิก”
- parallelization
- JIT compilation
- garbage collection
- การเรียนดำเนินไปผ่าน การอ่านเปเปอร์ และงานโอเพนซอร์สเชิงลงมือทำ
- หลักสูตรแบบเรียนด้วยตนเองถูกจัดไว้ในรูปแบบเหมือนลงวิชา 4 หน่วยกิตแบบไม่มีการให้คะแนนใน “มหาวิทยาลัยในจินตนาการ”
- บทเรียนถูกเรียงตามลำดับเชิงเส้น
- แต่ละบทมีทั้งวิดีโอและโน้ตแบบข้อความ
- บางบทมีงานเขียนโปรแกรมให้ทำ
- มีการจัดลำดับแนะนำให้สลับระหว่างการดูวิดีโอและการอ่านเปเปอร์
จุดที่ต่างจากการเรียนในคลาสจริง
- ผู้เรียนแบบเรียนด้วยตนเองสามารถไม่ต้องสนใจกำหนดส่งงานได้
- ไม่สามารถเข้าร่วม การสนทนาใน Zulip ของคลาสจริงได้
- CS 6120 เวอร์ชันที่สอนจริงมีโปรเจ็กต์ปลายภาค
- งานปลายภาคของเวอร์ชันเรียนด้วยตนเองคือ “เปลี่ยนโลกด้วยเวทมนตร์ของคอมไพเลอร์”
- คุณภาพการผลิตวิดีโออาจไม่สูงนัก โดยเฉพาะในบทเรียนช่วงแรก
- เอกสารของ CS 6120 เปิดเป็นโอเพนซอร์สบน GitHub และหากพบปัญหาก็สามารถรายงานบั๊กได้
- หลังเรียนจบสามารถกรอก แบบฟอร์มฟีดแบ็ก ได้
บทเรียนและเอกสารอ่านประกอบ
- Lesson 1: Welcome & Overview
- Lesson 2: Representing Programs
- Lesson 3: Local Analysis & Optimization
- Lesson 4: Data Flow
- Lesson 5: Global Analysis
- Lesson 6: Static Single Assignment
- Lesson 7: LLVM
- Lesson 8: Loop Optimization
- Lesson 9: Interprocedural Analysis
- Lesson 10: Alias Analysis
- video
- A Unified Theory of Garbage Collection, OOPSLA 2004
- Fast Conservative Garbage Collection, OOPSLA 2014
- Lesson 11: Memory Management
- Lesson 12: Dynamic Compilers
- Lesson 13: Program Synthesis
- Lesson 14: Concurrency & Parallelism
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ตอนที่กำลังจะจบปริญญาตรีและหางานประจำงานแรก คอร์สนี้ช่วยให้ฉันผ่านการสัมภาษณ์ทีมวิศวกรรมคอมไพเลอร์ของ MANGA(Meta, Apple, NVIDIA, Google, Amazon) ได้
หลักสูตรด้านระบบคอมพิวเตอร์ระดับล่างของ University of Waterloo ก็ยอดเยี่ยมมาก และฉันก็กำลังมีส่วนร่วมกับโครงการคอมไพเลอร์โอเพนซอร์สด้วย แต่คอร์สนี้ช่วยได้มากจริงๆ ในการตอบคำถามที่ยากที่สุดในการสัมภาษณ์
ถ้าจะเขียนให้เป็นธรรมชาติกว่านี้ น่าจะเป็นประมาณว่า “my university has the low level computing systems curriculum par excellence”
ผมคิดว่าก่อนจะเขียนคอมไพเลอร์ ควรเข้าใจ สถาปัตยกรรมคอมพิวเตอร์ ก่อน และควรรู้ว่าคอมไพเลอร์ต้องสร้างอะไรบ้างเพื่อให้ได้โค้ดเครื่องที่มีประสิทธิภาพที่สุด
แต่จากประสบการณ์ของผม ดูเหมือนโรงเรียนและมหาวิทยาลัยจะให้ความสำคัญกับสถาปัตยกรรมคอมพิวเตอร์ หรือแม้แต่การเขียนโปรแกรมระบบน้อยลงเรื่อยๆ อาจเพราะมองว่ามันเฉพาะทางเกินไป
ถึงอย่างนั้น ความรู้นี้ก็สำคัญมากต่อการได้งานดีๆ ในอุตสาหกรรม
ปัญหาพื้นฐานที่ผมเจอจากการทำงานกับมหาวิทยาลัยคือ มีเนื้อหาที่เป็นไปได้มากเกินกว่าจะสอนได้หมดภายในเวลาเรียนที่จำกัด
ปริมาณข้อมูลที่ต้องรู้ในสาขาของเราเพิ่มขึ้นแบบทวีคูณตามเวลาและเกินขีดจำกัดไปแล้ว ดังนั้นการที่หลักสูตรทั่วไปลดเวลาเรียนวิชาเขียนโปรแกรมระบบลงจึงสมเหตุสมผล เพราะมันเกี่ยวข้องกับนักศึกษาจำนวนมากน้อยลงทุกปี
ยังมีงานอีกมากที่ต้องทำในระดับคอมไพเลอร์ แต่ส่วนใหญ่ไม่ควรต้องใส่ใจถึงระดับ ไมโครสถาปัตยกรรม ของคอมพิวเตอร์
ต่อให้ไม่จำเป็นต้องเรียน x86 หรือ MIPS, CUDA ก็แสดงให้เห็นสถาปัตยกรรมที่ประหลาดยิ่งกว่านั้นอีก
เหตุผลปกติที่ไม่ได้เน้นเนื้อหาระดับล่างคือมันต่างกันไปตามการติดตั้งใช้งาน ล้าสมัยเร็ว และสรุปให้เป็นหลักทั่วไปได้ยาก
ขอเสริมว่า ผมไม่ค่อยเข้ากับคนประเภท “โปรแกรมเมอร์ระบบ” ที่มักยึดเอาเกร็ดความรู้เฉพาะทางสุดโต่งแบบนี้มาเป็นตัวตนทางอาชีพทั้งหมด จนมีคนที่ใช้แอสเซมบลีได้แต่ไม่รู้ว่า functor คืออะไร
ดูเหมือนจะไม่มีแหล่งวิชาการดีๆ ที่ลงลึกเรื่อง การปรับแต่งคอมไพเลอร์ขั้นสูง
ผมหามาเยอะแล้ว แต่คอร์สส่วนใหญ่เป็นระดับเริ่มต้น และค่อนข้างน่าแปลกใจที่เทคนิคที่น่าสนใจจริงๆ กลับต้องไปขุดลึกในซอร์สโค้ดของคอมไพเลอร์โอเพนซอร์สยอดนิยม
ผมมองว่าคอมไพเลอร์เป็นหนึ่งในสาขาที่แทบไม่ได้ก้าวหน้าอย่างมากในช่วงประมาณ 30 ปีที่ผ่านมา
ตอนที่ผมสอนอยู่ที่ Perugia University ในช่วงปี 2004~2006 ผมก็ยังใช้เอกสารที่เก่า 15~25 ปีได้โดยแทบไม่มีปัญหา
แต่ช่วงหลังๆ ดูเหมือนสถานการณ์จะเปลี่ยนไป
แค่สิ่งที่นึกออกทันทีว่าในปี 2004~2006 คุณสอนเป็นเรื่องใหม่ได้แต่คงไม่ได้สอน ก็มีทั้ง การสร้าง SSA, SLP vectorization, และการทำ peephole superoptimization แบบอัตโนมัติ
สิ่งที่ไม่เปลี่ยนคือหนังสือเรียนคอมไพเลอร์ต่างหาก ซึ่งมุ่งเน้นมากเกินไปกับการสร้าง parser generator และแทบไม่พูดถึงการออกแบบคอมไพเลอร์จริงๆ หรือแม้แต่การออกแบบสถาปัตยกรรมคอมพิวเตอร์สมัยใหม่เลย ความไม่พอใจนี้มีมาหลายสิบปีแล้ว
ในช่วง 10 ปีที่ผ่านมา ภูมิทัศน์ได้พัฒนาไปมากในด้านเทคนิค incremental compilation
ความก้าวหน้าเชิงทฤษฎีอาจยังติดอยู่กับ parser เป็นหลัก แต่การนำไปใช้จริงครอบคลุมทั้งพายป์ไลน์ ตั้งแต่การปรับแต่งโปรแกรมแบบ global ไปจนถึงการสร้างโค้ด
ทุกครั้งที่มีโปรเซสเซอร์รุ่นใหม่ ก็จะมีคำสั่งและตัวเลือกเพิ่มขึ้น ทำให้เกิดการปรับแต่งหรือการผสมผสานใหม่ๆ ที่คอมไพเลอร์สามารถใช้ประโยชน์ได้
ถ้าจะเขียนคอมไพเลอร์สำหรับ ภาษาเชิงฟังก์ชันบริสุทธิ์ ก็คงต้องใช้เอกสารใหม่อย่างแน่นอน
ดีใจที่มีคอร์สแบบนี้
ตอนนี้ผมสามารถเรียนหัวข้อขั้นสูงโดยมีแนวทางและเรียนตามจังหวะของตัวเองได้
ผมอยากทำอาชีพ วิศวกรคอมไพเลอร์ มาตลอด แต่ที่ที่ผมอยู่มีทั้งโอกาสด้านการศึกษาและงานไม่มากนัก
พอมองไปที่สหรัฐฯ ตลาดงานก็ดูแข่งขันกันหนักมากจนท่วมท้น และพูดตรงๆ ว่าผมไม่รู้จะเริ่มเข้าไปอย่างไร
ประสบการณ์ที่มีมีแค่คอร์สหนึ่งตอนปริญญาตรี แต่คอร์สนั้นดีมากจริงๆ
น่าจะเพราะคุณต้องเขียนโค้ดที่ไปจัดการโค้ดอื่น และโดยปกติทั้งความหมายและเป้าหมายการทำงานก็ค่อนข้างต่างจากงานทั่วไป อีกทั้งยังมีทั้งความรู้แบบบอกต่อและสัญญาณรบกวนเยอะมาก
เพราะแบบนั้น ทีมคอมไพเลอร์จึงมักชอบคนที่ทำคอมไพเลอร์มานานแล้วเป็นพิเศษ แต่แน่นอนว่ามันมีปัญหาเรื่องการเริ่มต้นอยู่ ดังนั้นทีมใหญ่ๆ ก็ยังรับบัณฑิตที่ดูมีแววว่าจะข้ามเส้นโค้งนี้ได้ และผมเองก็เข้ามาได้ประมาณนั้น
ถ้าคุณมีประสบการณ์โดยรวมแต่ไม่มีประสบการณ์ด้านคอมไพเลอร์ กลยุทธ์ที่ชัดเจนคือเข้าบริษัทที่ทำงานที่คุณคุ้นเคยอยู่แล้วและมีทีมคอมไพเลอร์ด้วย ประมาณว่าเป็น “บริษัทซอฟต์แวร์ขนาดค่อนข้างใหญ่” แล้วค่อย ย้ายสายภายใน
ดีที่มี “A Unified Theory of Garbage Collection” รวมอยู่ด้วย
อย่างน้อยนักศึกษาเหล่านี้ก็น่าจะเข้าใจความต่างระหว่าง reference counting กับ tracing garbage collection ได้อย่างถูกต้อง
ถ้า “CS 6120 เป็นคอร์สระดับปริญญาเอกของ Cornell CS ว่าด้วยการนำภาษาโปรแกรมไปใช้งานจริง” งั้นมันถือว่าเป็นคอร์สขั้นสูงมากไหม?
ผมไม่คิดว่าตัวเองอยู่ในระดับ ปริญญาเอก ทางวิทยาการคอมพิวเตอร์
แค่ลองทำดู ถ้าทำได้ก็แปลว่าพร้อมแล้ว ถ้าทำไม่ได้ก็แปลว่ายังไม่พร้อม
แค่ลองเรียนดูก็พอ
ยังดูคล้ายกับสิ่งที่สอนในคอร์สทั่วไปเรื่องการสร้างคอมไพเลอร์ของ Gerhard Goos เมื่อ 20 ปีก่อนอยู่มาก
มีลิงก์ไปยังงานวิจัยที่ใหม่กว่าด้วย เลยอาจลองดูได้
ผมชอบหนังสือ Advanced Compiler Design and Implementation ของ Steven Muchnick
ผมไม่ได้ดูซอร์สโค้ดคอมไพเลอร์มา 18 ปีแล้ว เลยรู้สึกว่าตามเรื่อง profiling และการปรับแต่งตามเส้นทางไม่ค่อยทัน โดยเฉพาะพอมองงานแมชชีนเลิร์นนิงสมัยนี้ก็น่าจะมีเนื้อหา SIMD ขั้นสูงมากขึ้นด้วย
เมื่อไม่กี่ปีก่อน ผมเรียนคอร์สออนไลน์นี้ตามในช่วงหน้าร้อนและได้เรียนรู้อะไรมากจริงๆ
การส่ง PR แก้ปัญหาเล็กๆ ของ Bril IR และช่วยแก้ร่วมกับอาจารย์เป็นประสบการณ์ที่ดื่มด่ำมาก
สงสัยว่าคอร์สนี้มี วิชาพื้นฐานที่ควรเรียนก่อน ไหม
[1] https://www.cs.cornell.edu/courses/cs4120/2022sp/