3 คะแนน โดย GN⁺ 2024-03-04 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • เป็นหลักสูตรแบบเรียนด้วยตนเองที่รวบรวมวิดีโอบรรยาย โน้ต การอ่านเปเปอร์ และงานเขียนโปรแกรมไว้ด้วยกัน เพื่อให้สามารถเรียนตามวิชา 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
  • การเรียนดำเนินไปผ่าน การอ่านเปเปอร์ และงานโอเพนซอร์สเชิงลงมือทำ
    • ภาคปฏิบัติใช้ LLVM และ Bril ซึ่งเป็น IR เพื่อการศึกษาที่ใช้ในคอร์ส
  • หลักสูตรแบบเรียนด้วยตนเองถูกจัดไว้ในรูปแบบเหมือนลงวิชา 4 หน่วยกิตแบบไม่มีการให้คะแนนใน “มหาวิทยาลัยในจินตนาการ”
    • บทเรียนถูกเรียงตามลำดับเชิงเส้น
    • แต่ละบทมีทั้งวิดีโอและโน้ตแบบข้อความ
    • บางบทมีงานเขียนโปรแกรมให้ทำ
    • มีการจัดลำดับแนะนำให้สลับระหว่างการดูวิดีโอและการอ่านเปเปอร์

จุดที่ต่างจากการเรียนในคลาสจริง

  • ผู้เรียนแบบเรียนด้วยตนเองสามารถไม่ต้องสนใจกำหนดส่งงานได้
  • ไม่สามารถเข้าร่วม การสนทนาใน Zulip ของคลาสจริงได้
  • CS 6120 เวอร์ชันที่สอนจริงมีโปรเจ็กต์ปลายภาค
    • งานปลายภาคของเวอร์ชันเรียนด้วยตนเองคือ “เปลี่ยนโลกด้วยเวทมนตร์ของคอมไพเลอร์”
  • คุณภาพการผลิตวิดีโออาจไม่สูงนัก โดยเฉพาะในบทเรียนช่วงแรก
  • เอกสารของ CS 6120 เปิดเป็นโอเพนซอร์สบน GitHub และหากพบปัญหาก็สามารถรายงานบั๊กได้
  • หลังเรียนจบสามารถกรอก แบบฟอร์มฟีดแบ็ก ได้

