แอป iOS ที่เขียนด้วย Assembly Language ก่อให้เกิดการถกเถียงเรื่องการพัฒนามือถือในระดับนามธรรม

ทีมชุมชน BigGo
แอป iOS ที่เขียนด้วย Assembly Language ก่อให้เกิดการถกเถียงเรื่องการพัฒนามือถือในระดับนามธรรม

ในยุคที่ถูกครอบงำด้วยเฟรมเวิร์กระดับสูงอย่าง React Native และ Flutter นักพัฒนาได้สร้างแอปพลิเคชัน iOS ที่ทำงานได้จริงโดยเขียนด้วยภาษา Assembly ของ ARM ทั้งหมด โครงการ yellow.asm สาธิตวิธีการสร้างแอป iOS พื้นฐานที่แสดงหน้าจอสีเหลืองโดยการเชื่อมต่อตรงกับ UIKit ผ่านโค้ดระดับต่ำ ข้ามสแต็กการพัฒนาแบบดั้งเดิมอย่าง Swift หรือ Objective-C

ปฏิกิริยาจากชุมชนเผยให้เห็นความแตกแยกที่น่าสนใจระหว่างผู้ที่มองเห็นคุณค่าทางการศึกษาจากการทำความเข้าใจพื้นฐานของการคำนวณ กับผู้ที่ตั้งคำถามถึงความเกี่ยวข้องในทางปฏิบัติของแนวทางระดับต่ำเช่นนี้ในการพัฒนามือถือสมัยใหม่

คุณค่าทางการศึกษาของการเขียนโปรแกรม Assembly

นักพัฒนาหลายคนแย้งว่าการเข้าใจภาษา Assembly ให้ข้อมูลเชิงลึกที่สำคัญเกี่ยวกับสิ่งที่เกิดขึ้นภายใต้การ abstraction ของเฟรมเวิร์กการเขียนโปรแกรมสมัยใหม่ การใช้งาน Assembly เผยให้เห็นว่าการเรียกใช้เมธอดของ Objective-C ทำงานจริงอย่างไรในระดับโปรเซสเซอร์ โดยแสดงให้เห็นกลไกของการส่งผ่านพารามิเตอร์ การเรียกใช้ฟังก์ชัน และการจัดการหน่วยความจำ ซึ่งปกติแล้วถูกซ่อนจากนักพัฒนาที่ทำงานในภาษาระดับสูง

สิ่งแบบนี้คือวิธีที่คุณได้เรียนรู้สิ่งที่อยู่ใต้ฝากระโปรงจริงๆ ทุกคนกำลังสร้างด้วย React Native และ Flutter ซึ่งก็ดีจนกระทั่งมีบางอย่างพัง แล้วคุณก็ติดอยู่กับการค้นหาเวทมนตร์ดำ การเริ่มต้นจาก Assembly สอนคุณถึงต้นทุนที่แท้จริงของการ abstraction

ข้อโต้แย้งตรงข้ามชี้ให้เห็นว่าแม้จะมีคุณค่าทางการศึกษา แต่ก็มีช่องว่างกว้างใหญ่ระหว่างความรู้เรื่อง Assembly กับการประยุกต์ใช้จริงในการดีบักเฟรมเวิร์กข้ามแพลตฟอร์มสมัยใหม่ ผู้แสดงความคิดเห็นบางคนระบุว่าโอกาสในการปรับแต่งประสิทธิภาพที่แท้จริงอยู่ที่อื่น เช่น การขยับไปไกลกว่า UIKit เพื่อโต้ตอบกับ GPU โดยตรงมากขึ้นผ่าน Metal หรือ Core Animation

มุมมองของชุมชนเกี่ยวกับคุณค่าของ Assembly:

  • ด้านการศึกษา: ทำความเข้าใจการทำงานของระบบในระดับต่ำ
  • การแก้ไขจุดบกพร่อง: เข้าใจความล้มเหลวของชั้นนามธรรมได้ดีขึ้น
  • การเพิ่มประสิทธิภาพ: มีศักยภาพสำหรับส่วนที่ต้องการประสิทธิภาพสูง
  • ด้านการใช้งานจริง: มีข้อจำกัดสำหรับการพัฒนาแอปพลิเคชันแบบเต็มรูปแบบ
  • ด้านประวัติศาสตร์: แตกต่างจากการเขียนโปรแกรม assembly แบบ 8/16-bit ที่เรียบง่ายกว่า

ความเป็นไปได้ทางเทคนิคและข้อจำกัดของแพลตฟอร์ม

การอภิปรายทางเทคนิคที่สำคัญเกิดขึ้นเกี่ยวกับความเป็นไปได้ที่แท้จริงในการสร้างแอป iOS โดยไม่มี dependency ใดๆ ต่อ UIKit แม้ตัวอย่าง Assembly จะยังต้องพึ่งพา UIKit สำหรับการจัดการหน้าต่างและการแสดงผล นักพัฒนาได้ถกเถียงกันว่าคนเราสามารถลงลึกไปได้แค่ไหนในการข้ามเฟรมเวิร์กของ Apple บางคนแนะนำให้ใช้เลเยอร์ของ Core Animation โดยตรง หรือแม้แต่การเขียนไปยัง framebuffer โดยตรง แม้ว่าคนอื่นจะชี้ให้เห็นว่าโมเดลความปลอดภัยของ iOS และข้อจำกัดของ public API ทำให้การหลีกเลี่ยง UIKit ที่แท้จริงเป็นไปไม่ได้บนอุปกรณ์ที่ไม่ได้ทำการ jailbreak

