Bitcode: چیست، بایت‌کد میانی و کامپایل

نویسنده: IT Sectr منتشر شده: 2026-04-17 زمان مطالعه: 9 دقیقه

Bitcode — نمایش میانی برنامه در مرحله کامپایل اپلیکیشن iOS است. برخلاف کد ماشین، Bitcode به معماری خاص پردازنده وابسته نیست. طبق Apple Developer Documentation، App Store می‌تواند Bitcode را برای معماری هدف بازکامپایل کند که عملکرد را بهبود می‌بخشد و اندازه فایل نصب را کاهش می‌دهد. توسعه‌دهنده Bitcode را به App Store می‌فرستد و فروشگاه خود فایل باینری بهینه‌شده را برای هر نوع دستگاه تولید می‌کند.

نکات اصلی

  • Bitcode — بایت‌کد میانی LLVM که در مرحله کامپایل پروژه iOS تولید می‌شود
  • App Store Bitcode را برای پردازنده دستگاه کاربر بازکامپایل می‌کند
  • بهینه‌سازی اندازه فایل باینری از طریق دستورالعمل‌های وابسته به سخت‌افزار
  • فعال‌سازی Bitcode در تنظیمات Xcode از طریق پرچم Enable Bitcode انجام می‌شود
  • محدودیت — Bitcode فقط برای iOS و tvOS پشتیبانی می‌شود، نه برای macOS

Bitcode در توسعه iOS چیست

Bitcode نمایش میانی برنامه (Intermediate Representation, IR) است که زیرساخت کامپایلر LLVM تولید می‌کند. اپل پشتیبانی از Bitcode را از Xcode 7 و iOS 9 به عنوان الزام برای اپلیکیشن‌های watchOS و اختیاری برای iOS و tvOS معرفی کرد. از Xcode 14 به بعد، الزام برای همه پلتفرم‌ها به جز watchOS لغو شد.

تاریخچه ظهور Bitcode

مفهوم نمایش میانی کد از دهه ۲۰۰۰ در چارچوب پروژه LLVM وجود دارد که توسط کریس لتنر در دانشگاه ایلینوی تأسیس شد. اپل LLVM را در سال ۲۰۱۱ برای Xcode تطبیق داد و در سال ۲۰۱۵ Bitcode را به عنوان راهی برای به‌روزرسانی اپلیکیشن‌ها بدون ارسال مجدد به App Store معرفی کرد. این فناوری در WWDC 2015 در جلسه «What’s New in Xcode» اعلام شد.

تفاوت Bitcode با کد ماشین

کد ماشین — دستورالعمل‌های باینری برای پردازنده خاص: arm64، armv7 یا x86_64 است. Bitcode در قالبی مستقل از سخت‌افزار ذخیره می‌شود که به App Store اجازه می‌دهد از یک نمایش منبع، فایل‌های باینری بهینه‌شده برای معماری‌های مختلف تولید کند. این تفاوت کلیدی تعیین‌کننده همه مزایای فناوری است.

ویژگیBitcodeکد ماشین
وابستگی به معماریمستقلوابسته به CPU
اندازه فایل باینریفشردهبزرگتر
امکان بازکامپایلداردندارد
پشتیبانی App Storeبازکامپایل می‌شودهمان‌طور که هست استفاده می‌شود
اشکال‌زداییمحدودپشتیبانی کامل

Bitcode یک فایل اجرایی نیست. این LLVM IR در قالب باینری است که توسعه‌دهنده همراه با فراداده‌های پروژه به App Store می‌فرستد. فروشگاه اپلیکیشن فرایند بازکامپایل را راه‌اندازی می‌کند و کد را برای هر پلتفرم هدف و نسخه سیستم‌عامل تطبیق می‌دهد.

Bitcode در کامپایل iOS چگونه کار می‌کند

فرایند تولید Bitcode از فرانت‌اند کامپایلر شروع می‌شود که کد منبع Swift یا Objective-C را به LLVM IR تبدیل می‌کند. در مرحله لینک کردن، Xcode IR را در فایل‌های فرمت .bc (Bitcode) بسته‌بندی می‌کند که سپس همراه با آرشیو .xcarchive به App Store فرستاده می‌شوند. App Store به نوبه خود فرایند بازکامپایل را در سمت خود راه‌اندازی می‌کند.

مرحله LLVM و تولید کد میانی

