Lamina: คอมไพเลอร์แบ็กเอนด์หลายสถาปัตยกรรมที่สร้างโค้ดเนทีฟได้โดยไม่ใช้ LLVM
(github.com/SkuldNorniern)สวัสดีครับ พอดีคนรู้จักของผมเพิ่งพัฒนาคอมไพเลอร์แบ็กเอนด์ขึ้นมาตัวหนึ่งเมื่อไม่นานนี้ และคิดว่าน่าสนใจดีเลยอยากนำมาแชร์ครับ
- แนะนำโปรเจกต์
Lamina เป็นคอมไพเลอร์แบ็กเอนด์หลายสถาปัตยกรรมที่สร้างโค้ดเนทีฟได้โดยตรงจาก SSA-based IR โดยไม่ต้องพึ่งพา dependency ขนาดใหญ่แบบ LLVM
รองรับ x86_64, AArch64, RISC-V และ WebAssembly ผ่าน IR เดียวกัน
เขาบอกว่าทุกครั้งที่ทำ DSL ง่าย ๆ หรือภาษาเชิงทดลองขึ้นมาใหม่ การต้อง build LLVM และจัดการ dependency ขนาดหลาย GB มันหนักเกินไปมาก
เลยเริ่มจากแนวคิดว่า “ลองทำอะไรเบา ๆ ที่แค่ใส่ IR แล้วได้ assembly ออกมาเลยดีกว่า”
- คุณสมบัติหลัก
▸ ไม่มี external dependency
แปลงจาก IR ไปเป็น machine code โดยตรงโดยไม่ใช้ LLVM หรือ Cranelift
ใช้เวลาสร้างสั้นและ deploy ได้ง่าย
▸ SSA-based IR
เนื่องจากอยู่ในรูปแบบ Static Single Assignment จึงจัด pipeline สำหรับ optimization ได้อย่างเป็นระเบียบ
▸ memory model แบบ explicit
แยกการจัดสรร stack/heap ให้ชัดเจนตั้งแต่ระดับ IR ทำให้วิเคราะห์หน่วยความจำได้ง่าย
▸ หลายสถาปัตยกรรม
รองรับหลาย target ด้วย IR เดียว:
- x86_64 (Linux, macOS, Windows)
- AArch64/ARM64 (Linux, macOS, Windows)
- RISC-V (RV32/64/128)
- WebAssembly (32/64-bit)
▸ IRBuilder API
มี API สำหรับประกอบ IR ในสไตล์ functional
เขาบอกว่าสามารถใช้แสดง control flow หรือการทำงานกับหน่วยความจำได้อย่าง type-safe
- สถานะปัจจุบัน
ตอนนี้รองรับการคำนวณเลขพื้นฐาน, control flow อย่างเงื่อนไข/branch/loop, การเรียกฟังก์ชันแบบไม่เรียกซ้ำตัวเอง และ optimization แบบง่าย ๆ แล้ว
แม้จะยังไม่ production-ready แต่ก็บอกว่าเพียงพอสำหรับทดลองกับ toy language หรือใช้เป็นแบ็กเอนด์ของ DSL
- เวิร์กโฟลว์การใช้งาน
คร่าว ๆ คือใช้งานประมาณนี้:
- parse ภาษาต้นทางแล้วสร้าง AST
- แปลง AST เป็น Lamina IR ด้วย IRBuilder
- ให้ Lamina ทำ optimization และสร้างโค้ดเนทีฟตาม target
ถ้าเขียนส่วนสร้าง IR ได้ดี ที่เหลือ Lamina จะจัดการให้เอง
- ทิ้งท้าย
ส่วนตัวผมเคยรู้สึกว่าการ “สร้างคอมไพเลอร์แบ็กเอนด์” เป็นเรื่องที่ไกลตัวมาก
แต่พอได้เห็นคนรู้จักสร้างขึ้นมาจริง ๆ ก็รู้สึกทึ่งเหมือนกันครับ
แน่นอนว่าอาจยังไม่ mature หรือ optimize ได้ระดับ LLVM แต่ถ้าเอาไว้ทดลองแบบเบา ๆ หรือใช้เพื่อการเรียนรู้ก็ดูน่าสนใจทีเดียว
ผมเองก็ได้ลองพัฒนาคอมไพเลอร์สำหรับ Eom Jun-sik Lang ผ่าน lamina มาแล้วเหมือนกัน
ถ้าใครสนใจก็ลองเข้าไปดูได้ครับ!
ยังไม่มีความคิดเห็น