کامپایلر compiler چیست

کامپایلر (Compiler) چیست و چرا از آن استفاده میشود؟

کامپایلر یا compiler چیست؟

کامپایلر یا Compiler یک برنامه به خصوص است که میتواند کدهایی که ما نوشته ایم را برای CPU ترجمه کند تا بتواند دستورات ما را اجرا بکند. به این عمل کامپایل کردن میگویند. در این مقاله میخواهیم به این سوال پاسخ بدهیم که کامپایلر چیست؟ چرا استفاده میشود و به چه دردی میخورد؟ با برنامه چی همراه باشید.

در این مقاله چه مواردی بررسی میشوند؟
کامپایلر یعنی چه؟
کامپایلر چگونه کار میکند؟
کامپایلر در زبان جاوا چگونه کار میکند؟
دیکامپایل کردن (Decompile) چیست؟
کدام زبان های برنامه نویسی از کامپایلر AOT استفاده میکنند؟
کد تفسیر شده چیست؟
کدام زبان های برنامه نویسی از کامپایلر JIT استفاده میکنند؟
مزایا و معایب کامپایل کردن های AOT و JIT
منابع بیشتر برای مطالعه درباره کامپایلر


کامپایلر یعنی چه؟

کامپایلر به زبان ساده یک نرم افزار است که کدهایی که برنامه نویسان نوشته اند را به زبان ماشین (یعنی صفر و یک) تبدیل میکند تا CPU بتواند آنها را بفهمد و اجرا کند. به عمل تبدیل سورس کد (چیزی که برنامه نویس نوشته است) به کد ماشین (صفر و یک یا Machine Code) کامپایل کردن یا Compilation گفته میشود.

کامپایلر چیست؟

به طور معمول برنامه نویس دستوراتی که میخواهد را در قالب کد، به زبان های برنامه نویسی مختلف مانند جاوا، سی شارپ و… مینویسد. اما CPU نمیتواند این دستورات را به همین شکل متوجه بشود و آنها را اجرا بکند. بنابراین به یک واسطه در این میان نیاز داریم که کد های برنامه نویس را به زبانی که CPU آنرا میفهمد ترجمه کند. به این واسط، کامپایلر میگوییم.


کامپایلر چگونه کار میکند؟

در زمان اجرا شدن (یا همان Run شدن برنامه)، کامپایلر ابتدا همه کدها و دستوراتی که نوشته اید را آنالیز و بررسی میکند که از لحاظ سینتکس مشکلی نداشته باشد. اگر بعد از بررسی هیچ مشکلی وجود نداشته باشد، کدهای خروجی توسط کامپایلر ساخته میشود. معمولا به این کدی که در نهایت تولید میشود، Object Code یا گاهی اوقات Object Module میگوییم. (البته این رو هم بگم که کلمه Object اصلا هیچ ربطی به شی گرایی در برنامه نویسی نداره). در حقیقت Object Code همان کد به زبان ماشین است که CPU میتواند آنها را اجرا کند.

compiler