زیرساخت LLVM از سه بخش تشکیل شده است: فرانت‌اند (Clang برای C/ObjC، Swift Frontend برای Swift)، بهینه‌ساز Middle-End و بک‌اند (تولیدکننده کد ماشین). Bitcode — حاصل کار دو مرحله اول بدون انتقال به تولید دستورالعمل‌های اسمبلی است. Middle-End بهینه‌سازی‌های مستقل از پلتفرم را انجام می‌دهد: حذف کد مرده، درون‌خطی‌سازی و تاشدن ثابت‌ها.

swift
// نمونه کد منبع Swift
func calculateSum(a: Int, b: Int) -> Int {
    return a + b
}

// LLVM IR پس از کامپایل (ساده‌شده)
; define i32 @calculateSum(i32 %a, i32 %b)
; %result = add i32 %a, %b
; ret i32 %result

پس از تولید IR، کامپایلر یک سری بهینه‌سازی در سطح نمایش انجام می‌دهد: حذف کد مرده، درون‌خطی‌سازی توابع و تاشدن ثابت‌ها. این بهینه‌سازی‌ها به معماری وابسته نیستند و در Bitcode حفظ می‌شوند. هنگام بازکامپایل در App Store، بهینه‌سازی‌های وابسته به معماری مانند مرتب‌سازی مجدد دستورالعمل‌ها برای پردازنده خاص اضافه می‌شوند.

بازکامپایل در App Store

App Store Connect آرشیو حاوی Bitcode را دریافت می‌کند و زیرساخت کامپایل خود را راه‌اندازی می‌کند. سیستم معماری هدف دستگاه کاربر را تعیین کرده و کد ماشین را تولید می‌کند و آن را برای ویژگی‌های خاص پردازنده بهینه می‌سازد. برای arm64e (پردازنده‌های A12+ و سری M) بهینه‌سازی‌های امنیتی اضافی اعمال می‌شود.

این فرایند App Thinning نام دارد — فناوری که امکان تحویل فقط منابع و کد لازم برای معماری دستگاه را فراهم می‌کند. کاربر iPhone با پردازنده A17 Pro یک فایل باینری بهینه‌شده برای arm64e دریافت می‌کند، بدون دستورالعمل‌های اضافی برای معماری‌های قدیمی. این کار زمان بارگذاری را کاهش می‌دهد و در فضای دستگاه صرفه‌جویی می‌کند.

مزایای استفاده از Bitcode

Bitcode چندین مزیت کلیدی برای توسعه‌دهندگان اپلیکیشن‌های iOS فراهم می‌کند. اصلی‌ترین آنها — بهینه‌سازی خودکار برای پردازنده‌های جدید اپل بدون انتشار مجدد به‌روزرسانی در App Store است. این به ویژه هنگام انتقال به معماری‌های جدید مانند انتقال از armv7 به arm64 مهم است.

بهینه‌سازی برای معماری‌های جدید

وقتی اپل پردازنده‌ای با معماری جدید عرضه می‌کند، اپلیکیشن‌هایی که با Bitcode ارسال شده‌اند به طور خودکار برای آن بازکامپایل می‌شوند. توسعه‌دهنده نیازی به بازسازی پروژه و انتشار به‌روزرسانی ندارد — App Store این کار را در سمت خود هنگام اولین دانلود توسط کاربر انجام می‌دهد. این به ویژه برای اپلیکیشن‌های طولانی‌مدت که سال‌ها پشتیبانی می‌شوند مهم است.

کاهش اندازه فایل باینری

App Thinning در ترکیب با Bitcode امکان کاهش اندازه اپلیکیشن نصب‌شده را ۱۵–۴۰٪ می‌دهد. App Store فقط دستورالعمل‌های ماشینی را تولید می‌کند که برای دستگاه خاص لازم است، کد معماری‌های دیگر و تغییرات برای نسخه‌های مختلف iOS را حذف می‌کند. در عمل این بدان معناست که کاربر با iPhone جدید یک فایل باینری فشرده دریافت می‌کند.

بر اساس داده‌های Apple WWDC 2015 Session 102، استفاده از Bitcode و App Thinning می‌تواند اندازه اپلیکیشن قابل دانلود را به طور متوسط ۲۵٪ در مقایسه با فایل باینری جهانی حاوی همه معماری‌ها کاهش دهد. برای اپلیکیشن ۱۰۰ مگابایتی، صرفه‌جویی می‌تواند تا ۴۰ مگابایت در دستگاه کاربر باشد.

  • تطبیق خودکار با پردازنده‌های جدید بدون بازسازی پروژه توسط توسعه‌دهنده
  • کاهش زمان بارگذاری اپلیکیشن در دستگاه کاربر
  • ساده‌سازی توزیع — یک آرشیو برای همه معماری‌ها، یک مجموعه فراداده
  • سازگاری آینده — اپلیکیشن روی پردازنده‌های عرضه‌نشده اپل نیز کار می‌کند

