คอมไพล์ TypeScript เป็นแมชชีนโค้ดของ LLVM โดยตรงด้วยคอมไพเลอร์เนทีฟ "Perry"
(github.com/PerryTS)กระบวนทัศน์การพัฒนา TypeScript แบบเดิมถือเป็นเรื่องปกติที่จะทรานสไพล์โค้ด TS ซึ่งเป็นนามธรรมระดับสูงไปเป็น JavaScript ก่อน แล้วจึงรันบนเอนจินรันไทม์แบบ JIT ขนาดใหญ่ เช่น V8 หรือ JavaScriptCore (Node.js, Bun, Deno เป็นต้น)
Perry ซึ่งเพิ่งปรากฏตัวบนสายโอเพนซอร์สเมื่อไม่นานนี้ เป็นคอมไพเลอร์แบบ Native-First ที่พัฒนาด้วย Rust โดยตั้งเป้าจะรื้อโมเดลรันไทม์แบบดั้งเดิมนี้ออกทั้งหมด และคอมไพล์โค้ด TypeScript ให้เป็น standalone native binary ได้โดยตรง
💡 สถาปัตยกรรมหลักและจุดเด่น
-
No Runtime (ไม่มีรันไทม์): ไม่มีชั้นกลางขนาดใหญ่อย่างเอนจิน V8, Electron หรือ JVM โดยใช้ SWC ในการพาร์สโค้ด TS แล้วบิลด์เป็นแมชชีนโค้ดของแพลตฟอร์มเป้าหมายโดยตรงผ่านโครงสร้างพื้นฐานของ LLVM
-
บิลด์ข้ามแพลตฟอร์มจากซอร์สชุดเดียว: ใช้โค้ดเบส TypeScript ชุดเดียวเพื่อสร้างไบนารีที่รองรับ macOS, iOS, Android, Linux และ Windows ได้ทั้งหมด
-
True TypeScript Support: ไม่ใช่ "ภาษาแยกที่คล้าย TS" แบบ AssemblyScript แต่ตั้งเป้ารองรับอีโคซิสเต็ม TypeScript อย่างเต็มรูปแบบบนพื้นฐานของ Strict Mode
-
รองรับเฟรมเวิร์ก UI ที่เบามาก: โดดเด่นด้วยขนาดไบนารีเพียงไม่กี่ MB และ cold start ระดับ sub-second ที่เกือบ 0ms รองรับทั้งการผสานกับ GUI เนทีฟของแพลตฟอร์มอย่าง SwiftUI, GTK4, WinUI รวมถึงการเขียน JSX ผ่าน React renderer ของตัวเอง
🛠️ สถานะการพัฒนาและข้อจำกัด (สะท้อนจากฟีดแบ็กบน Hacker News)
เนื่องจากเป็นโปรเจกต์ที่กำลังร้อนแรงบน HN และที่อื่น ๆ ในช่วงนี้ จึงมีการพูดคุยกันอย่างชัดเจนถึงโจทย์ที่ต้องแก้ก่อนจะไปถึงระดับ production
-
ข้อจำกัดของคุณสมบัติ JS แบบไดนามิก: สไตล์ JavaScript แบบไดนามิก เช่น การฉีดฟิลด์/เมธอดเข้าไปในอ็อบเจ็กต์ตอนรันไทม์ หรือการดัดแปลง prototype จะไม่รองรับเนื่องจากข้อจำกัดของการคอมไพล์แบบสแตติก โดยระบบทำงานบนพื้นฐานของ TS subset ที่เข้มงวดและเป็น Deterministic
-
การจำลองโมดูล built-in ของ Node.js: ปัจจุบันใช้ระบบนิเวศ Rust เช่น hyper, rustls, tokio เพื่อจำลอง HTTP standard library ของ Node.js อย่างใกล้เคียง ขณะนี้คอมไพล์บางโมดูลอย่าง Fastify ได้สำเร็จและพัฒนาอย่างรวดเร็ว แต่ความเข้ากันได้ 100% กับไลบรารีในอีโคซิสเต็มที่ซับซ้อนและพึ่งพา dynamic import อย่าง Express ยังเป็นโจทย์ในระดับอัลฟาที่ต้องแก้ต่อไป
# วิธีใช้งานเรียบง่ายอย่างยิ่ง
$ perry compile src/main.ts -o myapp
$ ./myapp # รัน native binary ล้วนแบบไม่มี dependency
ในฐานะความพยายามขยาย TypeScript ที่เคยถูกจำกัดอยู่ในอีโคซิสเต็มเว็บ ไปสู่โลกของ system programming และแอปเนทีฟน้ำหนักเบา โปรเจกต์นี้น่าจับตาสำหรับผู้ที่สนใจสถาปัตยกรรมระบบประสิทธิภาพสูงหรือคอมไพเลอร์ไปป์ไลน์ของ LLVM
GitHub: https://github.com/PerryTS/perry
ยังไม่มีความคิดเห็น