คอมไพเลอร์ Rust ที่เขียนด้วยภาษา C
(notgull.net)ทำไมถึงเขียนคอมไพเลอร์ Rust ด้วย C?
-
ช่วงหลังที่กิจกรรมลดลงมีหลายเหตุผล
- เหตุการณ์ส่วนตัว เช่น การเสียชีวิตของคนในครอบครัว
- ความรับผิดชอบในงานเพิ่มขึ้น
- ความหลงใหลในโอเพนซอร์สลดลง
- มุ่งเน้นไปที่โปรเจ็กต์ใหม่
-
โปรเจ็กต์นี้คือการเขียนคอมไพเลอร์ Rust ด้วย C ล้วน
- เขียนด้วย C ล้วน โดยไม่ใช้ C++,
flex,yacc, หรือMakefile - ชื่อโปรเจ็กต์คือ Dozer
- เขียนด้วย C ล้วน โดยไม่ใช้ C++,
ทำไมถึงทำสิ่งนี้?
- จำเป็นต้องเข้าใจการบูตสแตรปและความสำคัญของมัน
- หากต้องการรันโค้ด 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
- ค่อย ๆ พัฒนา Dozer ให้สามารถคอมไพล์ตัวอย่าง
สรุปโดย GN⁺
- บทความนี้เล่าเรื่องโปรเจ็กต์เขียนคอมไพเลอร์ Rust ด้วย C ล้วน
- อธิบายความสำคัญของการบูตสแตรปและกระบวนการสร้างคอมไพเลอร์ Rust ด้วยแนวทางนี้
- โปรเจ็กต์ Dozer มีเป้าหมายเป็นคอมไพเลอร์ Rust ที่บูตสแตรปได้ด้วย C
- โปรเจ็กต์นี้ท้าทายอย่างมาก และแม้ยังไม่แน่ว่าจะสำเร็จหรือไม่ แต่การลองทำเองก็มีความหมาย
1 ความคิดเห็น
ความเห็นจาก Hacker News
ถ้าจะบูตสแตรป Rust ก็ควรเขียน proto-Rust ด้วย C ก่อน แล้วค่อยใช้ proto-Rust เขียนคอมไพเลอร์ Rust ตัวเต็ม
กำลังเขียนคอมไพเลอร์ C ด้วย Rust เป็นงานอดิเรก และเรียกมันว่า "Small C Compiler"
printf("Hello World!")ได้typedefในสายวิชาการอย่างไรในฮาร์ดแวร์ก็มีปัญหาการบูตสแตรปแบบเดียวกัน
ต้องกดตามลิงก์ไป 4 ชั้นกว่าจะเจอประโยชน์ของการบูตสแตรป
พอมีการนำ C++ เข้ามาในสายโซ่การบูตสแตรป ก็แทบจะจบแล้ว
ถ้าจะสร้างไบนารีใหม่บนระบบเป้าหมาย rustc ก็ต้องรองรับระบบนั้น
ลองจินตนาการถึงการเขียนอินเทอร์พรีเตอร์หรือคอมไพเลอร์ C++ ด้วย Scheme
เมื่อมองทั้งสแตก นี่อาจเป็นวิธีหนึ่งในการหลบปัญหา "trusting trust"
ชอบที่ใช้ QBE เป็นแบ็กเอนด์
อาจพิจารณาใช้ FORTH เป็นส่วนหนึ่งของ toolchain ในกระบวนการบูตสแตรป