چطور Bitcode را در پروژه Xcode فعال کنیم

تنظیم Bitcode در پیکربندی ساخت Xcode انجام می‌شود. پارامتر Enable Bitcode در تنظیمات Build Settings قرار دارد و به طور پیش‌فرض برای پروژه‌های جدید فعال است، اما توسعه‌دهندگان می‌توانند آن را برای اشکال‌زدایی یا هنگام استفاده از کتابخانه‌های شخص ثالث بدون پشتیبانی Bitcode غیرفعال کنند.

تنظیم از طریق Build Settings

objective-c
// Build Settings -> Apple Clang - Code Generation
// Enable Bitcode = YES

// یا از طریق Info.plist برای targetهای جداگانه
@property (nonatomic, assign) BOOL enableBitcode;
- (void)configureBuildSettings {
    // بررسی وضعیت Bitcode در پیکربندی
    if (self.enableBitcode) {
        NSLog(@"Bitcode is enabled for this target");
    } else {
        NSLog(@"Bitcode is disabled");
    }
}

برای بررسی اینکه آیا آرشیو حاوی Bitcode است، فایل .xcarchive را از طریق Xcode Organizer باز کنید یا دستور otool -l را در ترمینال اجرا کنید. وجود بخش __LLVM در فایل باینری تأیید می‌کند که Bitcode فعال و به درستی بسته‌بندی شده است. اگر بخش وجود نداشته باشد — Bitcode در زمان ساخت تولید نشده است.

بررسی از طریق ترمینال

bash
# بررسی وجود Bitcode در آرشیو
otool -l YourApp.app/YourApp | grep __LLVM

# نتیجه: اگر بخش __LLVM وجود دارد — Bitcode حضور دارد
# اگر نتیجه خالی است — Bitcode فعال نیست یا تولید نشده است

# همچنین می‌توان از دستور size برای بررسی استفاده کرد
size -m -l YourApp.app/YourApp | grep __LLVM

هنگام استفاده از کتابخانه‌های شخص ثالث از طریق CocoaPods یا SPM، مطمئن شوید که همه وابستگی‌ها با Bitcode ساخته شده‌اند. اگر حداقل یک کتابخانه از Bitcode پشتیبانی نکند، Xcode در مرحله آرشیو خطای لینک کردن ایجاد می‌کند. برای CocoaPods، پرچم bitcode_enabled را در podspecها بررسی کنید یا از use_frameworks! با enable_bitcode استفاده کنید.

محدودیت‌ها و مشکلات Bitcode

Bitcode یک راه‌حل جهانی برای همه انواع پروژه‌های iOS نیست. این فناوری محدودیت‌هایی دارد که توسعه‌دهنده باید قبل از فعال‌سازی گزینه در پیکربندی ساخت در نظر بگیرد. درک این محدودیت‌ها به جلوگیری از مشکلات در مرحله آرشیو و انتشار کمک می‌کند.

سازگاری با کتابخانه‌ها

همه کتابخانه‌های شخص ثالث با پشتیبانی از Bitcode عرضه نمی‌شوند. اگر کتابخانه فقط به صورت فایل باینری کامپایل‌شده بدون Bitcode توزیع شود، پروژه با گزینه فعال ساخته نخواهد شد. در این صورت توسعه‌دهنده باید یا Bitcode را غیرفعال کند یا از تأمین‌کننده نسخه با Bitcode را درخواست کند. این به ویژه برای کتابخانه‌های قدیمی که دیگر به‌روز نمی‌شوند مهم است.

اشکال‌زدایی و گزارش‌های خرابی

گزارش‌های خرابی از اپلیکیشن‌هایی که با Bitcode ساخته شده‌اند نیاز به پردازش اضافی دارند. نمادها (dSYM) برای کد بازکامپایل‌شده توسط App Store تولید می‌شوند و برای دانلود از طریق Xcode Organizer در دسترس هستند. بدون دانلود فایل‌های dSYM مربوطه، پشته فراخوانی در گزارش‌های خرابی غیرقابل خواندن خواهد بود که تشخیص مشکلات را دشوار می‌کند.

  • دانلود dSYM — برای رمزگشایی گزارش‌های خرابی از App Store پس از بازکامپایل ضروری است
  • اندازه آرشیو — .xcarchive با Bitcode فضای بیشتری روی دیسک توسعه‌دهنده اشغال می‌کند
  • زمان ساخت — تولید Bitcode مرحله کامپایل پروژه را حدود ۱۰–۱۵٪ افزایش می‌دهد
  • macOS — Bitcode برای اپلیکیشن‌های macOS و watchOS پشتیبانی نمی‌شود
  • پروژه‌های قدیمی — انتقال پروژه‌های بزرگ ممکن است نیاز به به‌روزرسانی همه وابستگی‌ها داشته باشد

