แนะนำ Perry
เรายินดีที่จะแนะนำ Perry — คอมไพเลอร์ TypeScript แบบเนทีฟที่เขียนด้วย Rust ซึ่งคอมไพล์ TypeScript ของคุณโดยตรงเป็นไฟล์เรียกทำงานแบบสแตนด์อโลน ไม่ต้องใช้รันไทม์ Node.js ไม่ต้องใช้ Electron wrapper ไม่มีการประนีประนอม แค่โค้ดของคุณ คอมไพล์เป็นไบนารีเนทีฟที่ เริ่มต้นทันทีและรันได้ทุกที่
Perry เป็นการคิดใหม่พื้นฐานเกี่ยวกับสิ่งที่ TypeScript สามารถเป็นได้ แทนที่จะ ปฏิบัติต่อมันเป็นซูเปอร์เซ็ตของ JavaScript ที่ต้องรันผ่านเอนจิน JS นั้น Perry ปฏิบัติต่อ TypeScript เป็นภาษาระบบ — ภาษาที่บังเอิญมีไวยากรณ์ที่นักพัฒนาหลายล้าน คนรู้จักและชื่นชอบอยู่แล้ว
ทำไมเราถึงสร้าง Perry
TypeScript ได้กลายเป็นภาษากลางของการพัฒนาซอฟต์แวร์สมัยใหม่ เป็น ภาษาที่อยู่เบื้องหลังฟรอนต์เอนด์เว็บส่วนใหญ่ ส่วนแบ่งที่เพิ่มขึ้นของแบ็กเอนด์ และเป็น ตัวเลือกสำหรับเครื่องมือ สคริปต์ และระบบอัตโนมัติมากขึ้นเรื่อยๆ แต่มันมีข้อจำกัด พื้นฐานอยู่เสมอ: มันคอมไพล์เป็น JavaScript และ JavaScript ต้องการรันไทม์
รันไทม์นั้น — ไม่ว่าจะเป็น Node.js, Deno หรือ Bun — มาพร้อมกับข้อแลกเปลี่ยน เวลาเริ่มต้นแบบ Cold start วัดได้เป็นสิบหรือร้อยมิลลิวินาที โอเวอร์เฮดหน่วยความจำจาก คอมไพเลอร์ JIT และตัวเก็บขยะ การแจกจ่ายไบนารีที่ต้องบันเดิลรันไทม์ทั้งหมด หรือต้องการให้ผู้ใช้ติดตั้ง และสำหรับแอปพลิเคชัน GUI ตัวเลือกเดียว คือ Electron ซึ่งส่งเบราว์เซอร์ Chromium ทั้งหมดมาพร้อมกับแอปของคุณ
เราถามว่า: จะเป็นอย่างไรถ้า TypeScript ไม่ต้องผ่าน JavaScript เลย? จะเป็นอย่างไรถ้า คุณสามารถคอมไพล์มันเป็นโค้ดเครื่องเนทีฟโดยตรง เหมือนกับที่คุณคอมไพล์ Rust, Go หรือ C++?
Perry ทำงานอย่างไร
ไปป์ไลน์การคอมไพล์ของ Perry มีสามขั้นตอน:
- การแยกวิเคราะห์ — Perry ใช้ SWC (ตัวแยกวิเคราะห์ TypeScript/JavaScript ที่ใช้ Rust) เพื่อแยกวิเคราะห์ซอร์ส TypeScript ของคุณเป็น AST SWC เป็นตัวแยกวิเคราะห์เดียวกันที่ใช้โดย Next.js และมันเร็วมาก
- การคอมไพล์แบบขับเคลื่อนด้วยชนิดข้อมูล — Perry เดินผ่าน AST พร้อมข้อมูล ชนิดข้อมูลแบบเต็ม ต่างจากเอนจิน JS ที่ต้องจัดการกับชนิดข้อมูลแบบไดนามิกที่รันไทม์ Perry รู้ ทุกชนิดข้อมูลในเวลาคอมไพล์ ซึ่งทำให้สามารถมอโนมอร์ฟไอเซชันของเจเนอริก ดิสแพตช์แบบสแตติก ของการเรียกเมธอด และการปรับแต่งเลย์เอาต์หน่วยความจำโดยตรง
- การสร้างโค้ด — Perry สร้างโค้ดเครื่องเนทีฟโดยใช้ Cranelift ตัวสร้างโค้ดเดียวกันที่ใช้โดย Wasmtime และส่วนต่างๆ ของ Firefox JIT Cranelift ผลิตโค้ดเนทีฟที่มีประสิทธิภาพสำหรับ x86_64 และ ARM64
ผลลัพธ์คือไฟล์เรียกทำงานแบบสแตนด์อโลน — โดยทั่วไป 2-5 MB สำหรับเครื่องมือ CLI — ที่เริ่มต้น ทันทีโดยไม่มีเวลาอุ่นเครื่อง
$ perry build app.ts
Parsing app.ts...
Compiling (cranelift, arm64)...
Linking...
✓ Built executable: app (2.3 MB)
$ ./app
Hello from native TypeScript!
$ file app
app: Mach-O 64-bit executable arm64
ฟีเจอร์ TypeScript ใดบ้างที่รองรับ
Perry รองรับซับเซ็ตที่กว้างและเติบโตของ TypeScript เป้าหมายคือความเข้ากันได้อย่างเต็มที่ กับภาษาอย่างที่นักพัฒนาใช้จริง ปัจจุบันรวมถึง:
- ชนิดข้อมูลพื้นฐานทั้งหมด — string, number, boolean, null, undefined, bigint, symbol
- อินเทอร์เฟซและ type aliases — รวมถึง union types, intersection types และ mapped types
- เจเนอริก — คอมไพล์ผ่านมอโนมอร์ฟไอเซชัน ดังนั้น
Array<number>และArray<string>สร้างเส้นทางโค้ดที่ปรับแต่งแยกกัน - คลาส — พร้อมการสืบทอด ฟิลด์ส่วนตัว (
#field), สมาชิกสแตติก, getters/setters และ decorators - Async/await และ Promises — คอมไพล์เป็น state machine คล้ายกับวิธีที่ Rust จัดการ async
- Generators และ iterators —
function*และลูปfor...of - Closures — พร้อมซีแมนติกส์การจับค่าที่ถูกต้อง
- การ Destructuring — อาร์เรย์ ออบเจ็กต์ รูปแบบซ้อนกัน และ rest elements
- Template literals — รวมถึง tagged templates
- โมดูล — ESM imports/exports ที่แก้ไขในเวลาคอมไพล์
UI เนทีฟข้ามแพลตฟอร์ม
Perry ไม่ได้จำกัดเฉพาะเครื่องมือ CLI และแอปพลิเคชันฝั่งเซิร์ฟเวอร์ มันมาพร้อมกับเฟรมเวิร์ก UI เนทีฟสำหรับหกแพลตฟอร์ม:
- macOS — AppKit (NSWindow, NSView, NSButton, NSTextField และอื่นๆ)
- iOS — UIKit (UIViewController, UIView, UIButton, UITableView)
- iPadOS — UIKit (API เดียวกับ iOS พร้อมการปรับแต่งเฉพาะสำหรับ iPad)
- Android — JNI + Android Views (Activity, View, Button, RecyclerView)
- Linux — GTK4 (GtkWindow, GtkBox, GtkButton, GtkEntry)
- Windows — Win32 (CreateWindowEx, common controls, GDI)
ข้อมูลเชิงลึกที่สำคัญคือ Perry แมป API TypeScript ทั่วไปไปยัง toolkit วิดเจ็ตเนทีฟของแต่ละแพลตฟอร์มในเวลาคอมไพล์ ไม่มีเลเยอร์บริดจ์ ไม่มี web view และ ไม่มีเอนจินเรนเดอร์แบบกำหนดเอง แอปของคุณใช้วิดเจ็ตแพลตฟอร์มจริง เรนเดอร์โดย ระบบปฏิบัติการเอง อ่านเพิ่มเติมในบทความเชิงลึกของเรา: UI เนทีฟข้ามแพลตฟอร์มจาก TypeScript.
มากกว่า 27 การใช้งานแพ็กเกจ npm แบบเนทีฟ
หนึ่งในความท้าทายเชิงปฏิบัติที่ใหญ่ที่สุดของคอมไพเลอร์ใหม่คือความเข้ากันได้กับระบบนิเวศ นักพัฒนาไม่ได้แค่เขียนโค้ดจากศูนย์ — พวกเขาใช้แพ็กเกจ Perry แก้ไข สิ่งนี้ด้วยการใช้งานเนทีฟของแพ็กเกจ npm ยอดนิยมมากกว่า 27 รายการ:
- ฐานข้อมูล — mysql2, pg, mongodb, better-sqlite3, ioredis
- HTTP — axios, express, ws (WebSockets)
- ความปลอดภัย — bcrypt, jsonwebtoken, crypto
- ยูทิลิตี้ — uuid, chalk, dotenv, lodash (บางส่วน), moment
- ระบบ — fs-extra, glob, chokidar, commander
เหล่านี้ไม่ใช่ wrapper แบบบางๆ รอบโมดูล Node.js มันถูกคอมไพล์โดยตรง เข้าไปในไบนารีของคุณโดยใช้ไลบรารีระบบเนทีฟ — libpq สำหรับ PostgreSQL, OpenSSL สำหรับ crypto, libcurl สำหรับ HTTP พื้นผิว API ตรงกับสิ่งที่คุณคาดหวังจากแพ็กเกจ npm ดังนั้นการย้ายจึงทำได้ง่าย
เลเยอร์ความเข้ากันได้ V8 แบบเสริม
สำหรับแพ็กเกจ npm ที่ยังไม่มีการใช้งาน Perry แบบเนทีฟ Perry มีโหมด ฝัง V8 แบบเสริม เมื่อเปิดใช้งาน Perry จะบันเดิลรันไทม์ V8 และสามารถรัน แพ็กเกจ npm JavaScript มาตรฐานควบคู่กับ TypeScript ที่คอมไพล์แล้วของคุณ นี่เป็นทางออก ที่ใช้งานได้จริงซึ่งช่วยให้คุณนำ Perry มาใช้ทีละน้อย — คอมไพล์เส้นทางที่ร้อนเป็นโค้ด เนทีฟในขณะที่ยังเข้าถึงระบบนิเวศ npm ทั้งหมดสำหรับทุกอย่างอื่น
การคอมไพล์ข้ามแพลตฟอร์ม
Perry รองรับการคอมไพล์ข้ามแพลตฟอร์มตั้งแต่แกะกล่อง จากเครื่อง macOS สำหรับพัฒนาของคุณ คุณสามารถคอมไพล์สำหรับ Linux (x86_64 และ ARM64) และ iOS ซึ่งหมายความว่าคุณสามารถสร้าง ไปป์ไลน์ CI/CD บน macOS และผลิตไบนารีสำหรับเป้าหมายการปรับใช้ทั้งหมดของคุณโดย ไม่ต้องมีเครื่อง build เฉพาะสำหรับแต่ละแพลตฟอร์ม
# Build for Linux from macOS
$ perry build app.ts --target linux-x86_64
✓ Built executable: app (3.1 MB)
# Build for iOS from macOS
$ perry build app.ts --target ios-arm64
✓ Built executable: app (4.8 MB)
ประสิทธิภาพ
ไบนารีที่คอมไพล์โดย Perry นั้นเร็ว เนื่องจากไม่มีการอุ่น JIT ไม่มีโอเวอร์เฮดของ อินเทอร์พรีเตอร์ และไม่มีการหยุดชะงักของตัวเก็บขยะ ประสิทธิภาพจึงคาดเดาได้และสม่ำเสมอ ตั้งแต่การเรียกใช้ครั้งแรก
จากการทดสอบประสิทธิภาพของเรา:
- เวลาเริ่มต้น — แทบ 0 ms (การเปิดโปรเซสเนทีฟ)
- ขนาดไบนารี — 2-5 MB สำหรับเครื่องมือ CLI ทั่วไป (เทียบกับ 50+ MB สำหรับ Node.js ที่บันเดิล)
- การใช้หน่วยความจำ — น้อยกว่า 5-10 เท่าเมื่อเทียบกับแอปพลิเคชัน Node.js ที่เทียบเท่า
- ปริมาณงาน — แข่งขันได้กับ C ที่เขียนด้วยมือสำหรับงานที่ใช้การคำนวณมาก
คุณสามารถดูการทดสอบประสิทธิภาพสดได้ที่ demo.perryts.com ซึ่งเปรียบเทียบไฟล์เรียกทำงานที่คอมไพล์โดย Perry กับ Node.js และ Bun แบบเรียลไทม์
สถานะปัจจุบัน
Perry อยู่ในระหว่างการพัฒนาอย่างแข็งขัน คอมไพเลอร์มีเสถียรภาพโดยผ่าน 62 จาก 62 การทดสอบ ทั้งชุดทดสอบ แบ็กเอนด์ UI ทั้งหกแพลตฟอร์มทำงานได้ ฟีเจอร์หลัก ของภาษามีความแข็งแกร่งและกำลังขยายตัว
เรากำลังทำงานอย่างแข็งขันในการขยายไลบรารีวิดเจ็ต UI ปรับปรุงประสิทธิภาพของสตริงและ ออบเจ็กต์ ทำให้การรองรับ regex สมบูรณ์ และสร้างโมดูล Stream ในระยะยาว เรากำลังวางแผนเป้าหมายการคอมไพล์ WASM, multi-threading, ส่วนขยาย VS Code และการรวมเข้ากับตัวจัดการแพ็กเกจ
ดูแผนงานทั้งหมดสำหรับ รายละเอียดเกี่ยวกับสิ่งที่เปิดตัวแล้ว สิ่งที่กำลังดำเนินการ และสิ่งที่จะมาถัดไป
เริ่มต้นใช้งาน
Perry เป็นโอเพนซอร์ส คุณสามารถโคลนรีโป สร้างจากซอร์สโค้ด และเริ่มคอมไพล์ TypeScript ได้วันนี้:
$ git clone https://github.com/PerryTS/perry.git
$ cd perry
$ cargo build --release
# Compile your first TypeScript file
$ ./target/release/perry build hello.ts
✓ Built executable: hello (2.1 MB)
$ ./hello
Hello, world!
เรียกดูซอร์สโค้ดบน GitHub, ดู showcase เพื่อดูว่ามีอะไรถูกสร้างด้วย Perry หรือกระโดดเข้าสู่โค้ดเลย เรารอไม่ไหวที่จะเห็นสิ่งที่คุณจะสร้าง