กลับไปยังบล็อก
tvOScross-compilationbillingWindowsmilestone

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 ทั้งหมด
  • เวอร์ชัน SDKsdk_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 storage SetPropW เพื่อป้องกัน panic ระหว่างข้อความ WM_PAINT ที่ซ้อนกัน
  • การรวม Geisterhand — วิดเจ็ตทุกประเภทลงทะเบียนกับเฟรมเวิร์กทดสอบ UI, /type ใช้ SendMessageW ผ่าน HWND map
  • รองรับกล้อง Android — API การจับภาพกล้องขยายไปยัง Android ผ่าน JNI

ประสิทธิภาพ

v0.4.14 ส่งมอบการตรวจสอบประสิทธิภาพอย่างครอบคลุม:

  • fcmp เนทีฟ — การเปรียบเทียบจุดทศนิยมใช้คำสั่ง CPU เนทีฟแทนการเรียกฟังก์ชันรันไทม์ Benchmark Mandelbrot เร็วขึ้น 30%
  • การต่อสตริงแบบ in-placestr += "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 ระดับโมดูล — ค่าที่พุชไปยังอาร์เรย์ระดับโมดูลภายในการเรียกฟังก์ชันซ้อนในลูปถูกสูญหายเนื่องจากตัวชี้ที่ล้าสมัยหลังการจัดสรรใหม่
  • การบังคับทางคณิตศาสตร์ของ nullnull + 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, หรือดู แผนงาน สำหรับภาพรวมทั้งหมด