অ্যান্ড্রয়েড / এআরএম লক্ষ্যগুলির জন্য ডেলফি এক্সেক্স কোড জেনারেশনকে কীভাবে প্রভাবিত করবেন?


266

আপডেট 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

14
এটি সম্পর্কে Google+ আলোচনায় বিটিডব্লিউ , স্যাম শ্যা নোট করেছেন যে সি ++ ডিবাগ বিল্ডগুলিতে লম্বা-ফর্ম কোড এবং মুক্তির জন্য অনুকূলিত কোড দেখায়। Wheres Delphi উভয় এটি করেন। সুতরাং যেহেতু এটি যে পতাকাগুলি তারা এলএলভিএম পাঠাচ্ছে তাদের মধ্যে এটি একটি সরল বাগ হতে পারে এবং যদি কোনও বাগ রিপোর্ট ফাইল করা খুব উপযুক্ত হয় তবে এটি খুব শীঘ্রই ঠিক হয়ে যেতে পারে।
ডেভিড

9
ওহ, ঠিক আছে, আমি ভুল পড়া। তারপরে, নোটলিকেট যেমন বলেছিলেন, মনে হচ্ছে এটি পয়েন্টার লোডটি স্বাক্ষরিত হবে না (বা প্রান্তিককরণের গ্যারান্টি দিতে পারে না), এবং পুরানো এআরএম প্ল্যাটফর্মগুলি অবিবাহিত লোডগুলি অগত্যা করতে পারে না। আপনি এটির armeabi-v7aপরিবর্তে লক্ষ্য নির্ধারণ করেছেন armeabiকিনা তা নিশ্চিত করুন (এই সংকলকটিতে এই জাতীয় বিকল্প রয়েছে কিনা তা নিশ্চিত নয়), যেহেতু স্বাক্ষরবিহীন লোডগুলি এআরএমভি 6 (যখন এআরএমভি armeabi5 ধরে থাকে) থেকে সমর্থন করা উচিত । (দেখানো বিচ্ছিন্নতা দেখে মনে হচ্ছে না যে এটি একটি বাইজেনডিয়ান মানটি পড়েছে, এটি কেবল একবারে কিছুটা এন্ডিয়ান মান পড়ে।)
মাস্টারসজো

6
আমি আরএসপি -৯৯২২ খুঁজে পেয়েছি যা এটি একই বাগ হিসাবে দেখা যাচ্ছে।
ডেভিড

6
এম্বারকাডেরো.পাবলিক.ডেল্পি.প্ল্যাটফর্মস্পেসিফিক.আই.এস নিউজগ্রুপে এক্সই 4 এবং এক্সই 5 এর মধ্যে অপ্টিমাইজেশনটি ভেঙে যাওয়ার বিষয়ে কেউ জিজ্ঞাসা করেছিলেন, "এআরএম সংকলক অপ্টিমাইজেশনটি নষ্ট?" devsuperpage.com/search/…
সাইড এস ফ্রেশ

6
@ জোহান: এটি কার্যকর কী? আমার ধারণা ছিল যে এটি কোনওভাবেই ডেলফির কম্পাইলারের সম্পাদনযোগ্য হিসাবে বেকড ছিল। এটি ব্যবহার করে দেখুন এবং ফলাফলগুলি আমাদের জানান।
সাইড এস টাটকা

উত্তর:


8

আমরা বিষয়টি তদন্ত করছি। সংক্ষেপে, এটি কোনও পয়েন্টার দ্বারা রেফারেন্সকৃত পূর্ণসংখ্যার সম্ভাব্য ভুল-প্রান্তিককরণের (32 সীমানা পর্যন্ত) উপর নির্ভর করে। সমস্ত উত্তর পেতে আরও একটু সময় প্রয়োজন ... এবং এটি সমাধান করার পরিকল্পনা রয়েছে।

মার্কো কন্টি, ডেলফি ডেভেলপারদের মডারেটর

এছাড়াও উল্লেখ করুন কেন ডেল্ফি জিলিব এবং জিপ লাইব্রেরিগুলি 64 বিটের নিচে এত ধীর? উইন 64 লাইব্রেরিগুলি অপ্টিমাইজেশন ছাড়াই বিল্ট শিপ্ট করা হয়।


কিউপি রিপোর্টে: আরএসপি -9922 সংকলক দ্বারা উত্পাদিত খারাপ এআরএম কোড, $ হে নির্দেশনা উপেক্ষা করা হয়েছে? , মার্কো নিম্নলিখিত ব্যাখ্যা যুক্ত করেছেন:

এখানে একাধিক সমস্যা রয়েছে:

  • ইঙ্গিত হিসাবে, অনুকূলকরণ সেটিংস কেবল সম্পূর্ণ ইউনিট ফাইলগুলিতে প্রয়োগ হয় এবং স্বতন্ত্র ফাংশনগুলিতে নয়। সোজা কথায়, একই ফাইলটিতে অপ্টিমাইজেশন চালু এবং বন্ধ করার কোনও প্রভাব থাকবে না।
  • তদতিরিক্ত, কেবল "ডিবাগ তথ্য" সক্ষম করা অপ্টিমাইজেশন বন্ধ করে দেয়। সুতরাং, যখন কেউ ডিবাগ করছে, স্পষ্টতই অপ্টিমাইজেশানগুলি চালু করার কোনও প্রভাব থাকবে না। ফলস্বরূপ, আইডিইতে সিপিইউ ভিউ অপ্টিমাইজড কোডের ডিসসেম্বেলেড ভিউ প্রদর্শন করতে সক্ষম হবে না।
  • তৃতীয়, নন-অ্যালাইন্টেড 64 বিট ডেটা লোড করা নিরাপদ নয় এবং এর ফলে ত্রুটি দেখা দেয়, সুতরাং পৃথক 4 ওয়ান বাইট অপারেশন যা প্রদত্ত পরিস্থিতিতে প্রয়োজনীয়।

মার্কো কন্টি জানুয়ারী 2015 সালে "আমরা এই সমস্যাটি তদন্ত করছি" নোটটি পোস্ট করেছিলেন এবং সম্পর্কিত বাগ রিপোর্ট আরএসপি -9922 জানুয়ারিতে "ওয়ার্কস অ্যাসপেক্টেড" রেজোলিউশনের মাধ্যমে সমাধান হিসাবে চিহ্নিত হয়েছে, এবং সেখানে একটি উল্লেখ আছে "২ মার্চ অভ্যন্তরীণ সমস্যা বন্ধ রয়েছে, 2015 "। আমি তাদের ব্যাখ্যা বুঝতে পারি না।
সাইড এস টাটকা

1
আমি সমস্যার সমাধানে একটি মন্তব্য যুক্ত করেছি a
মার্কো ক্যান্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.