كيف يعمل التوجيه .NET IL.
-
12-09-2019 - |
سؤال
أود أن أعرف كيف يعمل .maxstack حقا. أعلم أنه لا يلزم القيام به بالحجم الفعلي للأنواع التي تعلنها ولكن مع عددهم. أسئلتي هي:
- هل هذا ينطبق فقط على الوظيفة، أو إلى جميع الوظائف التي ندعوها؟
- حتى لو كان الأمر فقط لهذه الوظيفة، يتم الإعلان عن maxstack، كيف تعرف ما هي Maxstack إذا كان لديك تفرع؟ تذهب ورؤية كل "المسارات" وإرجاع القيمة القصوى الممكنة؟
- ماذا يحدث إذا قمت بتعيينه إلى 16 عاما، في الواقع هناك 17 متغيرات؟
- هل هناك كبير جدا من العقوبة إذا قمت بتعيينها إلى 256؟
المحلول
.maxstack
هو جزء من التحقق من IL. في الأساس .maxstack
يحكي JIT حجم المكدس الأقصى الذي يحتاجه لحفظ الأسلوب. علي سبيل المثال، x = y + (a - b)
يترجم إلى
(pseudo il :)
1. Push y on the stack
2. Push a on the stack
3. Push b on the stack
4. Pop the last two items from the stack,
substract them and
push the result on the stack
5. Pop the last two items from the stack,
add them and
push the result on the stack
6. Store the last item on the stack in x and
pop the last item from the stack
كما ترون، هناك على الأكثر 3 عناصر على المكدس في كل مرة. إذا كنت قد حددت .maxstack
إلى 2 (أو أقل) لهذه الطريقة، لن يتم تشغيل التعليمات البرمجية.
أيضا، لا يمكن أن يكون لديك شيء من هذا القبيل كما يتطلب حجم كومة لا حصر لها:
1. Push x on the stack
2. Jump to step 1
للإجابة على أسئلتكم:
- هل هذا ينطبق فقط على الوظيفة، أو إلى جميع الوظائف التي ندعوها؟
فقط لهذه الوظيفة
- حتى لو كان الأمر فقط لهذه الوظيفة، يتم الإعلان عن maxstack، كيف تعرف ما هي Maxstack إذا كان لديك تفرع؟ تذهب ورؤية كل "المسارات" وإرجاع القيمة القصوى الممكنة؟
تذهب ورؤية جميع المسارات وإرجاع القيمة القصوى الممكنة
- ماذا يحدث إذا قمت بتعيينه إلى 16 عاما، في الواقع هناك 17 متغيرات؟
لا علاقة له بعدد المتغيرات، انظر Lasse V. Karlsen.إجابة
- هل هناك كبير جدا من العقوبة إذا قمت بتعيينها إلى 256؟
لا يبدو وكأنه فكرة جيدة، لكنني لا أعرف.
هل لديك حقا لحساب .maxstack
نفسك؟ System.Reflection.Emit
يحسب ذلك من أجلك IIRC.
نصائح أخرى
لا علاقة له رقم من المتغيرات المعلنة، ولكن بدلا من ذلك أن تفعل كل شيء مع عدد القيم التي تحتاجها لدفعها على كومة في أي وقت معين من أجل حساب بعض التعبير.
على سبيل المثال، في التعبير التالي، أود أن أفترض أن قيم 2 يجب دفعها إلى المكدس:
x = y + z;
لا يرتبط هذا بحقيقة أن هناك ما لا يقل عن 3 متغيرات موجودة، x، y، و z، وربما الآخرين كذلك.
لسوء الحظ، لا أعرف الإجابة على أسئلتك الأخرى، وأود أن تخمين التجربة ستكون طريقة واحدة للعثور على بعض الإجابات.
يمكنك الرجوع إلى ما يلي ومعيار ECMA للحصول على فهم أفضل:
void msd(string a,
string b,
string c,
string d,
string e)
{
Console.WriteLine(a);
}
msd("a","b","c","d","e");
عندما أركض ildasm.exe
حصلت على هذا:
{
.entrypoint
// Code size 40 (0x28)
.maxstack 8
IL_0000: nop
IL_0001: nop
IL_0002: ldstr "a"
IL_0007: ldstr "b"
IL_000c: ldstr "c"
IL_0011: ldstr "d"
IL_0016: ldstr "e"
IL_001b: call void sf.Program::'<Main>g__msd|0_0'(string,
string,
string,
string,
string)
IL_0020: nop
IL_0021: call string [mscorlib]System.Console::ReadLine()
IL_0026: pop
IL_0027: ret
} // end of method Program::Main
من أعلى. لقد وجدت ماكس stakc
القيمة التي لا تحددها تعليمات الدفع والبوب.
لم أكن أعرف ما هي قيم عدد المكدس الحقيقي. لذلك، أشير ildasm
شفرة فك التشفير لتحديد قيمة مكدس أقصى حقيقي.