সংক্ষিপ্ত উত্তর:
আইএলে কোনও "তুলনা-সমান" নির্দেশনা নেই, সুতরাং সি # !=
অপারেটরের কোনও সঠিক চিঠিপত্র নেই এবং আক্ষরিক অনুবাদ করা যায় না।
তবে "তুলনা-সমান" নির্দেশনা রয়েছে ( ceq
, ==
অপারেটরের সাথে সরাসরি চিঠিপত্র ), তাই সাধারণ ক্ষেত্রে এটি x != y
তার সামান্য দীর্ঘ সমতুল্যর মতো অনুবাদ হয় (x == y) == false
।
নেই এছাড়াও একটি "তুলনা-বেশী বেশী" আইএল (নির্দেশ cgt
) যা কম্পাইলার নির্দিষ্ট শর্টকাট (অর্থাত উৎপন্ন খাটো আইএল কোড), এক হচ্ছে নাল বিরুদ্ধে বস্তুর যে বৈষম্য তুলনা নিতে অনুমতি দেয়, obj != null
, অনুবাদ পেতে, যেন তারা কোন " obj > null
"।
আসুন আরও কিছু বিশদে।
আইএল-তে যদি "তুলনা-সম-সমান" নির্দেশনা না থাকে, তবে নিম্নলিখিত পদ্ধতিটি সংকলক দ্বারা কীভাবে অনুবাদ করা হবে?
static bool IsNotEqual(int x, int y)
{
return x != y;
}
ইতিমধ্যেই যেমন উপরে বললেন, কম্পাইলার চালু হবে x != y
মধ্যে (x == y) == false
:
.method private hidebysig static bool IsNotEqual(int32 x, int32 y) cil managed
{
ldarg.0 // x
ldarg.1 // y
ceq
ldc.i4.0 // false
ceq // (note: two comparisons in total)
ret
}
দেখা যাচ্ছে যে সংকলকটি সর্বদা এই মোটামুটি দীর্ঘ-বায়ুযুক্ত প্যাটার্নটি উত্পাদন করে না। আসুন দেখা যাক আমরা যখন y
ধ্রুবক 0 দ্বারা প্রতিস্থাপন করি তখন কী হয় :
static bool IsNotZero(int x)
{
return x != 0;
}
উত্পাদিত আইএল সাধারণ ক্ষেত্রেগুলির তুলনায় কিছুটা কম:
.method private hidebysig static bool IsNotZero(int32 x) cil managed
{
ldarg.0 // x
ldc.i4.0 // 0
cgt.un // (note: just one comparison)
ret
}
সংকলক স্বাক্ষরিত পূর্ণসংখ্যার দুটি পরিপূরক (যেখানে, যদি বিট নিদর্শনগুলি স্বাক্ষরবিহীন পূর্ণসংখ্যার হিসাবে ব্যাখ্যা করা হয় - তবে এর .un
অর্থ - 0 এর সবচেয়ে কম সম্ভাব্য মান আছে) এর সুবিধা গ্রহণ করতে পারে, তাই এটি অনুবাদ করে x == 0
যেমন এটি ছিল unchecked((uint)x) > 0
।
দেখা যাচ্ছে যে সংকলক বৈষম্য পরীক্ষার জন্য একই কাজ করতে পারে null
:
static bool IsNotNull(object obj)
{
return obj != null;
}
সংকলক প্রায় একই আইএল উত্পাদন করে IsNotZero
:
.method private hidebysig static bool IsNotNull(object obj) cil managed
{
ldarg.0
ldnull // (note: this is the only difference)
cgt.un
ret
}
স্পষ্টতই, সংকলকটিকে ধরে নিতে অনুমতি দেওয়া হয় যে null
রেফারেন্সের বিট প্যাটার্নটি কোনও বস্তুর রেফারেন্সের জন্য সম্ভব সবচেয়ে ছোট বিট প্যাটার্ন।
এই শর্টকাটটি স্পষ্টভাবে কমন ল্যাঙ্গুয়েজ ইনফ্রাস্ট্রাকচার অ্যানোটেটেড স্ট্যান্ডার্ডে (অক্টোবর 2003 থেকে প্রথম সংস্করণ) উল্লেখ করা হয়েছে (পৃষ্ঠায় 491 পৃষ্ঠায়, টেবিল 6-4 এর পাদটীকা হিসাবে, "বাইনারি তুলনা বা শাখা অপারেশনস"):
" cgt.un
অবজেক্টআর্ফস (ও) এ " অনুমোদিত এবং যাচাইযোগ্য। এটি কোনও অবজেক্টরিফকে শূন্যের সাথে তুলনা করার সময় ব্যবহৃত হয় (কোনও "তুলনা-সমান" নির্দেশনা নেই, যা অন্যথায় আরও সুস্পষ্ট সমাধান হতে পারে)।
int
সীমার মধ্যে অ-নেতিবাচক মানগুলিতেint
যেমন হয় তেমন প্রতিনিধিত্ব থাকেuint
। এটি দু'জনের পরিপূরকের চেয়ে অনেক বেশি দুর্বল প্রয়োজন।