คอมไพล์ข้ามแพลตฟอร์มไป Windows, Game Loop บน iOS และความเท่าเทียมของการทดสอบ 100%
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, หรือดู แผนงาน สำหรับภาพรวมทั้งหมด