1 คะแนน โดย GN⁺ 2024-08-26 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

ทำไมถึงเขียนคอมไพเลอร์ Rust ด้วย C?

  • ช่วงหลังที่กิจกรรมลดลงมีหลายเหตุผล

    • เหตุการณ์ส่วนตัว เช่น การเสียชีวิตของคนในครอบครัว
    • ความรับผิดชอบในงานเพิ่มขึ้น
    • ความหลงใหลในโอเพนซอร์สลดลง
    • มุ่งเน้นไปที่โปรเจ็กต์ใหม่
  • โปรเจ็กต์นี้คือการเขียนคอมไพเลอร์ Rust ด้วย C ล้วน

    • เขียนด้วย C ล้วน โดยไม่ใช้ C++, flex, yacc, หรือ Makefile
    • ชื่อโปรเจ็กต์คือ Dozer

ทำไมถึงทำสิ่งนี้?

  • จำเป็นต้องเข้าใจการบูตสแตรปและความสำคัญของมัน
    • หากต้องการรันโค้ด Rust ก็ต้องมีคอมไพเลอร์
    • คอมไพเลอร์หลักของ Rust คือ rustc
    • rustc เขียนด้วย Rust และจำเป็นต้องใช้เพื่อคอมไพล์โค้ด Rust
    • หากจะคอมไพล์ rustc ก็ต้องมี rustc เวอร์ชันก่อนหน้าอยู่แล้ว
    • rustc เวอร์ชันแรกเริ่มเขียนด้วย OCaml
    • คอมไพเลอร์ OCaml สามารถคอมไพล์ได้ด้วย Guile และ Guile เขียนด้วย C

หลักการถดถอยลงไปหาแกนตั้งต้น

  • แนะนำโปรเจ็กต์ Bootstrappable Builds

    • เริ่มต้นจากไบนารีซีดขนาด 512 ไบต์
    • ค่อย ๆ สร้างคอมไพเลอร์ที่ซับซ้อนขึ้นจากคอมไพเลอร์อย่างง่าย
    • ท้ายที่สุดสามารถคอมไพล์ TinyCC, GCC, Linux และอื่น ๆ ได้
  • Rust ปรากฏในกระบวนการนี้ค่อนข้างช้า

    • ใช้ mrustc เพื่อคอมไพล์ rustc เวอร์ชัน 1.56
    • หากต้องการใช้ Rust ก่อนการนำ C++ เข้ามา ก็ทำไม่ได้
  • Dozer ตั้งเป้าจะเป็นคอมไพเลอร์ Rust ที่บูตสแตรปได้ด้วย C

    • ต้องสามารถบูตสแตรปได้ด้วย TinyCC

แผนงาน

  • ทำงานกับ Dozer มาในช่วงสองเดือนที่ผ่านมา

    • คอมไพล์ได้ด้วย TinyCC และ cproc
    • ใช้ QBE เป็นแบ็กเอนด์
    • ตอนนี้ทำ lexer และ parser ไปแล้วบางส่วน
    • เลื่อนการขยายแมโคร/โมดูลออกไปก่อน
    • การตรวจสอบชนิดข้อมูลรองรับเพียง i32
    • การสร้างโค้ดยังไม่สมบูรณ์
  • แผนต่อจากนี้

    • ค่อย ๆ พัฒนา Dozer ให้สามารถคอมไพล์ตัวอย่าง libc พื้นฐาน, libcore และ rustc ได้
    • สร้างเครื่องมือคล้าย cargo เพื่อให้สามารถคอมไพล์แพ็กเกจ Rust ได้
    • ลบโค้ดที่สร้างขึ้นอัตโนมัติออก
    • สร้างกระบวนการสำหรับคอมไพล์ rustc และ cargo

