Ketika Apple
memperkenalkan teknologi Bitcode dan membuatnya wajib untuk watchOS dan tvOS, perusahaan itu tampaknya mengabaikan pertanyaan tentang mengapa itu diperlukan sama sekali. Dia hanya samar-samar mengatakan bahwa itu membantu untuk menyesuaikan file biner dan menggunakan peningkatan kompiler terbaru.
Sejak itu, Bitcode telah memainkan peran penting dalam kelancaran transisi watchOS ke 64 bit, di mana pengembang bahkan tidak perlu mengkompilasi ulang aplikasi mereka di direktori. Apple sendiri melakukan ini secara otomatis: semua aplikasi mulai bekerja pada Apple Watch Series 4. Anda mungkin bahkan tidak menyadari bahwa migrasi telah terjadi.
Apa itu Bitcode? Nah,
bitcode dengan b kecil adalah representasi perantara arsitektur khusus yang digunakan oleh LLVM, dan Bitcode dengan B besar mengacu pada serangkaian fungsi yang memungkinkan Anda untuk menanamkan tampilan ini dalam biner Mach-O Anda, dan mekanisme yang digunakan untuk merender file ini di app store.
Bitcode tidak sefleksibel kode sumbernya, tetapi jauh lebih fleksibel daripada biner yang disematkan, dengan metadata dan anotasi untuk kompiler. Dalam praktiknya, Anda (atau Apple) dapat dengan mudah mengambil gumpalan Bitcode dari aplikasi dan mengkompilasinya menjadi salinan aplikasi Anda yang berfungsi penuh. Beralih dari armv7 ke armv7s atau dari arm64 ke arm64e sangat keren dan menghemat waktu bagi pengembang yang harus mengkompilasi ulang biner setiap kali Apple mengganti chip ARM. Bitcode telah lama digunakan oleh Apple dalam driver OpenGL, sehingga driver dapat dioptimalkan dengan cepat untuk berbagai arsitektur GPU.
Kami telah melihat bagaimana Microsoft secara efektif memanfaatkan kompilasi ulang statis di Xbox One, menyediakan akses ke seluruh perpustakaan game yang awalnya ditulis untuk Xbox 360 (di bawah PowerPC), sepenuhnya tanpa keterlibatan pengembang atau akses ke kode sumber. Dan tanpa perantara seperti Bitcode, yang menyederhanakan proses.
Tentu saja, hantu macOS di ARM telah berkeliaran selama bertahun-tahun. Banyak yang bertanya-tanya apakah ini akan mempermudah aplikasi port menggunakan Bitcode. Akibatnya, mereka mencapai kesepakatan bahwa Bitcode tidak cocok untuk mentransfer antara arsitektur yang sangat berbeda seperti Intel dan ARM.
Ini tidak meyakinkan saya, jadi saya memutuskan untuk memeriksa!
Untuk memulai, kita membutuhkan aplikasi pengujian sederhana pada
Objective-C dengan Bitcode; biasanya disertakan hanya saat membuat arsip untuk App Store, jadi Anda harus memaksanya untuk dimasukkan dalam perakitan reguler. Anda dapat menggunakan opsi
-fembed-bitcode
atau custom build:
BITCODE_GENERATION_MODE = bitcode
Buat biner untuk Perangkat iOS Generik atau perangkat yang terhubung, seperti biasa. Tampaknya Bitcode tidak terintegrasi dengan rakitan arm64e (misalnya, jika Anda memiliki perangkat A12), sehingga Anda dapat mematikan pengaturan Xcode "kompilasi hanya untuk arsitektur aktif" dan langsung kompilasi untuk arm64.
Menggunakan alat
ebcutil, semua objek
Bitcode dengan mudah diambil dari biner yang dikompilasi.
ebcutil -a arm64 -e path/to/MyApp.app/MyApp
Kemudian mengkompilasi ulang setiap objek Bitcode untuk Intel.
for f in *; do clang -arch x86_64 -c -Xclang -disable-llvm-passes -emit-llvm -x ir -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk $f -o $fo; done
Sekarang kita akan menautkan gumpalan yang dikompilasi kembali ke file biner.
clang -arch x86_64 -mios-version-min=12.0 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk *.o -o path/to/MyApp.app/MyApp
Jika berfungsi, sekarang kita memiliki versi x86 dari aplikasi arm64 asli! Secara teori, ini dapat ditempatkan langsung di jendela simulator iOS, dipasang dan diluncurkan.
Ini adalah fakta yang sangat penting:
Anda dapat secara statis mentransfer file biner antara platform Intel dan ARM jika mereka menyertakan Bitcode . Ini benar-benar berfungsi!
Perangkap untuk proyek yang lebih kompleks
Tampaknya ARC menggunakan assembler bawaan, jadi untuk transfer dari arm64 ke x86 saat ini Anda harus menonaktifkan ARC.
Beberapa jenis blok, seperti handler penyelesaian, mulai kompilator dengan instruksi yang tidak dapat diterima. Jika Anda mendapatkan kesalahan X87, ini mungkin masalahnya.
Mengapa Objective-C? Nah, Swift dirancang dengan mempertimbangkan ARC. Saya tidak berpikir ada cara untuk menghindari assembler inline yang disebutkan di atas, sehingga kompilasi ulang sekarang akan gagal.
Mari kita ambil satu langkah lagi: kami
akan menggunakan
marzipanify untuk mengubah aplikasi Intel iOS ini menjadi program Mac yang bekerja dengan Marzipan.

Itu mudah!
Secara teoritis, ini berarti bahwa Apple memiliki cara untuk menjalankan aplikasi iOS apa pun dari App Store pada Mac tanpa mengharuskan pengembang memperbarui atau mengkompilasi ulang aplikasi mereka.
Bagaimana jika Mac beralih dari Intel ke chip ARM? Nah, seperti yang Anda lihat, dengan Bitcode, ia dapat mentransfer semua aplikasi yang mendukung Bitcode ke Mac App Store tanpa bantuan pengembang, sehingga akan siap untuk mengubah prosesor sejak hari pertama. Ini memberi Apple lebih banyak kebebasan. Sekarang Anda tidak perlu mengumumkan terlebih dahulu transisi ke prosesor baru satu tahun sebelumnya, dan teknologi seperti Rosetta tidak lagi diperlukan.
Jelas, kami belum mencapai titik ini: hari ini Apple tidak menyertakan Bitcode untuk aplikasi di Mac App Store, dan hari ini Bitcode mungkin tidak ideal untuk transfer arsitektur seperti itu. Di tempat Apple, saya akan fokus pada dua faktor ini, dan, tentu saja, mengaktifkan Bitcode tanpa gagal untuk semua aplikasi Marzipan di macOS 10.15.