tvOS, คอมไพล์ข้าม iOS จาก Linux และ Perry Login
ห้าวัน 120 คอมมิต และ Perry กระโดดจาก v0.4.0 เป็น v0.4.24 ไฮไลท์: tvOS กลายเป็นเป้าหมายการคอมไพล์ลำดับที่ 10, แอป iOS และ macOS สามารถสร้างได้ทั้งหมดจาก Linux, perry login นำเสนอการเรียกเก็บเงินตามการใช้งาน และ UI ของ Windows ได้รับการปรับปรุงครั้งใหญ่ นี่คือทุกอย่างที่ส่งมอบ
tvOS: เป้าหมายการคอมไพล์ลำดับที่ 10
Perry ตอนนี้คอมไพล์ไปยัง Apple TV เป้าหมาย tvOS ใช้ตัวเรนเดอร์ SwiftUI เดียวกับ watchOS แชร์สถาปัตยกรรมที่ขับเคลื่อนด้วยข้อมูลโดย Perry สร้างต้นไม้ UI และแอป Swift host ที่ส่งมาเรนเดอร์แบบเนทีฟ ร่วมกับการรวม WASM @perry/threads ที่มีอยู่ แอป tvOS สามารถรันงานหนักด้านการคำนวณในพื้นหลังในขณะที่ UI ตอบสนองได้
# Compile for Apple TV
perry compile main.ts --target tvos
# Run on tvOS simulator
perry run tvosสิ่งนี้ทำให้จำนวนเป้าหมายทั้งหมดเป็น 10: macOS, iOS, iPadOS, Android, Linux, Windows, watchOS, tvOS, WebAssembly และ Web/JavaScript โค้ดเบส TypeScript เดียว สิบเอาต์พุตเนทีฟ
ครอสคอมไพล์ iOS และ macOS จาก Linux
Perry ตอนนี้สามารถสร้างไบนารี iOS และ macOS ได้ทั้งหมดจากเครื่อง Linux โดยใช้ ld64.lld เป็นลิงก์เกอร์ Mach-O นี่คือชิ้นส่วนที่ขาดหายไปสำหรับ CI/CD อัตโนมัติเต็มรูปแบบ — พุช TypeScript ไปยังเซิร์ฟเวอร์ Linux รับไบนารีเนทีฟที่เซ็นชื่อสำหรับทุกแพลตฟอร์ม Apple โดยไม่ต้องมีเครื่องบิลด์ macOS
การมาถึงจุดนี้ต้องแก้ปัญหาลิงก์เกอร์แบบลูกโซ่:
- Triple codegen Mach-O — เพิ่ม target triple
aarch64-apple-macosและaarch64-apple-iosสำหรับ Cranelift - การลิงก์ Framework — เส้นทางค้นหา framework CoreGraphics, Metal, IOKit, DiskArbitration สำหรับครอสคอมไพล์
-lobjc— สัญลักษณ์ ObjC runtime ที่จำเป็นสำหรับเป้าหมาย Apple ทั้งหมด- เวอร์ชัน SDK —
sdk_version 26.0ใน ld64.lld (Apple ต้องการ iOS 18+) - การตัดโค้ดตาย —
-dead_stripแทน-Wl,-dead_stripสำหรับลิงก์เกอร์ Mach-O - การกำจัดรันไทม์ซ้ำ — ลบ
perry_runtimeที่ซ้ำกันจาก static lib UI เพื่อหลีกเลี่ยงข้อผิดพลาดลิงก์
ร่วมกับการครอสคอมไพล์ Linux → Windows ที่มีอยู่ (v0.2.195+) Perry ตอนนี้สามารถครอสคอมไพล์ไปยังทุกแพลตฟอร์มจาก Linux — iOS, macOS, Windows, Android, WASM และ Web
ความพร้อมสำหรับ App Store iOS
จุดสนใจหลักของรอบนี้คือการทำให้แอป iOS ที่คอมไพล์ด้วย Perry เป็นไปตามข้อกำหนด App Store อย่างสมบูรณ์:
- Info.plist เต็มรูปแบบ — คีย์ที่ Apple กำหนดทั้งหมด:
CFBundleIdentifier,CFBundleName,CFBundleShortVersionString,CFBundleVersion,UIDeviceFamily,UIRequiredDeviceCapabilities - CFBundleIcons — การตั้งชื่อไอคอน iOS มาตรฐาน (
AppIcon60x60@2x, ฯลฯ) พร้อมการแก้ไข fallback - เวอร์ชันจาก perry.toml — ฟิลด์
versionและbuild_numberไหลเข้า Info.plist โดยตรง - UILaunchScreen — ใช้คีย์สมัยใหม่แทน
UILaunchStoryboardName(ไม่ต้องใช้ไฟล์ storyboard) - โปรไฟล์การจัดเตรียม — รองรับโปรไฟล์การจัดเตรียม macOS สำหรับการแจกจ่าย App Store และ TestFlight
Perry Login และการเรียกเก็บเงิน
Perry ตอนนี้มีบัญชีและการเรียกเก็บเงินตามการใช้งาน ขับเคลื่อนโดยคำสั่ง CLI perry login ใหม่และแดชบอร์ดที่ app.perryts.com
วิธีการทำงาน
perry login— ขั้นตอนอุปกรณ์ GitHub OAuth เปิดเบราว์เซอร์ โพลล์เพื่อรอการเสร็จสิ้น- แผนฟรี — 15 บิลด์/เดือน โปรเจกต์ไม่จำกัดด้วยบัญชี GitHub
- แผน Pro — บิลด์ไม่จำกัดผ่านการสมัครสมาชิก Polar.sh
- โทเค็น API — สร้างและจัดการโทเค็นจากแดชบอร์ดสำหรับ CI/CD
- การติดตามการใช้งาน — ตัวนับ publish และ verify รายเดือนพร้อมแถบการใช้งานแบบเรียลไทม์
แดชบอร์ดเองเป็นเซิร์ฟเวอร์ Fastify ที่คอมไพล์ด้วย Perry พร้อม static export ของ Next.js — สร้างด้วย Perry ให้บริการผู้ใช้ Perry
การรับรอง macOS และการเซ็นโค้ด
ความสามารถในการเซ็นชื่อใหม่สองอย่าง:
perry publish macos --notarize— เปลี่ยนเป็นใบรับรอง Developer ID โดยอัตโนมัติ (แทนใบรับรอง App Store) ส่งไปยังบริการรับรองของ Apple และแนบผลลัพธ์- การเซ็นโค้ด GCloud KMS — บิลด์ Windows ตอนนี้สามารถเซ็นด้วยคีย์ Google Cloud KMS ช่วยให้การเซ็นชื่ออัตโนมัติใน CI โดยไม่เปิดเผยคีย์ส่วนตัว
การปรับปรุง UI Windows
แบ็กเอนด์ UI ของ Windows ได้รับการอัปเดตที่ครอบคลุมที่สุด:
- การปรับขนาดตาม DPI — ขนาดหน้าต่าง ฟอนต์ และขนาดวิดเจ็ตปรับขนาดอย่างถูกต้องบนจอแสดงผล DPI สูง
- API หน้าต่างสไตล์ launcher — หน้าต่างไร้ขอบพร้อมการวางตำแหน่งที่กำหนดเองสำหรับ UI สไตล์ launcher/spotlight
- ปุ่มลัดทั่วระบบ — ทางลัดแป้นพิมพ์ทั้งระบบที่ทำงานแม้ว่าแอปจะไม่ได้โฟกัส
- ไอคอนแอป — API
getAppIconสำหรับแสดงไอคอนแอปพลิเคชันใน UI ของ launcher - เลย์เอาต์ปลอดภัยจากการเข้าซ้ำ — การวาดตาม
RefCellถูกแทนที่ด้วย HWND storageSetPropWเพื่อป้องกัน panic ระหว่างข้อความ WM_PAINT ที่ซ้อนกัน - การรวม Geisterhand — วิดเจ็ตทุกประเภทลงทะเบียนกับเฟรมเวิร์กทดสอบ UI,
/typeใช้SendMessageWผ่าน HWND map - รองรับกล้อง Android — API การจับภาพกล้องขยายไปยัง Android ผ่าน JNI
ประสิทธิภาพ
v0.4.14 ส่งมอบการตรวจสอบประสิทธิภาพอย่างครอบคลุม:
fcmpเนทีฟ — การเปรียบเทียบจุดทศนิยมใช้คำสั่ง CPU เนทีฟแทนการเรียกฟังก์ชันรันไทม์ Benchmark Mandelbrot เร็วขึ้น 30%- การต่อสตริงแบบ in-place —
str += "text"แก้ไขบัฟเฟอร์ในที่แทนการจัดสรรสตริงใหม่ เร็วขึ้น 125 เท่าสำหรับการต่อซ้ำ - Short-circuit AND/OR —
&&และ||ข้ามการประเมินตัวดำเนินการด้านขวาเมื่อผลลัพธ์ถูกกำหนดแล้ว - การพับค่าคงที่ลบ —
-1,-0.5ฯลฯ ถูกพับเป็นค่าคงที่ในระดับ HIR แทนการปล่อยคำสั่งลบ
บิลด์ขนานบน Hub
เซิร์ฟเวอร์จัดการบิลด์ตอนนี้รองรับบิลด์พร้อมกันต่อเวิร์กเกอร์:
- การจัดส่งแบบสล็อต — เวิร์กเกอร์รายงานความจุ
max_concurrent, Hub ติดตามงานที่ใช้งานอยู่ต่อเวิร์กเกอร์ - ไม่มี 429 อีกต่อไป — งานเข้าคิวแทนที่จะถูกปฏิเสธเมื่อเวิร์กเกอร์ทั้งหมดยุ่ง
- ดาวน์โหลดอาร์ทิแฟกต์ Base64 — อาร์ทิแฟกต์ไบนารีให้บริการเป็น base64 เมื่อรันไทม์ Perry ไม่สามารถจัดการ HTTP response ไบนารีดิบ
- WebSocket เชื่อมต่อใหม่อัตโนมัติ — การเชื่อมต่อการตรวจสอบบิลด์เชื่อมต่อใหม่โดยอัตโนมัติเมื่อตัดการเชื่อมต่อ
แพ็คเกจใหม่: perry/appstorereview
แพ็คเกจ first-party ใหม่สำหรับการขอรีวิว App Store:
import { requestReview } from "perry/appstorereview";
// Opens the native review prompt
// iOS: SKStoreReviewController
// Android: Play In-App Review API
requestReview();ฟังก์ชันเดียว สองแพลตฟอร์ม UI รีวิวเนทีฟ ตรรกะการจับเวลาและการแสดงผลเป็นของนักพัฒนาทั้งหมด
การแก้ไข Codegen
120 คอมมิตหมายถึงการแก้ไขบั๊กจำนวนมาก สิ่งที่มีผลกระทบมากที่สุด:
- ความเท่าเทียมอย่างเข้มงวด (===) — แก้ไขบั๊กแยก 3 ตัวใน v0.4.2: การเปรียบเทียบแท็กชนิด การจัดการ NaN และการแยกแยะ null/undefined
- การเปรียบเทียบสตริงที่ต่อกัน —
===ล้มเหลวเมื่อเปรียบเทียบสตริงที่สร้างผ่านการต่อเนื่องจากการเปรียบเทียบตัวชี้แทนการเปรียบเทียบเนื้อหา - การแก้ไขคอนสตรักเตอร์ —
new X(args)ตอนนี้แก้ไขคอนสตรักเตอร์ที่นำเข้าข้ามโมดูลและฟังก์ชันคอนสตรักเตอร์ที่อิงจาก closure อย่างถูกต้อง - Array push ระดับโมดูล — ค่าที่พุชไปยังอาร์เรย์ระดับโมดูลภายในการเรียกฟังก์ชันซ้อนในลูปถูกสูญหายเนื่องจากตัวชี้ที่ล้าสมัยหลังการจัดสรรใหม่
- การบังคับทางคณิตศาสตร์ของ null —
null + 1ตอนนี้สร้าง1อย่างถูกต้องผ่านjs_number_coerce - การห่อ Bitwise NOT —
~xตอนนี้ห่อเป็น i32 ตามซีแมนทิกส์ ECMAScript - fetch().then() — callback ไม่เคยทำงานในแอป UI เนทีฟเนื่องจากขาดการระบาย event loop (v0.4.3)
- โมดูโลและเลขยกกำลัง WASM — ตัวดำเนินการ
%และ**ทำให้เกิดข้อผิดพลาดการตรวจสอบ WASM (v0.4.5)
ในตัวเลข
- ~120 คอมมิตในคอมไพเลอร์ Perry หลักใน 5 วัน
- 24 patch release: v0.4.1 → v0.4.24
- เป้าหมายการคอมไพล์: 9 → 10 (เพิ่ม tvOS)
- เป้าหมายครอสคอมไพล์จาก Linux: Windows → Windows, iOS, macOS (Apple ทั้งหมด + Windows)
- แพ็คเกจใหม่: perry/appstorereview
- โครงสร้างพื้นฐานใหม่: แดชบอร์ด app.perryts.com, CLI perry login, การเรียกเก็บเงิน Polar.sh
- เพิ่มประสิทธิภาพ: mandelbrot เร็วขึ้น 30% (fcmp เนทีฟ), การต่อสตริงเร็วขึ้น 125 เท่า
ขั้นตอนถัดไป
การครอสคอมไพล์ iOS และ macOS จาก Linux หมายความว่า Hub ตอนนี้สามารถสร้างสำหรับทุกแพลตฟอร์มจากเซิร์ฟเวอร์ Linux เดียว — ไม่ต้องมีเครื่องบิลด์ macOS เฉพาะสำหรับการคอมไพล์อีกต่อไป (เฉพาะสำหรับการเซ็นชื่อเท่านั้น) โครงสร้างพื้นฐานการเรียกเก็บเงินเปิดเส้นทางสู่เบต้าสาธารณะของ Hub และเมื่อเพิ่ม tvOS แล้ว Perry ครอบคลุมทุกแพลตฟอร์ม Apple: macOS, iOS, iPadOS, watchOS และ tvOS
- เบต้าสาธารณะ Hub — ผู้ใช้ภายนอกสามารถพุช TypeScript และรับไบนารีเนทีฟ
- รองรับ regex เต็มรูปแบบ — ช่องว่างภาษาหลักสุดท้าย
- การขยาย perry/ui — drag and drop, การเข้าถึง, DatePicker
- Source maps และข้อมูล debug — ข้อมูล debug DWARF สำหรับการ debug เนทีฟ
ติดตามความคืบหน้าบน GitHub, อ่านเอกสารที่ docs.perryts.com, หรือดู แผนงาน สำหรับภาพรวมทั้งหมด