สรุปโดย GN⁺

  • บทความนี้เล่าเรื่องโปรเจ็กต์เขียนคอมไพเลอร์ Rust ด้วย C ล้วน
  • อธิบายความสำคัญของการบูตสแตรปและกระบวนการสร้างคอมไพเลอร์ Rust ด้วยแนวทางนี้
  • โปรเจ็กต์ Dozer มีเป้าหมายเป็นคอมไพเลอร์ Rust ที่บูตสแตรปได้ด้วย C
  • โปรเจ็กต์นี้ท้าทายอย่างมาก และแม้ยังไม่แน่ว่าจะสำเร็จหรือไม่ แต่การลองทำเองก็มีความหมาย

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

 
GN⁺ 2024-08-26
ความเห็นจาก Hacker News
  • ถ้าจะบูตสแตรป Rust ก็ควรเขียน proto-Rust ด้วย C ก่อน แล้วค่อยใช้ proto-Rust เขียนคอมไพเลอร์ Rust ตัวเต็ม

    • proto-Rust ไม่มี borrow checker หรือการรองรับ macro, ไม่คืนหน่วยความจำ, และไม่จำเป็นต้องสร้างโค้ดที่ดี
    • proto-Rust ก็เหมือน C ที่มีไวยากรณ์แบบ Rust
    • เลยสงสัยว่าทำไมถึงไม่ได้เลือกเส้นทางนี้
  • กำลังเขียนคอมไพเลอร์ C ด้วย Rust เป็นงานอดิเรก และเรียกมันว่า "Small C Compiler"

    • ใช้ Cranelift เป็นแบ็กเอนด์ และสถาปัตยกรรมคอมไพเลอร์ก็ออกแบบให้เสียบปลั๊กและแฮ็กได้
    • ยังไม่มีแผนโอเพนซอร์สจนกว่าจะจัดการ printf("Hello World!") ได้
    • กำลังพยายามทำ preprocessor และ parser และมีส่วนร่วมกับ rust-peg และ HimeCC
    • อยากรู้ว่ามีวิธีแก้ปัญหา typedef ในสายวิชาการอย่างไร
  • ในฮาร์ดแวร์ก็มีปัญหาการบูตสแตรปแบบเดียวกัน

    • คอมพิวเตอร์ถูกสร้างขึ้นจากคอมพิวเตอร์และซอฟต์แวร์ที่มีอยู่ก่อนหน้า
    • เป็นหัวข้อที่น่าสนใจให้ขบคิด
  • ต้องกดตามลิงก์ไป 4 ชั้นกว่าจะเจอประโยชน์ของการบูตสแตรป

    • คาดว่าคำว่า "ทำไม" ในชื่อเรื่องจะอธิบายเหตุผลนั้น
  • พอมีการนำ C++ เข้ามาในสายโซ่การบูตสแตรป ก็แทบจะจบแล้ว

    • ถ้าจะใช้ Rust ก็ควรใช้ก่อนจะนำ C++ เข้ามา
    • อยากให้คอมไพเลอร์ Rust บูตสแตรปจาก C ได้
    • แต่ rustc เวอร์ชันก่อนหน้าก็คอมไพล์ด้วย rustc เวอร์ชันก่อนหน้า
    • สามารถคอมไพล์คอมไพเลอร์ OCaml ด้วย Guile ได้สำเร็จ
    • ผู้เขียนตัดขั้น C++ ออกและเลือกขั้น C แทน
    • แต่แรงจูงใจของผู้เขียนยังไม่ชัดเจน
  • ถ้าจะสร้างไบนารีใหม่บนระบบเป้าหมาย rustc ก็ต้องรองรับระบบนั้น

    • ถ้าเพิ่มการรองรับนั้นเข้าไปใน rustc ก็จะสามารถบิลด์ตัวเองได้
  • ลองจินตนาการถึงการเขียนอินเทอร์พรีเตอร์หรือคอมไพเลอร์ C++ ด้วย Scheme

    • การข้ามจาก Scheme ไปยัง gcc ปัจจุบันได้โดยตรงจะเป็นทางลัดครั้งใหญ่
    • แต่โดยทั่วไปก็ถือกันว่าการเขียนคอมไพเลอร์ C++ แทบเป็นไปไม่ได้
  • เมื่อมองทั้งสแตก นี่อาจเป็นวิธีหนึ่งในการหลบปัญหา "trusting trust"

  • ชอบที่ใช้ QBE เป็นแบ็กเอนด์

    • น่าสนใจถ้าได้เห็นการเปรียบเทียบกับ Rust และ LLVM
    • ขอให้โชคดี
  • อาจพิจารณาใช้ FORTH เป็นส่วนหนึ่งของ toolchain ในกระบวนการบูตสแตรป