पर आधारित मैंने अभी आईएल को थोड़ा सा देखना शुरू कर दिया है और मैं उत्सुक हूं कि संकलक के आउटपुट से अतिरिक्त कोड को हटाने के लिए मेरा प्रयास (नीचे दिखाया गया) कोई अनपेक्षित दुष्प्रभाव था।हाथ से कोडित आईएल के बारे में प्रश्न अलग-अलग सरल सी # कोड
परिणामों के बारे में quesiton के एक जोड़े:
- मूल में nop संचालन के उद्देश्य क्या है?
- मूल में विधियों के अंत में br.s का उद्देश्य क्या है?
- क्या पुन: लिखित संस्करण किसी भी तरह से अनुचित है?
मूल सी # कोड:
class Program {
public static int Main() {
return Add(1, 2);
}
public static int Add(int a, int b) {
return a + b;
}
}
csc.exe
साथ संकलित और ildasm.exe
(मूल) के साथ यह disassembled:
.method public hidebysig static int32 Main() cil managed
{
.entrypoint
.maxstack 2
.locals init (int32 V_0)
IL_0000: nop
IL_0001: ldc.i4.1
IL_0002: ldc.i4.2
IL_0003: call int32 Program::Add(int32, int32)
IL_0008: stloc.0
IL_0009: br.s IL_000b
IL_000b: ldloc.0
IL_000c: ret
}
.method public hidebysig static int32 Add(int32 a,
int32 b) cil managed
{
.maxstack 2
.locals init (int32 V_0)
IL_0000: nop
IL_0001: ldarg.0
IL_0002: ldarg.1
IL_0003: add
IL_0004: stloc.0
IL_0005: br.s IL_0007
IL_0007: ldloc.0
IL_0008: ret
}
फिर से लिखा (समान उत्पादन का उत्पादन):
.method public hidebysig static int32 Main() cil managed
{
.entrypoint
.maxstack 2
ldc.i4.1
ldc.i4.2
call int32 Program::Add(int32, int32)
ret
}
.method public hidebysig static int32 Add(int32 a, int32 b) cil managed
{
.maxstack 2
ldarg.0
ldarg.1
add
ret
}
एनओपी "नो ऑपरेशन" वह जगह है जहां आप डिबगिंग के दौरान अपना ब्रेकपॉइंट सेट कर सकते हैं। इसे रिलीज के लिए संकलित करने का प्रयास करें। – Johnny