tvOS, คอมไพล์ข้าม iOS จาก Linux และ Perry Login
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.
ห้าวัน 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, หรือดู แผนงาน สำหรับภาพรวมทั้งหมด
ชอบโพสต์นี้ใช่ไหม? รับโพสต์ถัดไป
บันทึกสั้น ๆ เกี่ยวกับการอัปเดตของ Perry และสิ่งที่เรากำลังสร้างต่อไป
Your email is sent to Resend for the Perry newsletter. You can request unsubscribe or deletion at any time. Privacy notice