บทสนทนาเน้นย้ำว่าแม้การใช้งาน Assembly นี้จะต้องเรียกใช้ UIKit APIs ในท้ายที่สุดเพื่อแสดงเนื้อหา เนื่องจาก iOS ไม่ได้ให้ public syscall interfaces สำหรับการเข้าถึง framebuffer โดยตรงเหมือนแพลตฟอร์มคอมพิวเตอร์รุ่นเก่า สิ่งนี้สะท้อนให้เห็นว่าระบบปฏิบัติการสมัยใหม่บังคับใช้ชั้น abstraction ด้วยเหตุผลด้านความปลอดภัยและความเสถียร

การใช้งานจริงและข้อพิจารณาเกี่ยวกับ App Store

นักพัฒนาหลายคนสามารถสร้างและรันโค้ด Assembly ได้สำเร็จโดยใช้เครื่องมือ command-line ของ Xcode แม้ว่าบางคนจะประสบปัญหาการลิงก์ที่ต้องใช้เฟรมเวิร์กเพิ่มเติมเช่น CoreFoundation กระบวนการ build เกี่ยวข้องกับการคอมไพล์ไฟล์ Assembly โดยตรงและแพ็กเกจมันเป็นไฟล์ IPA ซึ่งแสดงให้เห็นว่ากราฟิกอินเทอร์เฟซของ Xcode นั้นไม่จำเป็นอย่างเคร่งครัดสำหรับการพัฒนา iOS

เกี่ยวกับการอนุมัติใน App Store ความคิดเห็นชี้แจงว่าตัวภาษา Assembly เองไม่จำเป็นต้องทำให้ถูกปฏิเสธ เนื่องจาก Apple ตรวจสอบ binary สุดท้ายโดยไม่คำนึงถึงภาษาต้นทาง ความเสี่ยงหลักเกี่ยวข้องกับความผิดพลาดขณะรันไทม์จากการเรียกใช้เมธอดที่ไม่ถูกต้องซึ่งภาษาระดับสูงจะตรวจจับได้ในเวลาคอมไพล์ นักพัฒนาบางคนแสดงความหวังว่ากฎระเบียบของ EU ในอนาคตอาจลดการพึ่งพาช่องทางการจัดจำหน่ายอย่างเป็นทางการของ Apple

ข้อกำหนดในการ Build:

  • เครื่องมือ command-line ของ Xcode หรือการติดตั้ง Xcode แบบเต็มรูปแบบ
  • iOS SDK
  • การเชื่อมโยงกับ framework UIKit และ Foundation
  • ไม่จำเป็นต้องใช้ storyboards หรือไฟล์ interface builder

ภูมิทัศน์ที่เปลี่ยนแปลงไปของการเขียนโปรแกรมระดับต่ำ

การอภิปรายเผยให้เห็นว่า ARM assembly แสดงถึงสภาพแวดล้อมที่ซับซ้อนกว่ามากเมื่อเทียบกับระบบ 8-bit และ 16-bit ที่นักพัฒนามืออาชีพหลายคนเรียนรู้เมื่อหลายทศวรรษก่อน แม้คุณค่าทางการศึกษาจะยังคงอยู่ แต่เส้นทางปฏิบัติจากความรู้เรื่อง Assembly ไปสู่การแก้ปัญหาการพัฒนามือถือในโลกจริงได้ยืดยาวออกไปอย่างมาก เนื่องจากชั้น abstraction ได้เพิ่มจำนวนขึ้น

ผู้แสดงความคิดเห็นบางคนแบ่งปันตัวอย่างของแนวทางทางเลือก รวมถึงแอป iOS ที่เขียนด้วย C ล้วนๆ หรือใช้ SDL โดยมีคนหนึ่งระบุว่าแอปติดตามตำแหน่งหนึ่งสามารถมีขนาดต่ำกว่า 1MB ได้ผ่านการพึ่งพาขั้นต่ำ คนอื่นๆ กล่าวถึงว่าแอป SwiftUI สมัยใหม่ก็สามารถมีขนาดเล็กได้เช่นกันเมื่อได้รับการปรับแต่งอย่างระมัดระวัง

ส่วนประกอบทางเทคนิคหลักใน yellow.asm:

  • ใช้ภาษา assembly แบบ ARM64
  • เรียกใช้ฟังก์ชัน Objective-C runtime โดยตรง
  • เชื่อมต่อกับเฟรมเวิร์ก UIKit
  • ใช้งานวงจรชีวิตพื้นฐานของแอป (autorelease pools, application delegate)
  • สร้างองค์ประกอบ UI แบบเขียนโค้ดโดยตรง

สรุป

แอป iOS ที่เขียนด้วย Assembly ทำหน้าที่เป็นทั้งความอยากรู้อยากเห็นทางเทคนิคและคำกล่าวเชิงปรัชญาเกี่ยวกับการศึกษาการพัฒนาซอฟต์แวร์ แม้จะมีคนไม่มากที่แนะนำให้เขียนแอปมือถือสำหรับใช้งานจริงด้วย Assembly แต่โครงการนี้สาธิตแนวคิดพื้นฐานของการคำนวณได้สำเร็จและจุดประกายบทสนทนาที่สำคัญเกี่ยวกับ abstraction ข้อจำกัดของแพลตฟอร์ม และคุณค่าของการทำความเข้าใจสิ่งที่เกิดขึ้นภายใต้พื้นผิวของเฟรมเวิร์กการพัฒนาสมัยใหม่ ขณะที่แพลตฟอร์มมือถือยังคงวิวัฒนาการต่อไป พื้นที่ความรู้พื้นฐานเหล่านี้ยังคงมีความเกี่ยวข้อง แม้ว่าการใช้งานจริงจะย้ายไปยังระดับ abstraction ที่สูงขึ้น

อ้างอิง: yellow.asm