Bitcode হলো একটি iOS অ্যাপ্লিকেশনের কম্পাইলেশন পর্যায়ে প্রোগ্রামের একটি ইন্টারমিডিয়েট উপস্থাপনা। মেশিন কোডের বিপরীতে, Bitcode কোনো নির্দিষ্ট প্রসেসর আর্কিটেকচারের সাথে আবদ্ধ নয়। Apple Developer Documentation অনুসারে, App Store টার্গেট আর্কিটেকচারের জন্য Bitcode পুনরায় কম্পাইল করতে পারে, যা কর্মক্ষমতা উন্নত করে এবং ইনস্টলেশন ফাইলের আকার হ্রাস করে। ডেভেলপার App Store-এ Bitcode পাঠায়, এবং স্টোর নিজেই প্রতিটি ডিভাইস প্রকারের জন্য একটি অপ্টিমাইজড বাইনারি ফাইল জেনারেট করে।
মূল পয়েন্ট
Bitcode হলো প্রোগ্রামের একটি ইন্টারমিডিয়েট উপস্থাপনা (Intermediate Representation, IR) যা LLVM কম্পাইলার ইনফ্রাস্ট্রাকচার দ্বারা উৎপন্ন হয়। Apple Xcode 7 এবং iOS 9 থেকে watchOS অ্যাপ্লিকেশনের জন্য বাধ্যতামূলক প্রয়োজনীয়তা এবং iOS ও tvOS-এর জন্য ঐচ্ছিক হিসাবে Bitcode সমর্থন চালু করে। Xcode 14 থেকে, watchOS ছাড়া সব প্ল্যাটফর্মের জন্য প্রয়োজনীয়তা সরিয়ে নেওয়া হয়েছে।
ইন্টারমিডিয়েট কোড উপস্থাপনার ধারণাটি 2000-এর দশক থেকে LLVM প্রকল্পের অংশ হিসাবে বিদ্যমান, যা ক্রিস ল্যাটনার ইলিনয় বিশ্ববিদ্যালয়ে প্রতিষ্ঠা করেছিলেন। Apple 2011 সালে Xcode-এর জন্য LLVM অভিযোজিত করে, এবং 2015 সালে Bitcode-কে App Store-এ পুনরায় জমা না দিয়ে অ্যাপ্লিকেশন আপডেট করার উপায় হিসাবে উপস্থাপন করে। প্রযুক্তিটি WWDC 2015-এ “What's New in Xcode” সেশনে ঘোষণা করা হয়েছিল।
মেশিন কোড হলো একটি নির্দিষ্ট প্রসেসরের জন্য বাইনারি নির্দেশ: arm64, armv7 বা x86_64। Bitcode হার্ডওয়্যার-স্বাধীন ফরম্যাটে সংরক্ষিত হয়, যা App Store-কে একটি একক সোর্স উপস্থাপনা থেকে বিভিন্ন আর্কিটেকচারের জন্য অপ্টিমাইজড বাইনারি ফাইল জেনারেট করতে দেয়। এই মূল পার্থক্যটি প্রযুক্তির সমস্ত সুবিধা নির্ধারণ করে।
| বৈশিষ্ট্য | Bitcode | মেশিন কোড |
|---|---|---|
| আর্কিটেকচার নির্ভরতা | স্বাধীন | CPU-তে আবদ্ধ |
| বাইনারি ফাইলের আকার | কমপ্যাক্ট | বড় |
| পুনঃকম্পাইলেশন ক্ষমতা | হ্যাঁ | না |
| App Store সমর্থন | পুনঃকম্পাইল হয় | যেমন আছে তেমন ব্যবহার |
| ডিবাগিং | সীমিত | পূর্ণ সমর্থন |
Bitcode একটি এক্সিকিউটেবল ফাইল নয়। এটি বাইনারি ফরম্যাটে LLVM IR যা ডেভেলপার প্রজেক্ট মেটাডেটা সহ App Store-এ পাঠায়। অ্যাপ স্টোর পুনঃকম্পাইলেশন প্রক্রিয়া চালায়, প্রতিটি টার্গেট প্ল্যাটফর্ম এবং অপারেটিং সিস্টেম সংস্করণের জন্য কোড অভিযোজিত করে।
Bitcode জেনারেশন প্রক্রিয়া কম্পাইলার ফ্রন্টএন্ড দিয়ে শুরু হয়, যা Swift বা Objective-C সোর্স কোডকে LLVM IR-এ রূপান্তর করে। লিংকিং পর্যায়ে, Xcode IR-কে .bc (Bitcode) ফরম্যাট ফাইলে প্যাকেজ করে, যা পরে .xcarchive সহ App Store-এ পাঠানো হয়। App Store তার পক্ষ থেকে পুনঃকম্পাইলেশন প্রক্রিয়া চালায়।
LLVM ইনফ্রাস্ট্রাকচার তিনটি অংশ নিয়ে গঠিত: ফ্রন্টএন্ড (C/ObjC-এর জন্য Clang, Swift-এর জন্য Swift Frontend), Middle-End অপ্টিমাইজার এবং ব্যাকএন্ড (মেশিন কোড জেনারেটর)। Bitcode অ্যাসেম্বলি নির্দেশ জেনারেশনে না গিয়ে প্রথম দুটি পর্যায়ের ফলাফল। Middle-End প্ল্যাটফর্ম-স্বাধীন অপ্টিমাইজেশন করে: ডেড কোড অপসারণ, ইনলাইনিং এবং কনস্ট্যান্ট ফোল্ডিং।
// 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 Connect Bitcode সহ আর্কাইভ গ্রহণ করে এবং নিজস্ব কম্পাইলেশন ইনফ্রাস্ট্রাকচার চালায়। সিস্টেম ব্যবহারকারীর ডিভাইসের টার্গেট আর্কিটেকচার নির্ধারণ করে এবং মেশিন কোড জেনারেট করে, এটি নির্দিষ্ট প্রসেসর বৈশিষ্ট্যের জন্য অতিরিক্ত অপ্টিমাইজ করে। arm64e (A12+ এবং M-সিরিজ প্রসেসর) এর জন্য, অতিরিক্ত নিরাপত্তা অপ্টিমাইজেশন প্রয়োগ করা হয়।
এই প্রক্রিয়াটিকে App Thinning বলা হয় — একটি প্রযুক্তি যা একটি ডিভাইসে শুধুমাত্র তার আর্কিটেকচারের জন্য প্রয়োজনীয় রিসোর্স এবং কোড পৌঁছে দেয়। A17 Pro প্রসেসরযুক্ত iPhone ব্যবহারকারী পুরানো আর্কিটেকচারের জন্য অপ্রয়োজনীয় নির্দেশ ছাড়া, arm64e-এর জন্য অপ্টিমাইজড বাইনারি ফাইল পায়। এটি ডাউনলোডের সময় হ্রাস করে এবং ডিভাইসে স্থান বাঁচায়।
Bitcode iOS অ্যাপ্লিকেশন ডেভেলপারদের জন্য বেশ কয়েকটি মূল সুবিধা প্রদান করে। প্রধানটি হলো App Store-এ আপডেট পুনরায় জমা না দিয়ে নতুন Apple প্রসেসরের জন্য স্বয়ংক্রিয় অপ্টিমাইজেশন। এটি বিশেষ করে নতুন আর্কিটেকচারে রূপান্তরের সময় প্রাসঙ্গিক, যেমন armv7 থেকে arm64-তে স্থানান্তর।
যখন Apple একটি নতুন আর্কিটেকচার সহ প্রসেসর প্রকাশ করে, Bitcode সহ পাঠানো অ্যাপ্লিকেশনগুলি স্বয়ংক্রিয়ভাবে তার জন্য পুনঃকম্পাইল হয়। ডেভেলপারের প্রজেক্ট পুনরায় বিল্ড এবং আপডেট প্রকাশ করার প্রয়োজন নেই — App Store ব্যবহারকারী প্রথমবার ডাউনলোড করার সময় নিজে থেকে এটি করে। এটি বিশেষ করে দীর্ঘস্থায়ী অ্যাপ্লিকেশনের জন্য গুরুত্বপূর্ণ যা বছর ধরে রক্ষণাবেক্ষণ করা হয়।
App Thinning Bitcode-এর সাথে মিলিত হয়ে ইনস্টল করা অ্যাপ্লিকেশনের আকার 15-40% কমাতে পারে। App Store শুধুমাত্র একটি নির্দিষ্ট ডিভাইসের জন্য প্রয়োজনীয় মেশিন নির্দেশ উৎপন্ন করে, অন্যান্য আর্কিটেকচার এবং বিভিন্ন iOS সংস্করণের জন্য কোড বাদ দিয়ে। বাস্তবে, এর অর্থ হলো নতুন iPhone-এর ব্যবহারকারী একটি কমপ্যাক্ট বাইনারি ফাইল পায়।
Apple WWDC 2015 Session 102 অনুসারে, Bitcode এবং App Thinning ব্যবহার সমস্ত আর্কিটেকচার সম্বলিত ইউনিভার্সাল বাইনারি ফাইলের তুলনায় ডাউনলোড করা অ্যাপ্লিকেশনের আকার গড়ে 25% কমাতে পারে। 100 MB অ্যাপ্লিকেশনের জন্য, ব্যবহারকারীর ডিভাইসে সাশ্রয় 40 MB পর্যন্ত হতে পারে।
Bitcode কনফিগারেশন Xcode-এর বিল্ড সেটিংসে করা হয়। Enable Bitcode প্যারামিটার Build Settings-এ অবস্থিত এবং নতুন প্রজেক্টের জন্য ডিফল্টরূপে সক্ষম, কিন্তু ডেভেলপার ডিবাগিং বা Bitcode সমর্থন ছাড়া থার্ড-পার্টি লাইব্রেরি ব্যবহার করার সময় এটি নিষ্ক্রিয় করতে পারেন।
// Build Settings -> Apple Clang - Code Generation
// Enable Bitcode = YES
// বা পৃথক টার্গেটের জন্য Info.plist-এর মাধ্যমে
@property (nonatomic, assign) BOOL enableBitcode;
- (void)configureBuildSettings {
// কনফিগারেশনে Bitcode স্থিতি পরীক্ষা
if (self.enableBitcode) {
NSLog(@"Bitcode is enabled for this target");
} else {
NSLog(@"Bitcode is disabled");
}
}
আর্কাইভে Bitcode আছে কিনা তা যাচাই করতে, Xcode Organizer-এর মাধ্যমে .xcarchive ফাইল খুলুন বা টার্মিনালে otool -l কমান্ড চালান। বাইনারি ফাইলে __LLVM সেকশনের উপস্থিতি নিশ্চিত করে যে Bitcode সক্ষম এবং সঠিকভাবে প্যাকেজ করা হয়েছে। যদি সেকশনটি অনুপস্থিত থাকে, তাহলে বিল্ডের সময় Bitcode জেনারেট হয়নি।
# আর্কাইভে 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 ফ্ল্যাগ চেক করুন বা enable_bitcode সহ use_frameworks! ব্যবহার করুন।
Bitcode সব ধরনের iOS প্রজেক্টের জন্য সার্বজনীন সমাধান নয়। প্রযুক্তির সীমাবদ্ধতা রয়েছে যা ডেভেলপারের বিল্ড কনফিগারেশনে অপশন সক্ষম করার আগে বিবেচনা করা উচিত। এই সীমাবদ্ধতাগুলি বোঝা আর্কাইভিং এবং প্রকাশনার সময় সমস্যা এড়াতে সাহায্য করে।
সব থার্ড-পার্টি লাইব্রেরি Bitcode সমর্থন সহ আসে না। যদি একটি লাইব্রেরি শুধুমাত্র Bitcode ছাড়া কম্পাইল করা বাইনারি ফাইল হিসাবে বিতরণ করা হয়, তবে সক্ষম অপশন সহ প্রজেক্ট বিল্ড হবে না। এই ক্ষেত্রে, ডেভেলপারকে হয় Bitcode নিষ্ক্রিয় করতে হবে বা বিক্রেতার কাছ থেকে Bitcode-সক্ষম সংস্করণের অনুরোধ করতে হবে। এটি বিশেষ করে পুরানো লাইব্রেরির জন্য প্রাসঙ্গিক যা আর আপডেট হয় না।
Bitcode দিয়ে বিল্ড করা অ্যাপ্লিকেশন থেকে ক্র্যাশ রিপোর্ট অতিরিক্ত প্রক্রিয়াকরণ প্রয়োজন। পুনঃকম্পাইল করা কোডের জন্য প্রতীক (dSYM) App Store দ্বারা উৎপন্ন হয় এবং Xcode Organizer-এর মাধ্যমে ডাউনলোডের জন্য উপলব্ধ হয়। সংশ্লিষ্ট dSYM ফাইল লোড না করে, ক্র্যাশ রিপোর্টে কল স্ট্যাক অপাঠ্য হবে, যা সমস্যা নির্ণয় কঠিন করে তোলে।
iOS 17 এবং Xcode 15 অনুসারে, Apple App Store-এ প্রকাশনার জন্য বাধ্যতামূলক Bitcode সক্ষম করার প্রয়োজন নেই। তবে, watchOS অ্যাপ্লিকেশনের জন্য, Bitcode App Store Connect নীতি স্তরে একটি বাধ্যতামূলক প্রয়োজনীয়তা রয়ে গেছে। ডেভেলপারদের নতুন প্রজেক্টের জন্য Bitcode সক্ষম করার সুপারিশ করা হয় যদি সমস্ত নির্ভরতা এটি সমর্থন করে।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
iOS এবং tvOS অ্যাপ্লিকেশনের জন্য, Xcode 14 থেকে Bitcode বাধ্যতামূলক নয়। watchOS-এর জন্য, Bitcode সমর্থন বাধ্যতামূলক রয়ে গেছে। Apple নতুন প্রজেক্টের জন্য Bitcode সক্ষম করার সুপারিশ করে কিন্তু এটি ছাড়া প্রকাশনা আটকায় না।
Bitcode App Store-কে App Thinning প্রয়োগ করতে দেয় — শুধুমাত্র ব্যবহারকারীর ডিভাইস আর্কিটেকচারের জন্য মেশিন কোড জেনারেট করা। এটি প্রজেক্টে সমর্থিত আর্কিটেকচারের সংখ্যার উপর নির্ভর করে ডাউনলোড করা বাইনারি ফাইলের আকার 15-40% কমায়।
হ্যাঁ, dSYM ফাইল পুনঃকম্পাইল করা বাইনারি ফাইল থেকে ক্র্যাশ রিপোর্ট প্রতীকী করার জন্য প্রয়োজনীয়। App Store আর্কাইভ প্রক্রিয়াকরণের পরে Xcode Organizer-এর মাধ্যমে dSYM ডাউনলোডের সুযোগ দেয়। সেগুলি ছাড়া, Crashlytics এবং কনসোলে কল স্ট্যাকে শুধুমাত্র মেমরি ঠিকানা থাকবে।
SPM Bitcode সমর্থন করে যদি নির্ভরতাগুলি বাইনারি ফাইলের পরিবর্তে সোর্স কোডে বিতরণ করা হয়। SPM-এর মাধ্যমে বাইনারি নির্ভরতাগুলিকে Bitcode সহ একটি সংস্করণ সরবরাহ করতে হবে, অন্যথায় সক্ষম অপশন সহ প্রজেক্ট কম্পাইল হবে না।
Bitcode একটি হার্ডওয়্যার-স্বাধীন ইন্টারমিডিয়েট LLVM IR উপস্থাপনা যা সরাসরি প্রসেসর দ্বারা এক্সিকিউট করা যায় না। মেশিন কোড একটি নির্দিষ্ট আর্কিটেকচারের (arm64, x86_64) জন্য প্রস্তুত নির্দেশ ধারণ করে এবং অতিরিক্ত কম্পাইলেশন ছাড়াই এক্সিকিউট হয়।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন