PDA

View Full Version : گفتگو: لطفا کمکم کنید - سوال در مورد فرایند تبدیل سورس کد به کد ماشین در دات نت



mostafajan
شنبه 13 بهمن 1397, 00:10 صبح
درود

من میخوام شروع کنم زبان ++C دات نت رو یاد بگیرم

یخورده که از یادگیریم گذشت و ده صفحه از کتابو خوندم نمیدونم چی شد افتادم تو فهمیدن فرایند تبدیل سورس کد به کد ماشین

رفتم کلی سرچ کردم و کلی چیزی یاد گرفتم و با اکثر اطلاحات و مفهومشون آشنا شدم بماند که پدرم درومد تا فقط مفهوم CLI رو بفهمم که چیه و آخرشم فهمیدم که یه CLI یه فرایند و یک فرا ایده هستش برای متحول کردن دنیای تبدیل سورس کدها به کد ماشین تا دنیای برنامه نویسیو از اون جنگ بین مفسر و کامپایل راحت کنه و یه سری مزایای دیگه مثل قابل حمل بودن بسته های اجراییو در اختیارمون بزاره همینطور سریعتر انجام شدن کار تبدیل سورس کد به کد ماشین و بی اهمیت بودن زبانی که باهاش برنامه نویسی میکنیم ( تنها کافیه اون زبان از فرایند CLI استفاده کنه و پکیج مربوطه ( .NET یا JDK ) نصب باشه رو سیستم تا سورس کد یا کد میانی توسط سی پی یو اجرا بشه ) و ....


من کلی سوال دارم ازتون که و میخوام همتون کمکم کنید تا فرایند تولید سورس کد به کد ماشینو درست بفهمم

اولین سوالی که ازتون دارم اینه که بعد از تبدیل سورس کدهای ما به CIL (کد میانی) این کدهای میانی بهمراه متادیتا در قالب یک فایل اجرایی با پسوند exe یا dll قرار میگیرن یا نه ؟

اگر بله به اون فایل اجرایی چی نامیده میشه ماژول مدیریت شده یا اسمبلی ؟ اگر بهش میگن ماژول مدیریت شده پس مفهوم اسمبلی رو توضیح بدین لطفا


یه سوال خیلی خیلی مهمی که برام شکل گرفته و هرچی در موردش جستجو میکنم به نتیجه ای نمیرسم اینه که آیا کدهای میانی یا همون CIL ها بوسیله کامپایلر Jit که بخشی از ماشین مجازی CLR هستش در آن واحد به native code تبدیل میشه یا اینکه اول کدهای میانی به بایت کد (Byte-Code) تبدیل میشن بعد به native code تبدیل میشن ؟


یه سوال دیگه اینه که آیا native code به کد ماشینی گفته میشه که مختص سی پی یو سیستم جاری تولید میشه و باید در همون لحظه روی سی پی یو همون سیستم اجرابشه ؟


فعلا روی همینا اگر بحث کنیم ممنون میشم تا در خلال گفتگومون به سوالات دیگه ای برسیم . اگر هم توضیح دادن یا تایپ کردن به این شکل فرومی براتون سخته لطفا یه آیدی اسکایپ یا شماره تلفن برای تماس واتس اپ پیغام خصوصی کنید تا باهاتون تماس بگیرم ولی اگر به اون سوال خیلی خیلی مهم توی تاپیک پاسخ بدین که نظراتتون رو بقیه دوستان بخونن و اگر ایرادی داشت متذکر بشن خیلی ممنون میشم

با تشکر از همه دوستان



149718

farhad_shiri_ex
شنبه 13 بهمن 1397, 11:45 صبح
یخورده که از یادگیریم گذشت و ده صفحه از کتابو خوندم نمیدونم چی شد افتادم تو فهمیدن فرایند تبدیل سورس کد به کد ماشین

دوست عزیز!
این خیلی خوبه که شما دنبال این هستید که درباره JIT , JVM ویا زبانهای میانی اطلاعاتی بدست بیاورید! ولی در حال حاضر با سطح دانشی که شما از برنامه نویسی دارید مطمن باشید که خیلی از تکنیکهایی که در مقاله هایی که بعضا ساختمان این تکنولوژی ها را توضیح داده به قدری پیچیدگی داره که هیچ کارائی برای شما نخواهد داشت.
بنابراین سالها قبل در تالار C++ ,C بارها درباره این تکنولوژی ها بحث شده است. کافی که جستجو کنید! البته مقاله های زیادی که در ویکیپیدیا وجود دارند هم میتونید رجوع کنید!
بنظرم از آنجائیکه برنامه نویسی با این تکنولوژی ها بسیار گسترده است و استفاده بهینه از این تکنولوژی ها هم مستلزم داشتن یک دانش و بینش برنامه نویسی خوب را میطلبه! که فراگیری و کسب مهارت این تکنولوژی ها سالهای زیادی زمان خواهد برد پیشنهاد میکنم در حال حاضر خیلی درگیر نحوه کامپایل کردن و ماشین مجازی نباشید.
چرا که صرف چند ده مقاله یا حتی چند ده کتاب که البته اگر هم باشه! به هیچ عنوان نمیتونه دانش عمیقی به شما بده! چون برای درک این تکنولوژی باید به معماری های زبان ماشین و اسمبلی در پردازشگر های مختلف و به زبان های اسمبلی و سی و سی پلاس پلاس و به معماری کامپیوتر و معماری کامپایلرها و معماری هسته سیستم عامل و معماری سخت افزارها تسلط داشته باشید که برای اینکه بتونید در تمام این زمینه ها دانش کسب کنید حداقل 15 الی 20 سال طول خواهد کشید تازه اگر بتونید به صورت مستمر روی این مقوله ها کار کنید.
پس در نتیجه بهتره که فعلا هسته زبان و نحوه نوشتن برنامه ها را یاد بگیرید!

mostafajan
شنبه 13 بهمن 1397, 19:55 عصر
دوست عزیز!
این خیلی خوبه که شما دنبال این هستید که درباره JIT , JVM ویا زبانهای میانی اطلاعاتی بدست بیاورید! ولی در حال حاضر با سطح دانشی که شما از برنامه نویسی دارید مطمن باشید که خیلی از تکنیکهایی که در مقاله هایی که بعضا ساختمان این تکنولوژی ها را توضیح داده به قدری پیچیدگی داره که هیچ کارائی برای شما نخواهد داشت.
بنابراین سالها قبل در تالار C++‎‎‎‎‎‎‎‎‎‎‎‎‎ ,C بارها درباره این تکنولوژی ها بحث شده است. کافی که جستجو کنید! البته مقاله های زیادی که در ویکیپیدیا وجود دارند هم میتونید رجوع کنید!
بنظرم از آنجائیکه برنامه نویسی با این تکنولوژی ها بسیار گسترده است و استفاده بهینه از این تکنولوژی ها هم مستلزم داشتن یک دانش و بینش برنامه نویسی خوب را میطلبه! که فراگیری و کسب مهارت این تکنولوژی ها سالهای زیادی زمان خواهد برد پیشنهاد میکنم در حال حاضر خیلی درگیر نحوه کامپایل کردن و ماشین مجازی نباشید.
چرا که صرف چند ده مقاله یا حتی چند ده کتاب که البته اگر هم باشه! به هیچ عنوان نمیتونه دانش عمیقی به شما بده! چون برای درک این تکنولوژی باید به معماری های زبان ماشین و اسمبلی در پردازشگر های مختلف و به زبان های اسمبلی و سی و سی پلاس پلاس و به معماری کامپیوتر و معماری کامپایلرها و معماری هسته سیستم عامل و معماری سخت افزارها تسلط داشته باشید که برای اینکه بتونید در تمام این زمینه ها دانش کسب کنید حداقل 15 الی 20 سال طول خواهد کشید تازه اگر بتونید به صورت مستمر روی این مقوله ها کار کنید.
پس در نتیجه بهتره که فعلا هسته زبان و نحوه نوشتن برنامه ها را یاد بگیرید!

خیلی ممنون آقا فرهاد که پاسخ دادین
من هشت سال پیش کارشناسی نرم افزار میخوندم (تو یه دانشگاه سطح پایین) و موقعی که ویژوال بیسیک 6 کار میکردم دوره هنرستان یه مقداری برنامه نویسی ویژوال کاکردم و اسامی آبجکتارو یاد گرفتم . من چون تعریف اشتباهی از میزان دانش خودم تو زمینه برنامه نویسی کردم همینطور توضیح کم از اینکه چی میخوام بدونم از این فرایند تبدیل سورس کد به کد ماشین باعث شده خیلی از دوستان اصلا نظر ندن و بگن ما تا بیایم بگیم مثلا این بخش از فلان بخش و فلان بخش تشکیل میشه باز میپرسه حالا اون دوتا بخش چین و هی باید توضیح بدیم ولی تعدادی از بخشای مدل اجرایی CLI رو خودم متوجه شدم

من نمیخوام برم دنبال یاد گیری کل مدل اجرایی CLI با ریزترین جزئیات یا مثلا برم کل فایل PDF استاندارد سازی ECMA رو یاد بگیرم

یه کتاب فارسی PDF هست تو اینترنت برای آقای محسن افشین ترجمه کتاب آقای جفری ریچر هستش که عنوانش اینه (CLR via C#‎‎‎‎‎‎‎‎‎‎‎‎i)
لینک دانلود کتاب : http://www.yon.ir/GyQdn

(http://www.yon.ir/GyQdn)کتاب خیلی خوبیه تو این زمینه ولی چیزی که بیشتر از همه گیجم میکنه اینکه که مثلا توی این لینک (https://javabyab.com/1597/cil-%D9%88-msil-%D8%AF%D8%B1-.net-%DA%86%D9%87-%D8%AA%D9%81%D8%A7%D9%88%D8%AA%DB%8C-%D8%A8%D8%A7-%DB%8C%DA%A9%D8%AF%DB%8C%DA%AF%D8%B1-%D8%AF%D8%A7%D8%B1%D9%86%D8%AF%D8%9F) گفته شده که کدهای میانی اول به بایتکد تبدیل میشن بعد به کد ماشین ولی یجای دیگه گفته شده کدهای میانی مستقیما به کد ماشین تبدیل میشن و در مجموع این چند نظریهاست که گمراهم میکنه و حتی توی اون کتاب فارسی هم شاید بازم تاکید میکنم شاید بخاطر درست معادل سازی نشدن بعضی از کلمات و خوب توضیح داده نشدن بعضی از مفاهیم یه سری اشتباهات برای افرادی مثل من بوجود بیاد

یا مثلا یه سوال دیگم اینه که آیا Jit کامپایلره یا مفسر

یه سوال دیگم اینه ماژولهای مدیریت نشده دقیقا چی هستن کدهای ماشینی که تو سگمنت کد ذخیره شدن رو میگن ماژول مدیریت نشده

سوال بعدیم اینه که کدهای ماشین تولید شده توسط Jit رو خود ماشین مجازی با در دست گرفتم کنترل ترد ها اجرا میکنه یا اینکه میده به یه بخش دیگه سیستم عامل که کارش اجرای یک مجموعه دستورالعملهاست که بنظرم اگر خودش انجام بده اجرایی کردن کدهای ماشینو الحق اسم ماشین مجاری برازندشه


__________________________________________________ ___________________


جدای از همه اینا من یکاری انجام دادم به این شکل که رفتم تو پنجره تسک منیجر و روی تب پروسس کلیک کردم بعد روی یکی از پروسسها مثلا نرم افزار Flux (که کارش نارنجی رنگ کردن صفحه نمایش هستش برای اینکه کمتر چشممون آسیب ببینه)
و بعد اینکه کلیک راست کردم روی گزینه Create dump file کلیک کردم و یه فایل با پسوند dmp برای ایجاد توی پوشه Temp

فارغ از اینکه من بدونم اصلا این نرم افزار Flux با چه زبانی نوشته شده و با چه مدل اجرای ای پیاده سازی شده رفتم فایل مذکورو با نرم افزار ویژوال استودیو 2008 باز کردم . من که باز نکردم روش دابل کلیک کردم خودش بازش کرد و این پنجره ظاهر شد که عکسو در پایین میبینید

الان سوالاتی که در مورد این عکس پایین دارم اینا هستن :

آیا نوشته های داخل مستطیل سبز رنگ همون کدهای میانی هستن یا نه ؟

آیا آدرس های داخل مستطیل قرمز رنگ آدرس بایتکدها در بخش سگمنت کد داخل حافظه رم هستن یا نه ؟

اون ستون Order در بخش مستطیل آبی رنگ یعنی بخش ماژول بنظرم خیلی میتونه جالب باشه و فکر کنم مفهومش این باشه که مازول ها به این ترتیب از این ریفرسنها جمع آوری شدن و کنار هم داخل حافظه رم گردآوری شدن و جالبه که توی هر رفرنس یا فایل Dll هم که اومده بخشیشو داخل حافظه رم قرار داده دقیقا نوشته از کجا تا کجا مربوط به چه فایل ریفرنسی هست و کدوم بخش از مجموعه دستورات کدهای سورس ما هستن که مربوط به فایل flux.exe میشن و ترتیبشونم توسط ستون Order مشخص کرده و همه اینا در قالب پردازشی به نام flux که در حالت Native هست در حال یا آماده ی اجرا هستن .

البته این پاراگراف بالایی زاییده ذهن من بود و نمیدونم درسته یا نه که اینم سوال بعدیم بود ؟

آیا محتویات داخل مستطیل نارنجی رنگ اشاره به محیط اجرای فایل داره که 64 بیتی هستش و باید توسط هندلر های 64 بیتی و دستوالعملهای 64 بیتی اجرا بشه تا اولا بتونن به کل حافظه رم دسترسی داشته باشن ثانیا کدهای ماشین تولید شده بصورت 64 بیتی تولیدبشن و اینکه هر خانه استک 64 بیتی باشه ؟ چون خود فایل 32 بیتی هستش و داخل تسک منیجر کنارش علامت *32 خورده و من وقتی اول محتویات داخل مستطیل قرمز رنگو دیدم فکر کردم کد ماشین کدهای میانی هستن و به این دلیل که فایل اجرایی ذاتا 32 بیتی هستش برای همینم کدهای ماشین بیشتز از 32 بیت نیستن و همیشه نصف مقادیر (نصف با ارزش بالاتر) صفر هستن ولی بعدا فهمیدم که آدرس حافطه رم هستن و وقتی رفتم بخش پرفورمنس پنجره تسک منیجر با توجه به مقدار رمی که نرم افزارا اشغال کرده بودن و زمان اجرای نرم افزار Flux که استارت آپ هست دیدم که نه آدرس رم هستن

یا مثلا مجددا تو مستطیل سبز رنگ اون کدهایی که پشت سر هم تکرار شدن داره به عمل Marshalling یا Serializition اشاره میکنه ؟

من میدونم اون اولش گفتم که خیلی نمیخوام با جزئیات بالا بدوننم فقط میخوام با یکسری مفاهیم آشنا بشم ولی یجاهایی یه چیزایی میبینم که وقتی با اون مفاهیمی که تو مدل اجرایی CLI خوندم همخونی داره دلم میخواد سوال کنم ببینم همونه یا نه

بازم شرمنده اگر تعداد سوالات زیاد شد و ممنون بابت جوابهاتون

149725

farhad_shiri_ex
یک شنبه 14 بهمن 1397, 10:23 صبح
یا مثلا یه سوال دیگم اینه که آیا 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 می نویسید کامپایلر این برنامه را به اسمبلی و بعد هم به کد ماشین تفسیر خواهد کرد.