یا مثلا یه سوال دیگم اینه که آیا Jit کامپایلره یا مفسر
کامپایلر JIT جزء محیط زمان اجرا است، که عملکرد برنامه ها را در زمان اجرا بهبود می بخشد! ویا به تعبیری وظیفه اجرای کد IL ایجاد شده در CLR در دات نت به عهده JIT می باشد
یه سوال دیگم اینه ماژولهای مدیریت نشده دقیقا چی هستن کدهای ماشینی که تو سگمنت کد ذخیره شدن رو میگن ماژول مدیریت نشده
یکی از تکنیک های کاربردی در تعریف برنامه نویسی Managed در کنترل بهینه حافظه است. که توسط ابزارهای به نام garbage collector معروف هستند که ابزارهای پیچیده ای هستند به زبان C که از روی ذخیره رفرنس های آبجکتهایی که در حافظه Heap توسط برنامه شما ایجاد شده اند به موقع از نشت حافظه جلوگیری میکنند.
در صورتی که در برنامه نویسی Unmanaged باز پس گیری حافظه در پشته برنامه به عهده خود برنامه نویس می باشد.
بنابراین سگمنت CS برای نگهداری کد های برنامه به همراه ثبات اشاره گر LP ارتباطی به کد مدیریت شده ویا مدیریت نشده نداره!
آیا نوشته های داخل مستطیل سبز رنگ همون کدهای میانی هستن یا نه ؟
خیر!
فقط مقادیر داده هایی هستند که در ثبات ها در حال جابجایی هستند مثلا تصور کنید چنین داده ای دارید
TOTAL DW 0F25BH
حالا اگر بخواهید این داده را در یک ثبات 8 بیتی ذخیره کنید خوب مطمنا نمی تونید به صورت مستقیم این انتقال را انجام بدید بنابراین از دستور کمکی ptr استفاده میکنن
MOV AL,BYTE PTR TOTAL
MOV AH,BYTE PTR TOTAL+1
پس بنابراین Memory DUMP فایلها جهت تشخیص Memory Leak or Memory Dangling نرم افزار هایی که نوشته شده اند! استفاده می شوند البته با ابزارهایی که برای Trace کردن این فایلها هستند!
آیا آدرس های داخل مستطیل قرمز رنگ آدرس بایتکدها در بخش سگمنت کد داخل حافظه رم هستن یا نه ؟
خیر!
این آدرس های داده ها در stack هستنند!
آیا محتویات داخل مستطیل نارنجی رنگ اشاره به محیط اجرای فایل داره که 64 بیتی هستش و باید توسط هندلر های 64 بیتی و دستوالعملهای 64 بیتی اجرا بشه تا اولا بتونن به کل حافظه رم دسترسی داشته باشن ثانیا کدهای ماشین تولید شده بصورت 64 بیتی تولیدبشن و اینکه هر خانه استک 64 بیتی باشه ؟
خیر !
به این دلیل که فایل اجرایی ذاتا 32 بیتی هستش برای همینم کدهای ماشین بیشتز از 32 بیت نیستن و همیشه نصف مقادیر (نصف با ارزش بالاتر) صفر هستن ولی بعدا فهمیدم که آدرس حافطه رم هستن و وقتی رفتم بخش پرفورمنس پنجره تسک منیجر با توجه به مقدار رمی که نرم افزارا اشغال کرده بودن و زمان اجرای نرم افزار Flux که استارت آپ هست دیدم که نه آدرس رم هستن
دقیقا منظورتون متوجه نشدم!
اما اگر منظورتون این هست که کدهای ماشین برنامه به صورت 32 بیتی آدرس دهی شده اند بله قطعا وقتی که برنامه 32 بیتی کامپایل شده باشد حتما هم 32 بیتی می تواند آدرس دهی شود!
به روش بارگذاری فایل اجرایی دقت کن!
1- دستیابی به باینری فایل روی دیسک
2- ایجاد یک پیشوند سگمنت برنامه PSP 266 بایتی روی مرز پاراگراف(به مضروب صحیح از 16 مرز پاراگراف گفته می شود!)
3- برنامه بلافاصله پس از PSP در حافظه بار می شود
4- آدرس PSP در ثباتهای ES,DS بار می شود
5- آدرس سگمنت کد در CS و ثبات LP افست اولین دستورالعمل را بار میکند
6- آدرس پشته را در ثبات SS و اندازه پشته در SP بار می شود
7-کنترل به سگمنت کد انتقال داده می شود
بنابراین برای اینکه بتونید یک نرم افزار CHEAT CODE ویا بتونید برنامه هایی بنویسید که به صورت استاتیک کد تزریق کنید باید بتونید ثباتهای SS:SP , CS:LP را TRACE کنید که البته کار آسونی هم نیست!
یا مثلا مجددا تو مستطیل سبز رنگ اون کدهایی که پشت سر هم تکرار شدن داره به عمل Marshalling یا Serializition اشاره میکنه ؟
بله در کل مارشالینگ تبدیل یک داده یا مجموعه ای کامل از ساختارهای مرتبط به یک رشته سریال است که می تواند در یک پیام ارسال شود! که قطعا در پردازشگر هم این اتفاق می افته!
من میدونم اون اولش گفتم که خیلی نمیخوام با جزئیات بالا بدوننم فقط میخوام با یکسری مفاهیم آشنا بشم ولی یجاهایی یه چیزایی میبینم که وقتی با اون مفاهیمی که تو مدل اجرایی CLI خوندم همخونی داره دلم میخواد سوال کنم ببینم همونه یا نه
به هرحال من حرفم همونهایی هست که در پست قبلم عرض کردم.
بنابراین با توجه به گفته هام که عرض کردم! تمامی زبانهای برنامه نویسی در نهایت باید به یک کد ماشین تفسیر شوند! علتش هم ساده است چون اساسا معماری کامپیوتر فقط زبان ماشین را تحلیل میکنه! بنابراین وقتی یک زبان میانی در یک ماشین مجازی اجرا می شود قطعا وظیفه تفسیر این کد میانی به کد ماشین وظیفه ماشین مجازی خواهد بود. و عملیات جداگانه ی لینک و تفسیر بر روی کد میانی رخ نخواهد داد! که خوب این روش با تمام معایبی که داره! یکی از حسن های خوب اش قابلیت حمل پذیری و استقلال از سکوی اجرای نرم افزار های تولید شده دراین تکنولوژی هاست.
در صورتی که وقتی شما برنامه ای به زبان C می نویسید کامپایلر این برنامه را به اسمبلی و بعد هم به کد ماشین تفسیر خواهد کرد.