คอมไพล์ข้ามแพลตฟอร์มไป Windows, Game Loop บน iOS และความเท่าเทียมของการทดสอบ 100%
This dated article records the Perry version and measurements available when it was published. Use the current limitations, platform guide, and benchmark artifact for decisions today.
103 คอมมิตในคอมไพเลอร์ Perry สัปดาห์นี้ ฟีเจอร์หลัก: ตอนนี้สามารถครอสคอมไพล์ไฟล์ปฏิบัติการ Windows จาก Linux ได้แล้ว, แอป iOS สามารถรันเกมลูปแบบบล็อกกิ้ง, คอมไพเลอร์รายงานการแครชสำหรับเทเลเมทรี และคอมไพเลอร์แบบเซลฟ์โฮสติ้งผ่านทุกเทสต์เชิงกำหนดที่เราทดสอบ นอกจากนี้ยังมีการอัปเกรดโครงสร้างพื้นฐาน Hub ครั้งใหญ่และแก้ไขบั๊กมากกว่า 50 รายการ
ครอสคอมไพล์ไปยัง Windows จาก Linux
Perry ตอนนี้สามารถผลิตไบนารี Windows .exe จากโฮสต์ Linux ได้แล้ว นี่คือชิ้นส่วนที่ขาดหายไปสำหรับไปป์ไลน์ CI/CD ที่ต้องการเป้าหมาย Windows โดยไม่ต้องรันเครื่องบิลด์ Windows สำหรับการคอมไพล์ทั้งหมด
การใช้งานนี้แทนที่การตรวจสอบ #[cfg] ในเวลาคอมไพล์ด้วยการตรวจจับเป้าหมายในขณะรันไทม์ เมื่อคอมไพเลอร์เห็นเป้าหมาย Windows บนโฮสต์ที่ไม่ใช่ Windows จะค้นหา lld-link, llvm-nm และ llvm-ar จากทูลเชน Rust หรือ PATH ผ่านเฮลเปอร์ใหม่ find_llvm_tool() ไลบรารีระบบ Windows มาจาก sysroot สไตล์ xwin ที่ชี้โดย PERRY_WINDOWS_SYSROOT
ลิงก์เกอร์ใช้ /FORCE:UNRESOLVED โดยอัตโนมัติและสร้างสตับสำหรับสัญลักษณ์ UI ที่ขาดหายไป ดังนั้นแอป CLI จึงครอสคอมไพล์ได้อย่างราบรื่น เอาต์พุตจะเป็น .exe โดยค่าเริ่มต้นเมื่อเป้าหมายเป็น Windows รายละเอียดทั้งหมดอยู่ใน เอกสารครอสคอมไพล์
$ perry compile main.ts --target windows
Compiling main.ts for windows-x86_64...
Using lld-link from Rust toolchain
✓ Compiled executable: main.exe (2.8 MB)
รองรับเกมลูปบน iOS
iOS ต้องการให้ UIKit เป็นเจ้าของเธรดหลัก ซึ่งไม่มีปัญหาสำหรับแอปที่ขับเคลื่อนด้วยเหตุการณ์ แต่เป็นปัญหาสำหรับเกมที่ต้องการลูปบล็อกกิ้ง while (!shouldClose) ตอนนี้ Perry แก้ปัญหานี้ด้วยแฟล็ก --features ios-game-loop
เมื่อเปิดใช้งาน คอมไพเลอร์จะปล่อย _perry_user_main แทน main รันไทม์จัดเตรียม main() ที่เรียก UIApplicationMain บนเธรดหลักและสปอว์นโค้ดของคุณบนเธรดพื้นหลัง Scene delegate และ app delegate จัดการวงจรชีวิต UIKit เต็มรูปแบบในขณะที่เกมลูปของคุณรันโดยไม่ถูกบล็อก
// Your game loop runs on a background thread
while (!shouldClose) {
update();
render();
awaitNextFrame();
}
$ perry run ios --features ios-game-loop
สิ่งนี้เปิดใช้งานแอปทั้งหมวดหมู่ — เกม, การจำลอง, การแสดงผลแบบเรียลไทม์ — ที่ไม่สามารถทำได้จริงบน iOS ก่อนหน้านี้ เส้นทาง pump และ callback ของ iOS ตอนนี้ยังถูกห่อหุ้มด้วยการจัดการ panic ดังนั้นการแครชทั้งในเกมลูปและวงจรชีวิต UIKit จะถูกจับได้อย่างสะอาด
การรายงานการแครช
แอปที่คอมไพล์ด้วย Perry ตอนนี้ติดตั้ง panic hook และตัวจัดการสัญญาณสำหรับ SIGSEGV, SIGBUS และ SIGABRT เมื่อเริ่มต้น เมื่อเกิดการแครชร้ายแรง รายละเอียดจะถูกเขียนลง ~/.hone/crash.log สำหรับระบบเทเลเมทรี Chirp แพนิคที่ถูกจับได้ (ใน catch_callback_panic) จะล้างล็อก ดังนั้นเฉพาะการแครชที่ไม่สามารถกู้คืนได้อย่างแท้จริงเท่านั้นที่จะถูกรายงาน
นี่คือฟีเจอร์ความพร้อมสำหรับการใช้งานจริง เมื่อมีสิ่งผิดพลาดเกิดขึ้นในสนาม เราจะรู้ — และล็อกการแครชมีบริบทเพียงพอที่จะวินิจฉัยปัญหาโดยไม่ต้องให้ผู้ใช้รายงานอะไรด้วยตนเอง
Hub: ไปป์ไลน์บิลด์ Windows สองขั้นตอน
โครงสร้างพื้นฐานการบิลด์ของ Perry Hub ได้รับการอัปเกรดสถาปัตยกรรมอย่างสำคัญ ก่อนหน้านี้ การบิลด์สำหรับ Windows ต้องการเวิร์กเกอร์ Windows สำหรับการคอมไพล์ทั้งหมด ตอนนี้ไปป์ไลน์แบ่งออกเป็นสองขั้นตอน:
- เวิร์กเกอร์ Linux ครอสคอมไพล์อาร์ทิแฟกต์ Windows โดยใช้การรองรับ lld-link ใหม่
- Hub เก็บอาร์ทิแฟกต์ที่คอมไพล์ไว้ล่วงหน้าและส่งงานกลับเข้าคิวสำหรับเวิร์กเกอร์ Windows
- เวิร์กเกอร์ Windows จัดการเฉพาะการเซ็นชื่อและแพ็กเกจ — งานที่เบากว่ามาก
เมื่อเวิร์กเกอร์ส่ง complete พร้อมกับ needs_finishing: "windows" Hub จะส่งงานกลับเข้าคิวอย่างโปร่งใส CLI เห็นประสบการณ์บิลด์เดียวที่ราบรื่น
Hub ตอนนี้ยังเริ่มต้น VM Azure Windows อัตโนมัติเมื่อไม่มีเวิร์กเกอร์ Windows เชื่อมต่ออยู่ และเวิร์กเกอร์บิลด์อัปเดตอัตโนมัติเป็นเวอร์ชัน Perry ล่าสุดเมื่อมีรีลีสใหม่ จัดการโครงสร้างพื้นฐานด้วยตนเองน้อยลง บิลด์เร็วขึ้น
การปรับปรุงเอกสาร
การเขียนเอกสารใหม่ครั้งสำคัญสองรายการถูกเผยแพร่ในสัปดาห์นี้บน docs.perryts.com:
- อ้างอิง perry.toml — เอกสารส่วนที่ครอบคลุมทุกตัวเลือกการตั้งค่า, การแก้ไข bundle ID, การแก้ไขไฟล์เข้า, การเพิ่มหมายเลขบิลด์อัตโนมัติ และตัวอย่าง CI/CD
- อ้างอิง Geisterhand — เอกสาร API เต็มรูปแบบ, การตั้งค่าแพลตฟอร์ม, รูปแบบการทดสอบอัตโนมัติ และภาพรวมสถาปัตยกรรมสำหรับเฟรมเวิร์กทดสอบ UI ข้ามแพลตฟอร์ม
เหล่านี้ไม่ใช่การอัปเดตเพิ่มเติม ทั้งสองเป็นการเขียนใหม่ตั้งแต่ต้นที่ครอบคลุมทุกฟีเจอร์และตัวเลือกการตั้งค่า หากคุณกำลังตั้งค่าโปรเจกต์ใหม่หรือเขียนเทสต์ ให้เริ่มที่นี่
API เมนูข้ามแพลตฟอร์ม
menuClear และ menuAddStandardAction ก่อนหน้านี้ใช้ได้เฉพาะ macOS ตอนนี้ใช้งานได้บนทั้ง 6 แพลตฟอร์มเนทีฟ ซึ่งรวมถึงการแก้ไข panic ของ RefCell re-entrancy ใน dispatch_menu_item บน Windows
Android: การจัดเรียงหน้า 16 KB
Google Play ตอนนี้ต้องการการจัดเรียงหน้า 16 KB สำหรับไลบรารีเนทีฟ Perry ตั้งค่า CARGO_TARGET_AARCH64_LINUX_ANDROID_RUSTFLAGS ที่เหมาะสมโดยอัตโนมัติ และไฟล์ .so แบบคู่กันจะถูกคัดลอกไว้ข้างเอาต์พุตสำหรับการรวมเข้า APK/AAB
Perry React: บอร์ด Kanban
เลเยอร์ความเข้ากันได้ของ React ได้รับการทดสอบในโลกจริง: บอร์ด Kanban เต็มรูปแบบ 5 คอลัมน์พร้อมการย้าย เพิ่ม ลบ และดู การสร้างมันค้นพบและแก้ไขการเรนเดอร์ children อาร์เรย์ซ้อนใน JSX — ตัวจัดการแบบเรียกซ้ำ _appendChildren ตอนนี้ทำให้อาร์เรย์ที่ส่งกลับจากการเรียก .map() แบนราบอย่างถูกต้อง นอกจากนี้ยังมีเดโม Kitchen Sink WorkBench 14 ส่วนใหม่ที่ครอบคลุมรูปแบบ UI ต่างๆ
Anvil: ความเท่าเทียมเทสต์เชิงกำหนด 100%
perrysdad — คอมไพเลอร์ LLVM แบบเซลฟ์โฮสติ้งที่เขียนด้วย TypeScript และคอมไพล์โดย Perry — ตอนนี้ผ่าน 68 จาก 68 เทสต์เชิงกำหนด ตรงกับเอาต์พุตของคอมไพเลอร์หลักอย่างแม่นยำ ความแตกต่างเพียงอย่างเดียวคือสิ่งที่เป็นธรรมชาติ (timestamps, Math.random()) และ 11 เทสต์ถูกข้ามเนื่องจากต้องการ UI, ตัวจับเวลา, การเข้ารหัส หรือฟีเจอร์เฉพาะแพลตฟอร์มที่ยังไม่ได้ใช้งาน
งานสำคัญที่ทำให้บรรลุเป้าหมาย:
- การดิสแพตช์เมธอดของอินเทอร์เฟซ — ตัวแปรที่มีชนิดเป็นอินเทอร์เฟซตอนนี้คืนค่าเมธอดที่ถูกต้องผ่านการดิสแพตช์ตาม class_id ใน ObjectHeader
- การเข้าถึงคุณสมบัติแบบไดนามิก — การดิสแพตช์ขณะรันไทม์สำหรับชื่อคุณสมบัติที่คำนวณ
- คลอเชอร์และ this-binding — ซีแมนทิกส์การจับที่ถูกต้องสำหรับเมธอดของอ็อบเจกต์
- เฟส 6 กำลังดำเนินการ — async/await, เจนเนอเรเตอร์ และการแก้ไขเงื่อนไข
ความเท่าเทียม 100% บนเทสต์เชิงกำหนดเป็นก้าวสำคัญ หมายความว่าไบนารี anvil ที่คอมไพล์ตัวเองผลิตเอาต์พุตเดียวกันทุกประการกับคอมไพเลอร์หลักสำหรับทุกสถานการณ์ที่ทดสอบได้ ช่องว่างกำลังลดลงมุ่งสู่การเซลฟ์โฮสติ้งเต็มรูปแบบ
แก้ไขบั๊กมากกว่า 50 รายการ
การผลักดันความถูกต้องครั้งใหญ่ในสัปดาห์นี้ ไฮไลท์:
- JSON.parse — อาร์เรย์ไม่ถูกตัดที่ 16 องค์ประกอบอีกต่อไป, อินพุตที่ไม่ถูกต้องถูกจัดการอย่างถูกต้อง
- Uint8Array — คอนสตรักเตอร์จากตัวแปรอาร์เรย์, การใช้งาน
.set(source, offset)(เคยเป็น no-op) - BigInt — NaN-boxing ด้วย
BIGINT_TAGสำหรับการเรียกข้ามโมดูล, การแก้ไขการตัด 32 บิตของ keccak256 - Optional chaining — นิพจน์เงื่อนไขซ้อน, การตรวจจับ toString, NaN-boxing ของค่าที่ส่งกลับ
- IndexSet — แก้ไข NaN-boxing ของสตริงให้ใช้
STRING_TAGแทนPOINTER_TAG - MySQL — ชนิด DATETIME และ BLOB, คอนสตรักเตอร์
Date(string) - Math.min/max — การจัดการอาร์กิวเมนต์ spread
- การดิสแพตช์เมธอดเนทีฟ — field-scan-and-call สำหรับอ็อบเจกต์
POINTER_TAG
เหล่านี้ไม่ใช่กรณีขอบ JSON.parse ที่ตัดอาร์เรย์ที่ 16 องค์ประกอบจะทำลายแอปพลิเคชันจริงทุกตัว Uint8Array.set ที่เป็น no-op จะทำให้ข้อมูลเสียหายอย่างเงียบๆ เหล่านี้คือการแก้ไขที่ทำให้คอมไพเลอร์พร้อมสำหรับการใช้งานจริง หนึ่งบั๊กความถูกต้องในแต่ละครั้ง
ในตัวเลข
- 103 คอมมิตในคอมไพเลอร์ Perry หลัก
- 3 เวอร์ชัน: v0.2.195, v0.2.196, v0.2.197
- 1 ฟีเจอร์หลัก: ครอสคอมไพล์ Windows จาก Linux
- 1 หมวดหมู่แอปใหม่: เกมลูป iOS
- 68/68 ความเท่าเทียมเทสต์เชิงกำหนดใน perrysdad
- แก้ไขบั๊กมากกว่า 50 รายการใน NaN-boxing, stdlib และ FFI เนทีฟ
- 2 การเขียนเอกสารใหม่: perry.toml และ Geisterhand
- 5 การปรับปรุง Hub: ไปป์ไลน์สองขั้นตอน, การเริ่มต้น Azure อัตโนมัติ, การอัปเดตเวิร์กเกอร์อัตโนมัติ
ขั้นตอนถัดไป
การครอสคอมไพล์ Windows เปิดประตูสู่ CI/CD หลายแพลตฟอร์มแบบอัตโนมัติเต็มรูปแบบ — พุช TypeScript รับไบนารีเนทีฟสำหรับทุกเป้าหมายโดยไม่ต้องมีเครื่องบิลด์เฉพาะสำหรับแต่ละ OS การรองรับเกมลูปปลดล็อกหมวดหมู่แอป iOS ใหม่ทั้งหมด และความเท่าเทียมเทสต์เชิงกำหนด 100% ใน perrysdad หมายความว่าการเซลฟ์โฮสติ้งกำลังกลายเป็นจริง สิ่งที่เหลือ:
- รองรับ regex เต็มรูปแบบ — ช่องว่างภาษาหลักสุดท้าย
- การขยาย perry/ui — drag and drop, ป้ายกำกับการเข้าถึง, DatePicker
- perrysdad เฟส 6 — async/await, เจนเนอเรเตอร์, ขยายไปสู่ความเท่าเทียม Perry เต็มรูปแบบ
- เบต้าสาธารณะ Hub — เปิดบิลด์แบบกระจายให้ผู้ใช้ภายนอก
ติดตามความคืบหน้าบน GitHub, อ่านเอกสารที่ docs.perryts.com, หรือดู แผนงาน สำหรับภาพรวมทั้งหมด
ชอบโพสต์นี้ใช่ไหม? รับโพสต์ถัดไป
บันทึกสั้น ๆ เกี่ยวกับการอัปเดตของ Perry และสิ่งที่เรากำลังสร้างต่อไป
Your email is sent to Resend for the Perry newsletter. You can request unsubscribe or deletion at any time. Privacy notice