আপডেট 2017-05-17। আমি এই সংস্থার যেখানে এই প্রশ্নটির উদ্ভব হয়েছে তার পক্ষে আর কাজ করব না এবং ডেলফি এক্সেক্সে অ্যাক্সেস নেই। আমি যখন ছিলাম তখন কিছুটা রুটিনের জন্য নিওন আন্তঃব্যক্তির সাথে মিশ্রিত এফপিসি + জিসিসি (পাস্কাল + সি) এ স্থানান্তরিত করে সমস্যার সমাধান করা হয়েছিল। (এফপিসি + জিসিসি অত্যন্ত সুপারিশ করা হয় কারণ এটি স্ট্যান্ডার্ড সরঞ্জামগুলি বিশেষত ভালগ্রাইন্ড ব্যবহার করে সক্ষম করে)) যদি কেউ বিশ্বাসযোগ্য উদাহরণ সহ প্রমাণ করতে পারেন যে তারা কীভাবে ডেলফি এক্সেক্স থেকে অনুকূলিত এআরএম কোড তৈরি করতে সক্ষম হয় তবে আমি উত্তরটি গ্রহণ করে খুশি ।
এম্বারকাডেরোর ডেলফি সংকলকগণ অ্যান্ড্রয়েড ডিভাইসের জন্য নেটিভ এআরএম কোড উত্পাদন করতে একটি এলএলভিএম ব্যাকএন্ড ব্যবহার করে। আমার কাছে প্রচুর পরিমাণে পাস্কাল কোড রয়েছে যা আমার অ্যান্ড্রয়েড অ্যাপ্লিকেশনগুলিতে সংকলন করা দরকার এবং আমি কীভাবে ডেলফিকে আরও কার্যকর কোড তৈরি করতে পারি তা জানতে চাই। এখনই, আমি এমনকি স্বয়ংক্রিয় সিমডি অপ্টিমাইজেশনের মতো উন্নত বৈশিষ্ট্যগুলি সম্পর্কেও বলছি না, কেবল যুক্তিসঙ্গত কোড উত্পাদন সম্পর্কে producing অবশ্যই এলএলভিএম পাশের প্যারামিটারগুলি পাস করার কোনও উপায় থাকতে হবে, বা কোনওভাবে ফলাফলকে প্রভাবিত করবে? সাধারণত, যে কোনও সংকলকের কোড সংকলন এবং অপ্টিমাইজেশনকে প্রভাবিত করার জন্য অনেকগুলি বিকল্প থাকবে, তবে ডেলফির এআরএম লক্ষ্যগুলি কেবল "অপ্টিমাইজেশন চালু / বন্ধ" বলে মনে হচ্ছে এবং এটিই।
এলএলভিএম যুক্তিসঙ্গতভাবে আঁটসাঁট এবং বুদ্ধিমান কোড তৈরি করতে সক্ষম বলে মনে করা হচ্ছে, তবে মনে হচ্ছে ডেলফি তার সুবিধাগুলিটিকে এক অদ্ভুত উপায়ে ব্যবহার করছে। ডেলফি স্ট্যাকটি খুব ভারীভাবে ব্যবহার করতে চায় এবং এটি সাধারণত প্রসেসরের রেজিস্টারগুলিকে r0-r3 অস্থায়ী ভেরিয়েবল হিসাবে ব্যবহার করে। সম্ভবত সবচেয়ে ক্রেজিস্ট, এটি মনে হচ্ছে স্বাভাবিক 32 বিট পূর্ণসংখ্যার চারটি 1-বাইট লোড ক্রিয়াকলাপ হিসাবে লোড হচ্ছে। কীভাবে ডেল্ফি আরও উন্নত এআরএম কোড তৈরি করতে পারে এবং অ্যান্ড্রয়েডের জন্য বাইট-বাই বাইট ঝামেলা ছাড়াই এটি তৈরি করে?
প্রথমে আমি ভেবেছিলাম বাইট-বাই-বাইট লোডিংটি বিগ-এন্ডিয়ান থেকে বাইট অর্ডার অদলবদলের জন্য ছিল, তবে ঘটনাটি এটি ছিল না, এটি কেবলমাত্র 4 টি একক-বাইট লোডের সাথে একটি 32 বিট সংখ্যা লোড করছে * * এটি লোড হতে পারে একটি স্বাক্ষরবিহীন শব্দ-আকারের মেমরি লোড না করে পুরো 32 বিট। (এটি এড়ানো উচিত অন্য জিনিস, যা পুরো বিষয়টিকে সংকলক বাগ হিসাবে চিহ্নিত করা উচিত) *
আসুন এই সহজ ফাংশনটি দেখুন:
function ReadInteger(APInteger : PInteger) : Integer;
begin
Result := APInteger^;
end;
এমনকি অপ্টিমাইজেশনগুলি স্যুইচ করা সত্ত্বেও, আপডেট প্যাক 1 সহ ডেলফি এক্সই 7, পাশাপাশি এক্সই 6, এই ফাংশনটির জন্য নিম্নলিখিত এআরএম অ্যাসেম্বলি কোডটি উত্পাদন করে:
Disassembly of section .text._ZN16Uarmcodetestform11ReadIntegerEPi:
00000000 <_ZN16Uarmcodetestform11ReadIntegerEPi>:
0: b580 push {r7, lr}
2: 466f mov r7, sp
4: b083 sub sp, #12
6: 9002 str r0, [sp, #8]
8: 78c1 ldrb r1, [r0, #3]
a: 7882 ldrb r2, [r0, #2]
c: ea42 2101 orr.w r1, r2, r1, lsl #8
10: 7842 ldrb r2, [r0, #1]
12: 7803 ldrb r3, [r0, #0]
14: ea43 2202 orr.w r2, r3, r2, lsl #8
18: ea42 4101 orr.w r1, r2, r1, lsl #16
1c: 9101 str r1, [sp, #4]
1e: 9000 str r0, [sp, #0]
20: 4608 mov r0, r1
22: b003 add sp, #12
24: bd80 pop {r7, pc}
তার জন্য ডেলফির প্রয়োজনীয় নির্দেশাবলী এবং মেমরির অ্যাক্সেসের সংখ্যাটি কেবল গণনা করুন। এবং 4 টি সিঙ্গল-বাইট লোডগুলি থেকে 32 বিট পূর্ণসংখ্যার নির্মাণ করা ... যদি আমি ফাংশনটি কিছুটা পরিবর্তন করি এবং পয়েন্টারের পরিবর্তে কোনও ভার প্যারামিটার ব্যবহার করি তবে এটি সামান্য কম সংশ্লেষিত হবে:
Disassembly of section .text._ZN16Uarmcodetestform14ReadIntegerVarERi:
00000000 <_ZN16Uarmcodetestform14ReadIntegerVarERi>:
0: b580 push {r7, lr}
2: 466f mov r7, sp
4: b083 sub sp, #12
6: 9002 str r0, [sp, #8]
8: 6801 ldr r1, [r0, #0]
a: 9101 str r1, [sp, #4]
c: 9000 str r0, [sp, #0]
e: 4608 mov r0, r1
10: b003 add sp, #12
12: bd80 pop {r7, pc}
আমি এখানে বিচ্ছিন্নতা অন্তর্ভুক্ত করব না, তবে আইওএসের জন্য, ডেল্ফি পয়েন্টার এবং ভার প্যারামিটার সংস্করণের জন্য অভিন্ন কোড তৈরি করে এবং এগুলি প্রায় তবে অ্যান্ড্রয়েড ভার প্যারামিটার সংস্করণের মতো নয়। সম্পাদনা করুন: স্পষ্ট করার জন্য, বাই-বাই-বাইট লোডিং কেবলমাত্র অ্যান্ড্রয়েডে। এবং শুধুমাত্র অ্যান্ড্রয়েডে, পয়েন্টার এবং ভার প্যারামিটার সংস্করণগুলি একে অপরের থেকে পৃথক। আইওএস এ উভয় সংস্করণ একই কোড উত্পন্ন করে।
তুলনার জন্য, এখানে এফপিসি ২.7.১ (মার্চ ২০১৪ থেকে এসভিএন ট্রাঙ্ক সংস্করণ) অপ্টিমাইজেশন স্তর -O2 সহ ফাংশনটি সম্পর্কে কী ভাবেন। পয়েন্টার এবং ভার প্যারামিটার সংস্করণগুলি হুবহু এক।
Disassembly of section .text.n_p$armcodetest_$$_readinteger$pinteger$$longint:
00000000 <P$ARMCODETEST_$$_READINTEGER$PINTEGER$$LONGINT>:
0: 6800 ldr r0, [r0, #0]
2: 46f7 mov pc, lr
অ্যান্ড্রয়েড এনডিকে নিয়ে আসা সি সংকলকটির সাথে আমি একটি সমতুল্য সি ফাংশনও পরীক্ষা করেছি।
int ReadInteger(int *APInteger)
{
return *APInteger;
}
এবং এটি এফপিসিটি মূলত একই জিনিসটি সংকলন করে:
Disassembly of section .text._Z11ReadIntegerPi:
00000000 <_Z11ReadIntegerPi>:
0: 6800 ldr r0, [r0, #0]
2: 4770 bx lr
armeabi-v7a
পরিবর্তে লক্ষ্য নির্ধারণ করেছেন armeabi
কিনা তা নিশ্চিত করুন (এই সংকলকটিতে এই জাতীয় বিকল্প রয়েছে কিনা তা নিশ্চিত নয়), যেহেতু স্বাক্ষরবিহীন লোডগুলি এআরএমভি 6 (যখন এআরএমভি armeabi
5 ধরে থাকে) থেকে সমর্থন করা উচিত । (দেখানো বিচ্ছিন্নতা দেখে মনে হচ্ছে না যে এটি একটি বাইজেনডিয়ান মানটি পড়েছে, এটি কেবল একবারে কিছুটা এন্ডিয়ান মান পড়ে।)