گام‌های نهایی برای‌یک ترجمه موفق‌

همان‌طور که زبان‌های معمول از قواعد و اصول مشخصی پیروی می‌کنند، زبان‌های برنامه‌سازی نیز گرامر خاص خود را دارند که تنها در صورتی معنی و مفهوم آنها توسط رایانه درک می‌شود که از آن قواعد پیروی کرده باشیم. البته زبان انسان‌ها به دلیل آن‌که مخاطب آن یک موجود هوشمند است، انعطاف‌پذیری بیشتری نسبت به زبان‌های برنامه‌نویسی رایانه دارند.
کد خبر: ۲۰۹۰۸۷

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

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

تحلیل معنایی

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

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

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

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

تشخیص نوع

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

کد میانی بعد از تحلیل

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

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

بهینه‌سازی‌

هنگامی  که برنامه‌ای به زبان سطح بالا می‌نویسیم ممکن است در تبدیل آن به کد میانی، به دستوراتی برسیم که در کنار یکدیگر به یک نتیجه واحد می‌رسند.

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

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

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

کد اسمبلی

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

جدول نشانه‌‌ها

در ابتدای شروع عمل کامپایل و در مرحله تحلیل لغوی برنامه مبدا، جدولی به نام جدول نشانه‌ها یا جدول نمادها ‌ (symbol tabie)تشکیل می‌شود که هر یک از شناسه‌های تشخیص داده شده در آن ثبت می‌شود.

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

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

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

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

نیازمندی ها