กลับไปยังบล็อก
compilercross-compilationinfrastructuremilestone

คอมไพล์ข้ามแพลตฟอร์มไป 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 รายละเอียดทั้งหมดอยู่ใน เอกสารครอสคอมไพล์

terminal — Linux host

$ 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 เต็มรูปแบบในขณะที่เกมลูปของคุณรันโดยไม่ถูกบล็อก

main.ts

// Your game loop runs on a background thread

while (!shouldClose) {

update();

render();

awaitNextFrame();

}

terminal

$ 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 สำหรับการคอมไพล์ทั้งหมด ตอนนี้ไปป์ไลน์แบ่งออกเป็นสองขั้นตอน:

  1. เวิร์กเกอร์ Linux ครอสคอมไพล์อาร์ทิแฟกต์ Windows โดยใช้การรองรับ lld-link ใหม่
  2. Hub เก็บอาร์ทิแฟกต์ที่คอมไพล์ไว้ล่วงหน้าและส่งงานกลับเข้าคิวสำหรับเวิร์กเกอร์ Windows
  3. เวิร์กเกอร์ 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, หรือดู แผนงาน สำหรับภาพรวมทั้งหมด