บทเรียนและเอกสารอ่านประกอบ

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

 
GN⁺ 2024-03-04
ความคิดเห็นจาก Hacker News
  • ตอนที่กำลังจะจบปริญญาตรีและหางานประจำงานแรก คอร์สนี้ช่วยให้ฉันผ่านการสัมภาษณ์ทีมวิศวกรรมคอมไพเลอร์ของ MANGA(Meta, Apple, NVIDIA, Google, Amazon) ได้
    หลักสูตรด้านระบบคอมพิวเตอร์ระดับล่างของ University of Waterloo ก็ยอดเยี่ยมมาก และฉันก็กำลังมีส่วนร่วมกับโครงการคอมไพเลอร์โอเพนซอร์สด้วย แต่คอร์สนี้ช่วยได้มากจริงๆ ในการตอบคำถามที่ยากที่สุดในการสัมภาษณ์

    • ไม่ใช่ “par excellent” แต่เป็น par excellence และโครงสร้างประโยคนั้นก็ฟังแปลกด้วย
      ถ้าจะเขียนให้เป็นธรรมชาติกว่านี้ น่าจะเป็นประมาณว่า “my university has the low level computing systems curriculum par excellence”
  • ผมคิดว่าก่อนจะเขียนคอมไพเลอร์ ควรเข้าใจ สถาปัตยกรรมคอมพิวเตอร์ ก่อน และควรรู้ว่าคอมไพเลอร์ต้องสร้างอะไรบ้างเพื่อให้ได้โค้ดเครื่องที่มีประสิทธิภาพที่สุด
    แต่จากประสบการณ์ของผม ดูเหมือนโรงเรียนและมหาวิทยาลัยจะให้ความสำคัญกับสถาปัตยกรรมคอมพิวเตอร์ หรือแม้แต่การเขียนโปรแกรมระบบน้อยลงเรื่อยๆ อาจเพราะมองว่ามันเฉพาะทางเกินไป
    ถึงอย่างนั้น ความรู้นี้ก็สำคัญมากต่อการได้งานดีๆ ในอุตสาหกรรม

    • ที่บอกว่ามหาวิทยาลัยลดความสำคัญของ การเขียนโปรแกรมระบบ นั้นถูกต้อง แต่เหตุผลไม่ใช่เพราะ “มันเฉพาะทางเกินไป”
      ปัญหาพื้นฐานที่ผมเจอจากการทำงานกับมหาวิทยาลัยคือ มีเนื้อหาที่เป็นไปได้มากเกินกว่าจะสอนได้หมดภายในเวลาเรียนที่จำกัด
      ปริมาณข้อมูลที่ต้องรู้ในสาขาของเราเพิ่มขึ้นแบบทวีคูณตามเวลาและเกินขีดจำกัดไปแล้ว ดังนั้นการที่หลักสูตรทั่วไปลดเวลาเรียนวิชาเขียนโปรแกรมระบบลงจึงสมเหตุสมผล เพราะมันเกี่ยวข้องกับนักศึกษาจำนวนมากน้อยลงทุกปี
    • ช่วยอธิบายเพิ่มได้ไหมว่า งานดีๆ ในอุตสาหกรรมที่ว่าคืออะไร และทำไมถึงมองแบบนั้น?
    • ผมมองว่าหนึ่งในความก้าวหน้าครั้งใหญ่ของอุตสาหกรรมคือการทำให้เราสามารถใช้คอมไพเลอร์ได้โดยไม่ต้องรู้รายละเอียดระดับล่างขนาดนี้
      ยังมีงานอีกมากที่ต้องทำในระดับคอมไพเลอร์ แต่ส่วนใหญ่ไม่ควรต้องใส่ใจถึงระดับ ไมโครสถาปัตยกรรม ของคอมพิวเตอร์
    • งานที่เกี่ยวกับ GPU ยังต้องใช้ความสามารถด้านสถาปัตยกรรมคอมพิวเตอร์และคอมไพเลอร์สูงมาก
      ต่อให้ไม่จำเป็นต้องเรียน 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 ไปจนถึงการสร้างโค้ด
    • ตั้งแต่นั้นมา การทดสอบคอมไพเลอร์ ก็เปลี่ยนไปมาก และการทดสอบแบบสุ่มขนาดใหญ่ก็กลายเป็นที่นิยม
    • ผมไม่ได้เชี่ยวชาญด้านการออกแบบหรือการนำคอมไพเลอร์ไปใช้ แต่ดูเหมือนว่า โค้ดเครื่องและแอสเซมบลี ซึ่งเป็นเป้าหมายของคอมไพเลอร์ จะเปลี่ยนไปมากตามเวลา
      ทุกครั้งที่มีโปรเซสเซอร์รุ่นใหม่ ก็จะมีคำสั่งและตัวเลือกเพิ่มขึ้น ทำให้เกิดการปรับแต่งหรือการผสมผสานใหม่ๆ ที่คอมไพเลอร์สามารถใช้ประโยชน์ได้
    • อาจเป็นเพราะภาษาโปรแกรมส่วนใหญ่ไม่ได้เปลี่ยนไปมากนักในแง่ของความเป็น imperative, การใช้ลูป, และผลข้างเคียงอย่างกว้างขวาง
      ถ้าจะเขียนคอมไพเลอร์สำหรับ ภาษาเชิงฟังก์ชันบริสุทธิ์ ก็คงต้องใช้เอกสารใหม่อย่างแน่นอน
  • ดีใจที่มีคอร์สแบบนี้
    ตอนนี้ผมสามารถเรียนหัวข้อขั้นสูงโดยมีแนวทางและเรียนตามจังหวะของตัวเองได้
    ผมอยากทำอาชีพ วิศวกรคอมไพเลอร์ มาตลอด แต่ที่ที่ผมอยู่มีทั้งโอกาสด้านการศึกษาและงานไม่มากนัก
    พอมองไปที่สหรัฐฯ ตลาดงานก็ดูแข่งขันกันหนักมากจนท่วมท้น และพูดตรงๆ ว่าผมไม่รู้จะเริ่มเข้าไปอย่างไร
    ประสบการณ์ที่มีมีแค่คอร์สหนึ่งตอนปริญญาตรี แต่คอร์สนั้นดีมากจริงๆ

    • สาขานี้มี เส้นโค้งการเรียนรู้ที่โหดมาก ซึ่งหลายคนข้ามไม่พ้น
      น่าจะเพราะคุณต้องเขียนโค้ดที่ไปจัดการโค้ดอื่น และโดยปกติทั้งความหมายและเป้าหมายการทำงานก็ค่อนข้างต่างจากงานทั่วไป อีกทั้งยังมีทั้งความรู้แบบบอกต่อและสัญญาณรบกวนเยอะมาก
      เพราะแบบนั้น ทีมคอมไพเลอร์จึงมักชอบคนที่ทำคอมไพเลอร์มานานแล้วเป็นพิเศษ แต่แน่นอนว่ามันมีปัญหาเรื่องการเริ่มต้นอยู่ ดังนั้นทีมใหญ่ๆ ก็ยังรับบัณฑิตที่ดูมีแววว่าจะข้ามเส้นโค้งนี้ได้ และผมเองก็เข้ามาได้ประมาณนั้น
      ถ้าคุณมีประสบการณ์โดยรวมแต่ไม่มีประสบการณ์ด้านคอมไพเลอร์ กลยุทธ์ที่ชัดเจนคือเข้าบริษัทที่ทำงานที่คุณคุ้นเคยอยู่แล้วและมีทีมคอมไพเลอร์ด้วย ประมาณว่าเป็น “บริษัทซอฟต์แวร์ขนาดค่อนข้างใหญ่” แล้วค่อย ย้ายสายภายใน
  • ดีที่มี “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 และช่วยแก้ร่วมกับอาจารย์เป็นประสบการณ์ที่ดื่มด่ำมาก

  • สงสัยว่าคอร์สนี้มี วิชาพื้นฐานที่ควรเรียนก่อน ไหม