1 คะแนน โดย GN⁺ 8 시간 전 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • 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
  • การเรียนต่อยอดไปสู่การอ่านเปเปอร์และงานโอเพนซอร์สแฮ็กกิง
    • ใช้ LLVM
    • ใช้ Bril ซึ่งเป็น IR เพื่อการเรียนการสอนของวิชา
  • หลักสูตรแบบเรียนด้วยตนเองจัดเป็น ตารางเชิงเส้น ที่ผสมการดูวิดีโอและการอ่านเปเปอร์เข้าด้วยกัน
  • บางบทเรียนมี งานอิมพลีเมนต์ รวมอยู่ด้วย เพื่อให้เรียนรู้แนวคิดเชิงนามธรรมผ่านการเขียนโค้ดแบบปลายเปิด
  • มีความแตกต่างระหว่าง CS 6120 แบบเรียนจริงกับเวอร์ชันเรียนด้วยตนเอง
    • สามารถไม่สนใจกำหนดส่งงานได้
    • ไม่สามารถเข้าร่วมเธรดสนทนาใน Zulip ได้
    • วิชาแบบเรียนจริงมีโปรเจ็กต์ปลายภาค
    • งานปลายภาคของเวอร์ชันเรียนด้วยตนเองคือ “เปลี่ยนโลกด้วยเวทมนตร์ของคอมไพเลอร์”
  • คอร์สนี้เปิดเป็น โอเพนซอร์สบน GitHub จึงสามารถรายงานบั๊กได้หากพบปัญหา
  • หลังเรียนจบสามารถกรอก ฟอร์ม feedback ได้

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

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

 
GN⁺ 8 시간 전
ความคิดเห็นใน Hacker News
  • ส่วนของคอมไพเลอร์แบบไดนามิกนั้นแทบทั้งหมดใกล้เคียงกับเนื้อหาเรื่อง trace compilation มากกว่า โดยทั่วไปแล้ว trace compilation เป็นทางตันและถูกทอดทิ้งมาหลายครั้งแล้ว
    สิ่งที่สำคัญกว่าสำหรับตรงนี้น่าจะเป็นแนวคิดเรื่อง type feedback, speculative execution กับ deoptimization, fast compiler และการทำงานแบบเป็นชั้น
    โดยรวมคอร์สดูน่าสนใจมาก และการที่มีการเผยแพร่วัสดุออนไลน์จำนวนมากแบบนี้ก็ยอดเยี่ยมด้วย

    • ในเชิงประวัติศาสตร์ การทำ tracing ได้พิสูจน์แล้วว่าไม่ค่อยใช้งานได้จริงในฐานะหลักการจัดโครงสร้าง แต่ก็คิดว่าเป็นแนวคิดที่เรียนไว้แล้วช่วยเปิดกรอบความคิดได้
      อย่างที่พูดไป อยากให้มีบริบทเพิ่มขึ้นอีกหน่อยเกี่ยวกับ สิ่งที่ใช้งานได้ผลจริง ในภาคอุตสาหกรรม
    • ผมกำลังทำงานเกี่ยวกับ torch.compile ของ PyTorch อยู่ ซึ่งอันนี้ก็เป็น tracing compiler เหมือนกัน
      แต่พื้นที่นี้อาจค่อนข้างแคบ และก็แตกต่างจากคอมไพเลอร์แบบดั้งเดิมมาก ดังนั้นถ้าดูบางอย่างที่เราทำอยู่ คุณอาจรู้สึกขัดใจพอสมควรก็ได้
    • JAX ก็เป็น tracing compiler เหมือนกัน
      แน่นอนว่าผมรู้ว่าพื้นที่ปัญหาของมันต่างจาก TraceMonkey หรือ LuaJIT แบบสุดขั้ว
    • เปเปอร์ของ TraceMonkey เคยอยู่ในรายชื่ออ่านสอบวัดคุณสมบัติปริญญาเอกของผม และช่วงสอบนั้นก็ดันตรงกับตอนที่ TraceMonkey ถูกถอดออกจาก SpiderMonkey พอดี
      ตอนนั้นผมได้คุยกับนักพัฒนาคนหนึ่ง น่าจะเป็น Jason Orendorff เขาบอกว่า tracing มักไปไม่ค่อยรอด แต่ก็คิดว่าอาจใช้ได้ในเงื่อนไขที่จำกัดบางอย่าง
      เพียงแต่ผมลืมไปหมดแล้วว่าเงื่อนไขนั้นคืออะไร
    • trace compilation ไม่ใช่ ทางตัน
      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 ดูเหมือนจะเป็นสิ่งที่อยู่ในวิชาคอมไพเลอร์ตัวแรกด้วยซ้ำ

    • หมายเลขวิชาค่อนข้างเป็นระบบ เลยพอจะหาดูได้ว่าวิชา “คอมไพเลอร์เบื้องต้น” คืออะไร: https://www.cs.cornell.edu/courses/cs4120/2026sp/?schedule
      สรุปสั้น ๆ คือวิชาคอมไพเลอร์จริง ๆ แล้วแบ่งเป็นสองวิชา โดยวิชาแรกครอบคลุมองค์ประกอบขั้นต่ำในการสร้างคอมไพเลอร์ ได้แก่ lexical analysis, parsing, code generation และ register allocation
      ส่วนวิชาที่สองว่าด้วยการสร้าง optimizing compiler
    • ผมอ่านเอกสารที่เกี่ยวข้องมาเยอะมาก แต่เนื้อหาแบบนั้นกลับไม่ค่อยถูกรวมไว้ในส่วนใหญ่
      ไม่ว่าจะเป็นคอมไพเลอร์หรืออินเทอร์พรีเตอร์ ส่วน backend ในทางปฏิบัติเกือบตลอดเวลามักถูกทิ้งไว้เป็น “แบบฝึกหัดสำหรับผู้อ่าน”
      ทั้งวิธีสร้าง closure, วิธีติดตาม environment, pattern matching, memory representation และเรื่องอื่น ๆ ที่ยังต้องไปค้นหาเองนั้นมีมากจนยากจะจินตนาการ
      ของที่น่าสนใจจริง ๆ ต้องไปตามหาเองทั้งหมด
      ป.ล. นี่เป็นแค่อ่านของหนึ่งปีจากทั้งหมดเท่านั้น: https://gist.githubusercontent.com/mamcx/e1743571b9a1ea163a7...
    • คนที่ไม่ใช่ผู้เชี่ยวชาญมักเริ่มจาก parsing และหลายครั้งก็ไม่เคยได้แตะ backend เลย
      ผมอ่านหนังสืออินเทอร์พรีเตอร์กับคอมไพเลอร์มาสองเล่ม ซึ่งก็ไม่ได้พูดถึง backend มากนัก
      อาจจะใกล้เคียงกับวิชาแนะนำ backend มากกว่าก็ได้
    • งั้นก็ยังสงสัยอยู่ว่าอะไรคือความเป็นขั้นสูง เพราะถ้าครอบคลุม dead code elimination, data flow, SSA, instruction selection และ register allocation อย่างจริงจัง ก็แทบจะเป็น 98% ของ backend แล้ว
  • มี คอร์สวิทยาการคอมพิวเตอร์ระดับมหาวิทยาลัยแบบออนไลน์ที่เรียนเองได้ แนวนี้อีกไหม?

    • มีเป็นสิบ ๆ เลย แค่ค้นหาคำว่า “mooc” ก็พอ
      อาจารย์บางคนก็เผยแพร่คอร์สกับการบ้านไว้นอกกรอบ “mooc” ด้วย
      ผมเคยถามคำถามในคอมเมนต์แล้วอาจารย์ก็มาตอบด้วย อินเทอร์เน็ตยังมีมุมที่เจ๋งอยู่มากทีเดียว
  • ถ้าเทียบกับ Writing a C compiler ของ Nora Sandler ประโยชน์ที่ผู้อ่านจะได้รับต่างกันอย่างไร?

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

    • ชอบโครงสร้างของ Essentials of Compilation [1][2] และ Writing a C Compiler [3]
      ถ้าอยากเริ่มจากอินเทอร์พรีเตอร์ 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 ได้
    • แนะนำให้ดู Crafting Interpreters [1]
      แบ่งเป็นสองส่วน ส่วนแรกสร้างอินเทอร์พรีเตอร์แบบ tree-walk ด้วย Java แล้วค่อยต่อยอดไปเป็นเวอร์ชันที่เขียนด้วย C
      1. https://craftinginterpreters.com/
    • ผมยังไม่เคยลองเอง แต่มี “the-super-tiny-compiler”:
      https://github.com/jamiebuilds/the-super-tiny-compiler
    • ถึงจะเก่าแล้ว แต่ขอแนะนำให้เริ่มจากงานคลาสสิกของ David Gries คือ Compiler Construction for Digital Computers
      ถ้าอ่านควบคู่กับหนังสือสมัยใหม่ที่มีคนแนะนำไว้ที่นี่สักสองสามเล่มก็น่าจะเพียงพอ
      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