یک کامپایلر چهار مرحله اصلی را انجام میدهد:

  • اسکن کردن (Scanning): اسکنر حروف (کاراکتر) ها را تک به تک در سورس کد ما میخواند و به خاطر میسپارد که کدام حرف در کدام خط و کدام موقعیت قرار داشت.
  • بررسی لغوی (Lexical Analysis): کامپایلر دنباله هایی از حروف میسازد (که در سورس کد وجود داشتند و در مرحله قبل آنها را اسکن کردیم)، سپس این دنباله ها به رشته هایی از حروف تبدیل میشوند که به آنها Token میگوییم. بعد این Token ها توسط یک برنامه به نام Lexical Analyzer به یکدیگر مرتبط میشوند. نرم افزار Lexical Analyzer از یک جدول نمونه برای ذخیره کلمه هایی که درون کد منبع (Source Code) وجود دارند استفاده میکند که مطمئن شود با Token های تولید شده مطابقت دارند.
  • بررسی سینتکسی (Syntactic Analysis): در این مرحله بررسی سینتکسی انجام میشود. یعنی Token هایی که در قسمت قبل تولید شده اند را بررسی میکند که با روش درستی که قرار است استفاده بشوند تولید شده اند یا نه؟ سینتکس به زبان ساده به دستور ساخت درست تعدادی کلمه کلیدی گفته میشود که قرار است نتیجه ای را برای ما تولید کنند. (سینتکس یا Syntax به دستور زبان و نحوه نوشتن زبان های برنامه نویسی گفته میشه که توی یه مقاله دیگه بصورت کامل توضیحاتش رو دادیم و این مقاله رو میتونین از اینجا بخونین). کامپایلر باید از لحاظ قوانین سینتکسی برنامه را بررسی کند که اشکالی وجود نداشته باشد.
  • بررسی سمنتیکسی (Semantic Analysis): این مرحله از تعدادی از مراحل بالا تشکیل شده است. ابتدا ساختار Token با توجه به قواعد گرامر یک زبان خاص، بررسی میشود. ساختار Token با استفاده از مفسر و کامپایلر معنی پیدا میکند و در نهایت یک کد به نام Object Code تولید میشود. این کد آبجکت شامل دستوراتی است که توسط CPU میتوانند اجرا بشوند. در این مرحله همه کدها تبدیل به دستورات قابل فهم برای پردازنده میشوند و برنامه ما اجرا میشود.

کامپایلر در زبان جاوا چگونه کار میکند؟

زبان برنامه نویسی جاوا، که در برنامه نویسی شی گرا استفاده میشود، مفهومی را معرفی کرد که خروجی کامپایلر (که در اینجا به آن bytecode گفته میشود)، توانایی اجرا روی هر سیستم کامپیوتری را داشته باشد. توانایی انجام این کار با استفاده از ماشین مجازی جاوا امکان پذیر شده است. یعنی نرم افزاری به نام ماشین مجازی جاوا (Java Virtual Machine) بایتکد هایی که تولید شده اند را به دستوراتی تبدیل میکند که برای همین دستگاهی که الان در حال اجرای برنامه ما میباشد، قابل فهم است.

کامپایل کردن

به زبان ساده تر یعنی کامپایل کردن برنامه هایی که در زبان جاوا نوشته شده اند در دو مرحله انجام میشود. ابتدا کدهایی که نوشتیم به بایتکد تبدیل میشوند و سپس ماشین مجازی جاوا آنها را با توجه به سیستم ما به کدهای قابل فهم برای ماشین تبدیل میکند.


 دیکامپایل کردن (Decompile) چیست؟

دیکامپایل دقیقا برعکس کامپایل کردن است. یعنی وقتی کدهای کامپایل شده (یا همان آبجکت کد) را به کدهایی از زبان های برنامه نویسی سطح بالا که خودمان با آنها برنامه نویسی میکنیم تبدیل میکنیم، عمل دیکامپایل کردن رخ داده است.


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

زمانی که همه کدها یکجا به زبان ماشین تبدیل میشوند قبل از اینکه به پلفترمی که آن را اجرا میکند برسند، به آن Ahead Of Time (به معنی جلوتر از زمان) یا بصورت مخفف کامپایل کردن AOT گفته میشود. یعنی برنامه قبل از اینکه اجرا بشود، کاملا کامپایل میشود و به کدهای ماشین تبدیل میشود و سپس در اختیار پلتفرم قرار میگیرد تا اجرا بشود. بسیاری از زبان های برنامه نویسی معروف که حتما اسم آنها را هم شنیده اید، نیاز به کامپایلر دارند. مانند:

  • Fortan
  • Pascal
  • Assembely Language
  • C
  • C++
  • Swift

قبل از زبان جاوا و سی شارپ، همه برنامه های کامپیوتری یا کامپایل میشدند یا با استفاده از Interpreter تفسیر میشدند.


کد تفسیر شده چیست؟

کدهای تفسیر شده (Interpreted Code) دستوراتی که درون برنامه نوشته اید را بدون کامپایل کردن و تبدیل آنها به زبان ماشین، اجرا میکند. کد تفسیر شده، سورس کد را بصورت مستقیم تجزیه میکند، این کدها با یک ماشین مجازی هماهنگ هستند که آنها را بصورت همزمان حین اجرا شدن برای ماشین ترجمه میکند. البته این ماشین مجازی میتواند از کدهایی که از قبل کامپایل شده اند هم استفاده کند. مثلا زبان جاوا اسکریپت معمولا تفسیر میشود.

