دوست مشترک شما و رایانه

همان‌طور که می‌دانیم برای آن‌که یک برنامه نوشته شده به زبان‌های سطح بالا، در رایانه قابل اجرا باشند باید به زبان ماشین ترجمه شوند که این کار توسط دو دسته از نرم‌افزارها قابل انجام است. به یک دسته از آنها مفسر یا Interpreter گفته می‌شود که هفته گذشته به تفصیل در مورد آن صحبت کردیم و دسته دیگر مترجم یاCompiler نام دارند که به آنها نیز اشاره‌ای داشتیم.
کد خبر: ۲۰۴۴۱۵

 در ادامه قصد داریم به طریقه کارکرد یک کامپایلر بپردازیم و آن را با نگاهی جزئی‌تر بررسی کنیم. آشنایی با طرز کار کامپایلرها و مفسرها و درک مفاهیم موجود در آنها به برنامه‌نویس کمک می‌کند تا برنامه‌های بهتر و بهینه‌ای بنویسد.

یافتن خطا

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

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

بخش‌های کامپایلر

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

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

 بخش اول کار یعنی بخش تحلیل، پیچیدگی‌ چندانی ندارد و اکثر جزییات و تکنیک‌های خاص مربوط به بخش سنتز خواهد بود. حین تحلیل برنامه، اجزا و همچنین اعمالی که توسط برنامه انجام می‌شود توسط کامپایلر مشخص شده و در یک ساختار سلسله مراتبی به نام درخت ثبت می‌شود که این درخت در مرحله سنتز به کار گرفته می‌شود. نرم‌افزارهای مختلفی هستند که برنامه‌های مبدا را دستکاری می‌کنند و به عبارتی نوعی تحلیل روی برنامه‌ها انجام می‌دهند که از جمله می‌توان بهPretty Printer ، بررسی‌ کننده‌های ایستا و ویرایشگرهای ساختار اشاره کرد.

Pretty Printer

یک Pretty Printer  ابزاری است که یک برنامه را تحلیل می‌کند و آن را به گونه‌ای تغییر می‌دهد که ساختار برنامه واضح و خوانا شود. این وضوح و خوانایی می‌تواند تغییر قلم (font) بخش‌های بخصوصی از برنامه یا ایجاد تورفتگی در ساختار برنامه باشد.

در اینجا خوب است به این نکته اشاره کنیم که تورفتگی اصطلاحا به شروع نوشتن کد از چند کاراکتر جلوتر از ابتدای خط جدید گفته می‌شود. این کار براحتی ساختارهای تو در تو را قابل تشخیص کرده و خوانایی برنامه را بالا می‌برد.
تعداد کاراکترهایی که باید در تورفتگی از ابتدای خط جدید در نظر گرفت، به عمق یک ساختار در برنامه بستگی دارد که در جای خود بیشتر در مورد آن صحبت خواهیم کرد.

بررسی‌‌کننده‌های ایستا

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

یک بررسی‌کننده ایستا همچنین می‌تواند متغیرهایی را که قبل از تعریف به کار گرفته شده‌اند، تشخیص دهد و یا متغیرهای تعریف شده بلااستفاده را به برنامه‌نویس اعلام کند. این نوع بررسی‌کننده، برنامه‌نویس را در تشخیص و رفع بسیاری از خطاهای منطقی یاری می‌رساند.

ویرایشگر ساختار

یک ویرایشگر ساختار، رشته‌ای از دستورات را برای ایجاد یک برنامه مبدا به عنوان ورودی دریافت می‌کند. این ویرایشگر نه تنها اعمال ایجاد و اصلاح یک متن از ویرایشگر متن معمولی را انجام می‌دهد، بلکه متن برنامه را تحلیل کرده و یک ساختار سلسله مراتبی مناسب روی برنامه مبدا قرار می‌دهد. بنابراین ویرایشگر ساختار، قادر به انجام کارهای بیشتری است که برای آماده‌سازی برنامه‌ها مفید هستند. برای مثال می‌تواند بررسی کند که ورودی به طور صحیح وارد شده باشد. قادر است کلمات کلیدی را به طور خودکار در برنامه قرار دهد. به عنوان مثال زمانی که کاربر کلمه While  را که یک کلمه کلیدی از ساختار گردشی است، تایپ می‌کند، ویرایشگر، کلمه کلیدی دیگر این ساختار یعنی do را به طور خودکار در متن قرار می‌دهد و به کاربر یادآوری می‌کند که بین آنها باید یک شرط قرار گیرد.

همچنین می‌تواند از کلمه begin  کلمه end  و از پرانتز باز، براکت باز یا آکولاد باز، به ترتیب پرانتز بسته، براکت بسته و آکولاد بسته را نتیجه بگیرد و آن را در متن برنامه قرار دهد تا علاوه بر سرعت بخشیدن به برنامه‌نویسی، از بسیاری خطاها پیش‌گیری کند.

پیش‌پردازشگر

علاوه بر کامپایلر، چندین برنامه دیگر ممکن است برای ایجاد یک زبان مقصد قابل اجرا، لازم باشد. برنامه مبدا ممکن است به ماژول‌هایی تقسیم شود که در فایل‌های مجزا ذخیره شده‌اند. کار جمع‌آوری برنامه مبدا گاهی اوقات به یک برنامه مجزا به نام پیش‌پردازشگر محول می‌شود. این پیش‌پردازشگر ممکن است بخش‌های خلاصه شده‌ای را به احکام زبان مبدا تبدیل کند.

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

در یک جمع‌بندی کلی می‌توان این طور بیان کرد که اسکلت برنامه مبدا به پیش‌پردازشگر تحویل داده می‌شود.
پیش‌پردازشگر پس از انجام امور اولیه، خروجی خود را به عنوان برنامه مبدا به کامپایلر می‌دهد. کامپایلر پس از انجام امور مربوط به کامپایل، در صورتی که با هیچ‌گونه خطای قابل تشخیصی مواجه نشد، کد زبان مقصد یعنی اسمبلی تولید می‌کند و آن را به عنوان ورودی به اسمبلر می‌سپارد و اسمبلر آن را به کد ماشین جابه‌جا‌پذیر تبدیل می‌کند. این کد ماشین هنوز قابل اجرا نیست. در این مرحله ممکن است به تعدادی روال کتابخانه‌ای نیز نیاز باشد.
این روال‌ها به همراه کد ماشین جابجا‌پذیر به بار کننده و پیوند دهنده داده می‌شود تا در نهایت کد ماشین قابل اجرا تولید شود.

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

پارسا ستوده‌نیا

newsQrCode
ارسال نظرات در انتظار بررسی: ۰ انتشار یافته: ۰

نیازمندی ها