طبق iOS 17 و Xcode 15، اپل فعال‌سازی اجباری Bitcode را برای انتشار در App Store الزامی نمی‌کند. با این حال، برای اپلیکیشن‌های watchOS، Bitcode یک شرط اجباری باقی می‌ماند که در سطح قوانین App Store Connect تعیین شده است. به توسعه‌دهندگان توصیه می‌شود Bitcode را برای پروژه‌های جدید فعال کنند، اگر همه وابستگی‌ها از آن پشتیبانی می‌کنند.

سوالات متداول

آیا فعال‌سازی Bitcode برای انتشار در App Store الزامی است؟

برای اپلیکیشن‌های iOS و tvOS Bitcode از Xcode 14 به بعد الزامی نیست. برای watchOS پشتیبانی Bitcode الزامی باقی می‌ماند. اپل فعال‌سازی Bitcode را برای پروژه‌های جدید توصیه می‌کند، اما انتشار بدون آن را مسدود نمی‌کند.

Bitcode چگونه بر اندازه اپلیکیشن در App Store تأثیر می‌گذارد؟

Bitcode به App Store اجازه می‌دهد App Thinning را اعمال کند — تولید کد ماشین فقط برای معماری دستگاه کاربر. این کار اندازه فایل باینری قابل دانلود را بسته به تعداد معماری‌های پشتیبانی‌شده در پروژه ۱۵–۴۰٪ کاهش می‌دهد.

آیا با Bitcode فعال نیاز به آپلود فایل‌های dSYM است؟

بله، فایل‌های dSYM برای نمادسازی گزارش‌های خرابی از فایل‌های باینری بازکامپایل‌شده ضروری هستند. App Store امکان دانلود dSYM را از طریق Xcode Organizer پس از پردازش آرشیو فراهم می‌کند. بدون آنها، پشته فراخوانی در Crashlytics و کنسول فقط شامل آدرس‌های حافظه خواهد بود.

آیا Swift Package Manager از Bitcode پشتیبانی می‌کند؟

SPM در صورتی که وابستگی‌ها به صورت کد منبع توزیع شوند نه فایل‌های باینری، از Bitcode پشتیبانی می‌کند. وابستگی‌های باینری از طریق SPM باید نسخه‌ای با Bitcode ارائه دهند، در غیر این صورت پروژه با گزینه فعال کامپایل نخواهد شد.

Bitcode چه تفاوتی با کد ماشین معمولی دارد؟

Bitcode — یک نمایش میانی LLVM IR مستقل از سخت‌افزار است که نمی‌تواند مستقیماً توسط پردازنده اجرا شود. کد ماشین شامل دستورالعمل‌های آماده برای معماری خاص (arm64, x86_64) است و بدون کامپایل اضافی اجرا می‌شود.

خلاصه

  • Bitcode — نمایش میانی LLVM IR که هنگام کامپایل اپلیکیشن‌های iOS در Xcode تولید می‌شود
  • App Store Bitcode را برای معماری دستگاه کاربر بازکامپایل می‌کند و App Thinning را اعمال می‌کند
  • اندازه اپلیکیشن قابل دانلود با حذف دستورالعمل‌های ماشین اضافی ۱۵–۴۰٪ کاهش می‌یابد
  • پردازنده‌های جدید اپل بدون انتشار مجدد به‌روزرسانی توسط توسعه‌دهنده به طور خودکار پشتیبانی می‌شوند
  • فعال‌سازی Bitcode از طریق پرچم Enable Bitcode در Build Settings پروژه Xcode پیکربندی می‌شود
  • محدودیت‌ها شامل نیاز به فایل‌های dSYM برای گزارش‌های خرابی و سازگاری همه کتابخانه‌های شخص ثالث است
  • توصیه — فعال‌سازی Bitcode برای پروژه‌های جدید با بررسی پشتیبانی همه وابستگی‌های استفاده‌شده

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید