برای اجرای کد نرمافزار در یک ماشین، باید فرایندی به نام کامپایل را انجام دهیم.
به زبانهای برنامهنویسیای که برای انسان قابل فهماند، زبان برنامهنویسی سطح بالا (higher level language) میگویند، مثل جاوا و C#.
برای اجرای کد این زبانها در سختافزار، باید آنها را به زبان ماشین (باینری) تبدیل کنیم.
به فرایند تبدیل یک زبان سطح بالا به یک زبان ماشین کامپایل کردن میگویند.
برای کامپایل کردن کد C#، روی Build کلیک کنید و سپس Build solution را انتخاب کنید.
این گزینه تمامی پروژههای موجود در solution را بیلد میکند. برای build کردن یک پروژهی خاص، گزینهی مورد نظر به آن را انتخاب کنید. احتمالاً متوجهی دو پوشهی “obj” و “bin” شدهاید. پوشهی “obj” دارای فایلهای باینری است که به هم لینک نشدهاند. پوشهی “bin” فایلهای باینری کامپایلشدهی نهایی را دارد.
پس حالا حتماً فکر میکنید که کد ماشین نهایی در پوشهی “bin” است. هم بله و هم خیر.
وقتی build را میزنیم، کامپایلر .NET کد برنامه را به یک زبان میانی تبدیل میکند که به آن کدIL میگوییم. کد IL یک کد نیمه کامپایل شده است.
برای دیدن این کد روی برنامه کلیک کنید و developer command prompt را باز کنید و دستور ILDASM را اجرا کنید.
شکل زیر برایتان باز خواهد شد. ILDASM (IL Disassembler) ابزاری ساده است که با نصب VS برایتان نصب میشود و میتوانید با آن کد IL را ببینید. روی File و سپس Open کلیک کنید. به پوشهی bin بروید و فایل exe را باز کنید. این همان کد IL است.
حالا سؤالی که مطرح میشود این است که چه کسی کامپایل نهایی را انجام میدهد و چه زمانی این اتفاق رخ میدهد؟ کامپایل نهایی در زمان اجرای برنامه صورت میگیرد و JIT (Just In Time Compiler) مسئول انجام آن است. پس با اجرای فایل EXE، JIT اجرا میشود و با توجه به نیاز، درلحظه کد را به زبان ماشین کامپایل میکند.
پس فرایند کامپایل به شکل زیر اتفاق میافتد:
- VS،کد C# را به کد IL کامپایل میکند. به عبارت دیگر، با زدن build، کد C# به کد IL کامپایل میشود و این کد در پوشهی debug قرار میگیرد.
- وقتی فایل EXE اجرا میشود، JIT شروع به کار میکند و براساس تقاضا کد C# را به کد ماشین بهینه کامپایل میکند.
حالا سؤالی که مطرح میشود این است که چرا باید ابتدا کد را به یک کد میانی کامپیال کنیم؟ به این دلیل که اگر اپلیکیشن بخواهد در زمان اجرا کامپیال کامل را انجام دهد، سرعت برنامه بسیار پایین میآید.
پس حالا میتوانیم عنوان کنیم که فقط سورسکد بر کامپایل تأثیر ندارد. نوع سیستمعامل و کانفیگریشن ماشین (32 بیت یا 64 بیت) نیز تأثیرگذارند. پس برنامه با توجه به محیط اجرایی به یک کد بهینه کامپایل میشود.
پس اگر برنامه نویس بر اساس سیستم خود کامپایل کامل را انجام دهد، فرایند کامپایل فقط برای سیستم برنامهنویس انجام شده است.
وقتی برنامه را در سیستمی دیگر اجرا میکنیم، این کد برای آن ماشین به صورت بهینه کامپایل نشده است.
پس منطقی است که عمل کامپایل را در زمان اجرا انجام دهیم. چون در زمان اجرا کانفیگریشن محیط را میدانیم و میتوانیم بر اساس آن کدی بهینه را کامپایل کنیم.