คอมไพล์ 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
7 ความคิดเห็น
ขอเป็นกำลังใจให้ครับ
เป็นแนวทางที่น่าสนใจดีนะครับ แค่ตัด runtime ออกได้ก็ถือว่าเป็นความสำเร็จครั้งใหญ่แล้ว!
ดูเหมือนจะเป็นแบบนั้นนะ แต่พูดตามตรงก็รู้สึกว่าความปลอดภัยด้านหน่วยความจำน่าจะน่าเป็นห่วงพอสมควร
แล้วถ้าไม่จำเป็นต้องมี dynamic lookup ตั้งแต่แรก จะมีเหตุผลอะไรให้พัฒนาเป็นสคริปต์ด้วยเหรอ?
perryฟังดูเพราะดีนะครับน่าสนใจดีนะ
ไอเดียและแนวทางดูดีมากจริง ๆ นะครับ
ดูเหมือนว่าจะรองรับไวยากรณ์ของ React ด้วย และพอเห็นว่ายังไม่รองรับพวก decorator อะไรทำนองนี้ ก็ดูเหมือนว่าตอนนี้น่าจะเหมาะกับการลองใช้ในโปรเจกต์ใหม่มากกว่าการย้ายโปรแกรมเดิม
ถ้าพัฒนาไปถึงระดับที่ย้ายได้ตามโรดแมปโดยแทบไม่มีค่าใช้จ่ายเพิ่ม การบิลด์แบบมัลติแพลตฟอร์มด้วยภาษาเดียวก็น่าจะสะอาดกว่าที่เป็นอยู่ตอนนี้มาก และคอขวดด้านประสิทธิภาพจากการบิลด์มัลติแพลตฟอร์มที่เดิมทำด้วย JavaScript ก็น่าจะหายไปเยอะด้วย
แต่ก็รู้สึกว่าทั้งเรื่องความเข้ากันได้และการรับประกันผลลัพธ์ที่เหมือนกันบนหลายแพลตฟอร์มนั้นน่าจะยากมาก และด้วยมุมมองอันน้อยนิดของผม ต่อให้เป็นยุค AI การดูแลรักษาก็คงไม่ง่าย เลยรู้สึกว่านอกจากข้อเดียวคือคนทำคงเหนื่อยหนักมากแล้ว ก็น่าคาดหวังมากจริง ๆ ครับ
น่าสนใจดีนะ