Bitrig แอปพลิเคชัน iOS ที่สร้างและรันแอปพลิเคชัน Swift แบบไดนามิกบน iPhone ได้จุดประกายการอภิปรายอย่างมากเกี่ยวกับนโยบาย App Store ของ Apple และขอบเขตของสิ่งที่เป็นไปได้ทางเทคนิคบนอุปกรณ์ iOS แอปนี้ใช้ Swift interpreter ที่เป็นนวัตกรรมใหม่ที่ช่วยให้ผู้ใช้สามารถรันโค้ดที่สร้างแบบไดนามิกได้โดยไม่ต้องผ่านการคอมไพล์แบบดั้งเดิม ทำให้เกิดคำถามเกี่ยวกับจุดยืนที่เข้มงวดในอดีตของ Apple เรื่องโค้ดที่สามารถเรียกใช้งานได้
ความกังวลเรื่องนโยบาย App Store ขับเคลื่อนการอภิปรายในชุมชน
การอภิปรายที่ร้อนแรงที่สุดมุ่งเน้นไปที่แนวทางของ App Store ของ Apple โดยเฉพาะมาตรา 2.5.2 ซึ่งในอดีตห้ามไม่ให้แอปดาวน์โหลดหรือเรียกใช้โค้ดที่เปลี่ยนแปลงการทำงาน สมาชิกในชุมชนแสดงความประหลาดใจที่ Bitrig ได้รับการอนุมัติ เนื่องจากข้อจำกัดเหล่านี้ การอภิปรายเผยให้เห็นว่านโยบายของ Apple ได้พัฒนาไปอย่างไรนับตั้งแต่ Swift Playgrounds เปิดตัว โดยบริษัทตอนนี้อนุญาตให้เครื่องมือการศึกษาและการพัฒนามีความยืดหยุ่นมากขึ้น
แน่นอนว่ามีการไปมาอย่างแน่นอนก่อนที่เราจะได้รับการอนุมัติในที่สุด ในแง่หนึ่ง สิ่งนี้ไม่ได้แตกต่างจากสิ่งที่ React Native ทำมากนัก (รันโค้ดที่แปลความหมายแล้วเรียกใช้โค้ดดั้งเดิม) แค่ใช้ Swift แทน JavaScript
การอนุมัติแสดงให้เห็นว่า Apple กำลังผ่อนปรนมากขึ้นกับเครื่องมือการพัฒนา ดังที่เห็นได้จากแอปเขียนโค้ดอื่นๆ เช่น Python IDEs และ Jupyter Notebooks ที่ตอนนี้มีใน App Store อย่างไรก็ตาม สมาชิกในชุมชนสังเกตว่าข้อยกเว้นนี้ใช้กับเครื่องมือการพัฒนาโดยเฉพาะ ไม่ใช่แอปผู้บริโภคทั่วไป
การอ้างอิงนโยบาย App Store
- มาตรา 2.5.2 ของ App Review Guidelines โดยปกติจะห้ามการดาวน์โหลดหรือการรันโค้ดที่เปลี่ยนแปลงฟังก์ชันการทำงานของแอป
- แอปเพื่อการศึกษาและการพัฒนามีข้อยกเว้นจำกัดสำหรับโค้ดที่สามารถรันได้
- การอนุมัติล่าสุดรวมถึง Python IDEs , Jupyter Notebooks และสภาพแวดล้อมการเขียนโค้ดอื่น ๆ
การใช้งานทางเทคนิคจุดประกายการอภิปราย
แนวทางที่ผิดปกติของ interpreter - การแปลความหมาย Swift เป็น Swift แทนที่จะเป็นโค้ดเครื่อง - ได้สร้างการอภิปรายทางเทคนิคเกี่ยวกับสิ่งที่ถือเป็นการแปลความหมายที่แท้จริงเมื่อเทียบกับการคอมไพล์ นักพัฒนาบางคนชี้ให้เห็นว่า Swift มีความสามารถ REPL (Read-Eval-Print Loop) อยู่แล้วผ่านเครื่องมือบรรทัดคำสั่ง โดยตั้งคำถามว่าสิ่งนี้เป็นการพัฒนาที่แท้จริงในการแปลความหมาย Swift หรือไม่
ความแตกต่างที่สำคัญอยู่ที่แพลตฟอร์มเป้าหมาย ในขณะที่ Swift บนเดสก์ท็อปสามารถใช้การคอมไพล์ Just-In-Time ข้อจำกัดด้านความปลอดภัยของ iOS ป้องกันการสร้างโค้ดที่เรียกใช้งานได้แบบกำหนดเอง Bitrig แก้ปัญหานี้โดยการแยกวิเคราะห์ไวยากรณ์ Swift และแมปไปยังการเรียกใช้เฟรมเวิร์กระบบที่คอมไพล์ไว้แล้ว โดยทำหน้าที่เป็นอินเทอร์เฟซที่ซับซ้อนระหว่างโค้ดไดนามิกและไลบรารีที่คอมไพล์แล้ว
ภาพรวมสถาปัตยกรรมทางเทคนิค
- ใช้ SwiftSyntax ในการแยกวิเคราะห์โค้ด Swift เป็น abstract syntax trees
- จับคู่การเรียกใช้ Swift แบบไดนามิกกับฟังก์ชันเฟรมเวิร์กที่คอมไพล์แล้ว
- รองรับทั้ง SwiftUI และ UIKit ผ่านการแยกวิเคราะห์ไฟล์ .swiftinterface
- ทำหน้าที่เป็น "foreign function interface ที่ปรับปรุงแล้ว" จาก Swift แบบไดนามิกไปยัง Swift ที่คอมไพล์แล้ว
ประสิทธิภาพและการประยุกต์ใช้งานจริง
ความสนใจของชุมชนขยายไปเกินกว่าความแปลกใหม่ทางเทคนิคไปสู่การประยุกต์ใช้งานจริง นักพัฒนาตื่นเต้นเป็นพิเศษเกี่ยวกับการใช้งานที่เป็นไปได้สำหรับ hot module replacement - การอัปเดต SwiftUI views ในแอปที่ทำงานอยู่โดยไม่ต้องรีสตาร์ท สิ่งนี้อาจปรับปรุงประสบการณ์การพัฒนาสำหรับแอป iOS ได้อย่างมาก
การอภิปรายเรื่องประสิทธิภาพเผยให้เห็นข้อจำกัดและจุดแข็งของ interpreter แม้ว่าจะมี overhead จาก type erasure และ indirection แต่โค้ด UI ส่วนใหญ่เพียงแค่เรียกใช้เฟรมเวิร์ก OS ที่คอมไพล์แล้ว ดังนั้นผลกระทบต่อประสิทธิภาพจึงยังคงน้อยสำหรับแอปพลิเคชันทั่วไป ปัญหาเกิดขึ้นเป็นหลักกับลูปที่ใช้การคำนวณมากภายในโค้ดที่แปลความหมายเอง
ลักษณะด้านประสิทธิภาพ
- โอเวอร์เฮดจาก type erasure และการเพิ่ม indirection
- ผลกระทบน้อยมากสำหรับโค้ด UI ทั่วไปที่เรียกใช้ framework ของ OS ที่คอมไพล์แล้ว
- ปัญหาประสิทธิภาพส่วนใหญ่เกิดขึ้นกับลูปที่ใช้การคำนวณมากในโค้ดที่ตีความ
- งานหนักส่วนใหญ่ทำโดย system framework ที่คอมไพล์แล้ว
การขยายแพลตฟอร์มและการพัฒนาในอนาคต
ชุมชนแสดงความสนใจอย่างมากในการรองรับ iPad และความพร้อมใช้งานของแพลตฟอร์มที่กว้างขึ้น ทีมงานที่อยู่เบื้องหลัง Bitrig ดูเหมือนจะตอบสนองต่อข้อเสนอแนะ โดยมีการแก้ไขปัญหาความเข้ากันได้ของเบราว์เซอร์อย่างรวดเร็วและเปิดกว้างต่อการสำรวจฟีเจอร์เพิ่มเติม เช่น การรวม Jupyter kernel
โปรเจกต์นี้แสดงให้เห็นจุดตัดที่น่าสนใจของทฤษฎีภาษา ข้อจำกัดของแพลตฟอร์มมือถือ และเครื่องมือนักพัฒนา แม้ว่าอาจจะไม่ปฏิวัติการพัฒนา iOS ในชั่วข้ามคืน แต่ก็แสดงให้เห็นถึงโซลูชันที่สร้างสรรค์สำหรับข้อจำกัดของแพลตฟอร์มและบ่งบอกถึงความเป็นไปได้ที่พัฒนาไปสำหรับการเรียกใช้โค้ดไดนามิกบนแพลตฟอร์มที่มีข้อจำกัดแบบดั้งเดิม
อ้างอิง: How we built an interpreter for Swift (a compiled language)