زبان کامپایل شده سریعتر از زبان تفسیر شده اجرا میشود. زیرا لازم نیست که در زمان اجرا شدن برنامه، کار خاصی انجام بشود. همه کارها از قبل انجام شده اند.


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

کامپایلر JIT مخفف سه کلمه Just In Time میباشد. این مدل از کامپایلر ها ترکیبی از کامپایلر های AOT و مفسر ها هستند که بالاتر درباره آنها توضیح دادیم. زبان های جاوا و سی شارپ از کامپایلر های JIT استفاده میکنند. وقتی که یک برنامه جاوا نوشته میشود، JIT Compiler این برنامه را به بایتکد تبدیل میکند. این بایتکد ها شامل کدهایی نیستند که دستورات مشخصی برای پردازنده یک پلتفرم سخت افزاری خاص داشته باشد.

یعنی بایتکد ها وابستگی به پلتفرم ندارند بنابراین میتوانند روی همه Platform هایی که از جاوا پشتیبانی میکنند اجرا بشوند. سپس این بایتکد ها با ماشین مجازی جاوا به زبان ماشین ترجمه میشوند. اما این زبان ماشین با توجه به سیستمی که برنامه روی آن اجرا میشود فرق میکند. به عبارت ساده تر، کامپایل کردن این برنامه ها دو مرحله ای است.


مزایا و معایب کامپایل کردن های AOT و JIT

کامپایل کردن بصورت Ahead Of Time یا AOT شروع سریعتری را برای شما فراهم میکند، مخصوصا زمانهایی که دستورات زیادی در زمان شروع شدن برنامه باید اجرا بشوند کارایی بیشتری خواهد داشت. اما در عین حال، به رم و فضای هارد دیسک بیشتری نیاز دارد.

کامپایل کردن JIT یا همان Just In Time، هنگام اجرا شدن با توجه به پلتفرمی که روی آن اجرا میشود کامپایل را انجام میدهد و همین مورد باعث میشود که عملکرد بهتری را تحویل ما بدهد. کامپایلر JIT کدهای تقویت شده ای را تولید میکند زیرا پلتفرمی که الان برنامه روی آن در حال اجرا شدن است را در نظر میگیرد. البته باید این را هم بگوییم که نسبت به کامپایلر AOT به زمان بیشتری برای اجرا شدن نیاز دارد.

شما هم اگر برنامه نویسی کار کرده باشید حتما با کامپایلر ها برخورد داشته اید و اطلاعاتی درباره آنها بلد هستید. میتوانید با به اشتراک گذاشتن و نوشتن نظرات خودتان در قسمت نظرات (همین پایین) این مقاله آموزشی را کامل تر کنید.


منابع بیشتر برای مطالعه درباره کامپایلر

در این قسمت از مقاله میخواهیم منابع دیگری که میتوانید از آنها برای یادگیری درباره کامپایلر ها استفاده کنید را معرفی کنیم. برای مطالعه بیشتر به لینک های زیر مراجعه کنید:

درباره نویسنده

3 در مورد “کامپایلر (Compiler) چیست و چرا از آن استفاده میشود؟”

  1. در رابطه با پایتون توی مطلب تون هیچ اشاره ای نکردید مثلا اگر یک کرک برنامه با پایتون نوشته شده و ما بخواهیم با کامپایلر به سورس کدش برسیم و کرک کنیم با چه برنامه باید این کار کنیم با gcc نمیشه

  2. همه چیز رو به صورت خیلی عالی توضیح دادین فقط یه چیز میمونه

    اونم اینه که خود کامپایلر کد ها رو با چی به صفر و یک تبدیل میکنه وقتی که از سی پی یو استفاده نمیکنه خود کامپایلر چطور کد ها رو بررسی میکنه؟

دیدگاه‌ خود را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

اسکرول به بالا