تفاوت کامپایلر و اسمبلر
در مقالات قبل که در سایت منتشر کردیم در زمینه کامپایلر و مفسر صبحت هایی کردیم و گفتم هر کدوم چی هستند، چه کاربردی دارند و در نهایت تفاوت هاشون رو مورد بررسی قرار دادیم. حال در این مقاله میخواهیم در مورد تفاوت کامپایلر و اسمبلر صحبت کنیم و این دو رو مورد بررسی قرار دهیم. پیشنهاد میکنم حتما مقالات کامپایلر در برنامه نویسی چیست و بررسی انواع کامپایلر، مفسر در برنامه نویسی چیست و بررسی تفاوت کامپایلر و مفسر رو مطالعه کنید تا درک خوبی نسب به کامپایلر و مفسر داشته باشید. همراه ما باشید تا به بررسی تفاوت کامپایلر و اسمبلر بپردازیم.
قبل از اینکه شروع به تفاوت کامپایلر و اسمبلر کنیم باید ابتدا بدونیم کامپایلر و اسمبلر چی هستند و به چه دردی می خورند بعد بیایم و در مورد تفاوتشون بنویسیم. در بخش زیر هر دو رو تعریف کرده ایم.
کامپایلر چیست؟
اگر بخواهیم کامپایلر رو تعریف کنیم و بگیم واقعا کامپایلر چیست باید بگویم مجموعهای از برنامه یا برنامههای کامپیوتری است که متنی از زبان برنامهنویسی سطح بالا (زبان مبدا) را به زبانی سطح پایین (زبان مقصد)، مثل اسمبلی یا زبان سطح ماشین، تبدیل میکند.
به بیان ساده، کامپایلر برنامهای است که یک برنامه نوشته شده در یک زبان خاص ساختیافته را خوانده و آن را به یک برنامه مقصد (Target Language) تبدیل مینماید. در یکی از مهمترین پروسههای این تبدیل، کامپایلر وجود خطا را در برنامه مبدأ اعلام مینماید.
تعریف یکی از دوستان از کامپایلر، کامپایلر برنامهای رایانهای میباشد که بهمنظور انتقال زبانهای برنامهنویسی سطح بالا به زبانهای سطح پایین مانند زبان اسمبلی و زبان ماشین، جهت اجرایی شدن، طراحی وارائهشدهاند، خروجی این نرمافزار برای ماشینهایی مانند رایانه قابل اجرا هست.
کامپایلرها به عنوان ابتدایی ترین و اصلیترین برنامه، برای برنامه نویسان به شمار میآیند، در اولین نگاه ممکن هست کامپایلر ها برنامههای ساده و بدون تنوع باشند اما با نگاه دقیقتر مشخص میشود که آنها در برخی موارد دارای پیچیدگیهایی هستند که به علت ویژگیهای متفاوت آنها پدید آمده است. برخی از این پیچیدگیها به علت دشوار بودن برخی زبانهای سطح ماشین میباشد؛ به عبارتی زبانهای سطح ماشین مانند زبانهای برنامهنویسی سطح بالا به سادگی قابلفهم برای انسان نیستند و برای همین منظور است که انسان به زبانهای سطح بالا برنامه را مینویسد و با استفاده از کامپایلرها آن را به سطح پایین و سطح ماشین تبدیل میکند.
اسمبلر چیست؟
به طورکلی اسمبلر نرم افزاری است که دستورات قابل فهم برای انسان را به دستورات قابل فهم برای کامپیوتر تبدیل می کند و درصورت وجود اشتباهات دستوری آنها را گزارش می کند.
توضیحات کامل: اسمبلر برنامهای است که با تبدیل یادیارهای دستوری اسمبلی به آپکدها و جایگزینی شناسهها با آدرسهای حافظه، کد هدف را به وجود میآورد. استفاده از ارجاعات نمادی از ویژگیهای کلیدی اسمبلرها است که از محاسبات خستهکننده و بهروزرسانیهای دستی آدرسها بعد از تغییر کد برنامه توسط برنامهنویس جلوگیری میکند. بیشتر اسمبلرها از قابلیت ماکرو نیز بهره میبرند که این امکان را به وجود میآورد تا یک نام خاص برای یک تکه کد مشخص شود و سپس از آن نام در قسمتهای مختلف برنامه استفاده شود و در هنگام اسمبل کردن برنامه تکه کد مربوطه جایگزین نام آن شود؛ به عنوان مثال از این روش برای تولید توالیهای دستوری کوتاه رایج در خلال متن برنامه به جای فراخوانی رویهها استفاده میشود.
نکته مهم: زبان اسمبلی از یادیارها برای نشان دادن هر دستور ماشین سطح پایین یا آپکد استفاده میکند. بعضی آپکدها به یک یا چند عملوند به عنوان بخشی از دستورالعمل نیاز دارند، و بیشتر اسمبلرها میتوانند لیبلها و نمادهایی را به عنوان عملوند، برای نشان دادن آدرسهای حافظه و ثابتهای عددی بپذیرند.
اسمبلرها از دهه ۱۹۵۰ مورد استفاده قرار گرفتند و نوشتن آنها بسیار راحتتر از نوشتن متجرمها برای زبانهای برنامهنویسی سطح بالا است بهطوریکه هر دستور یادیاری و هر آدرس حالت ترکیبی این زبان مستقیماً به یک آپکد زبان ماشین تبدیل میشود. اسمبلرهای جدید، بهطور خاص برای معماریهای ریسک، مانند اسپارک و پاور، هممانند معماری ایکس۸۶ و ایکس۸۶–۶۴، با بهینهسازی زمانبندی دستورالعملها باعث استفاده کارآمد از خط لولهٔ واحد پردازش مرکزی میشوند.
برخی از رایجترین اسمبلرهای معماری ایکس۸۶ عبارتند از:
- مایکروسافت ماکرو اسمبلر (Microsoft Macro Assembler یا MASM)
- نتواید اسمبلر (Netwide Assembler یا NASM)
- گنو اسمبلر (Gnu Assembler یا GAS)
- توربو اسمبلر (Turbo Assembler یا TASM)
تفاوت کامپایلر و اسمبلر
کامپایلر برنامه مورد نظر را به طور کامل بررسی و تبدیل به زبان ماشین می کند اگر به خطایی حین ترجمه برخورد کند آن خطا را نگه داشته و پس از اتمام کار لیستی از خطاهایی را که برنامه داشته به کاربر اعلام می کند.
مفسر یک برنامه را خط به خط ترجمه می کند اگر حین ترجمه به خطا بر بخورد کار ترجمه را پایان داده و روی خط مورد نظر می ایستد تا خطا رفع شود.
اسمبلر که برای زبان اسمبلی به کار میرود خط به خط شروع به ترجمه برنامه میکند از این نظر تا حدودی مانند مفسر عمل می کند اما ممکن است برای تبدیل یک برنامه با پسوند obj مجبور شود که دوبار برنامه را بررسی کند. مثلا اگر تعداد پرش ها بسیار زیاد باشد اسمبلر قسمتهایی از برنامه را خالی می گذارد و پس از یک ترجمه کلی برنامه(مانند کامپایلر) و درک منطق آن به سراغ جاهای خالی رفته و آنها را به زبان ماشین تبدیل می کند.
منبع: مقاله What is the difference between an Assembler, a Compiler & an Interpreter?