همانطور كه میدانیم برای آنكه یك برنامه نوشته شده به زبانهای سطح بالا، در رایانه قابل اجرا باشند باید به زبان ماشین ترجمه شوند كه این كار توسط دو دسته از نرمافزارها قابل انجام است. به یك دسته از آنها مفسر یا Interpreter گفته میشود و دسته دیگر مترجم یاCompiler نام دارند. در ادامه قصد داریم به طریقه كاركرد یك كامپایلر بپردازیم و آن را با نگاهی جزئیتر بررسی كنیم. آشنایی با طرز كار كامپایلرها و مفسرها و درك مفاهیم موجود در آنها به برنامهنویس كمك میكند تا برنامههای بهتر و بهینهای بنویسد. یافتن خطا بخش مهمی از فرآیند ترجمه مربوط به یافتن خطا در برنامه و اعلام آن به برنامهنویس است. در یك برنامه انواع مختلفی خطا ممكن است وجود داشته باشد كه بخشی از آنها توسط كامپایلر قابل تشخیص است و بخش دیگر تنها با تست و آزمون یافت میشود و باید توسط برنامهنویس رفع شود. یك كامپایلر تنها در صورتی برنامه نهایی و فایل اجرایی را تولید میكند كه هیچگونه خطای قابل تشخیص توسط خود را در برنامه پیدا نكند. هنگام بیان طرز كار كامپایلر، به خطاهایی كه ممكن است رخ دهد اشاره خواهیم كرد. هزاران زبان برنامهسازی با تنوع كاربرد و نحوه كار تاكنون طراحی شده است كه بسیاری از آنها نیز به جای آنكه زبان مبدا را به زبان ماشین تبدیل كنند، آن را به زبان دیگری تبدیل میكنند؛ اما صرفنظر از این تنوع، طرز كار كامپایلرهای آنها از یكسری قواعد و اصول واحد پیروی میكند و تنها تفاوت بین آنها در پیادهسازی و جزییات كار آنهاست. بخشهای كامپایلر هر كامپایلر را میتوان به دو بخش عمده تقسیم كرد. یك بخش آن برای عمل خواندن متن برنامه و تجزیه آن به اجزای تشكیلدهنده و تولید یك نمایش میانی از برنامه مبدا است كه به آن تحلیل گفته میشود. در این مرحله با استفاده از جداكنندهها و كاراكترهای كنترلی موجود در برنامه، تكتك كلمات تشخیص داده میشود و نقش آنها مشخص میشود و پس از آن یك نمایش جدید از برنامه با استفاده از این تحلیل تولید میشود. بخش دوم كار كامپایلر مربوط به ایجاد برنامه مقصد از این نمایش میانی حاصل از بخش تحلیل است كه به آن عمل سنتز گفته میشود. بخش اول كار یعنی بخش تحلیل، پیچیدگی چندانی ندارد و اكثر جزییات و تكنیكهای خاص مربوط به بخش سنتز خواهد بود. حین تحلیل برنامه، اجزا و همچنین اعمالی كه توسط برنامه انجام میشود توسط كامپایلر مشخص شده و در یك ساختار سلسله مراتبی به نام درخت ثبت میشود كه این درخت در مرحله سنتز به كار گرفته میشود. نرمافزارهای مختلفی هستند كه برنامههای مبدا را دستكاری میكنند و به عبارتی نوعی تحلیل روی برنامهها انجام میدهند كه از جمله میتوان به Pretty Printer ، بررسی كنندههای ایستا و ویرایشگرهای ساختار اشاره كرد. Pretty Printer یك Pretty Printer ابزاری است كه یك برنامه را تحلیل میكند و آن را به گونهای تغییر میدهد كه ساختار برنامه واضح و خوانا شود. این وضوح و خوانایی میتواند تغییر قلم (font) بخشهای بخصوصی از برنامه یا ایجاد تورفتگی در ساختار برنامه باشد. در اینجا خوب است به این نكته اشاره كنیم كه تو رفتگی اصطلاحا به شروع نوشتن كد از چند كاراكتر جلوتر از ابتدای خط جدید گفته میشود. این كار براحتی ساختارهای تو در تو را قابل تشخیص كرده و خوانایی برنامه را بالا میبرد. تعداد كاراكترهایی كه باید در تو رفتگی از ابتدای خط جدید در نظر گرفت، به عمق یك ساختار در برنامه بستگی دارد. بررسیكنندههای ایستا یك بررسیكننده ایستا سعی بر آن دارد كه برنامه را خوانده و بدون اجرای برنامه بعد از تحلیل، خطاهای نهفته در برنامه را پیدا كند. به عنوان مثال، یك بررسیكننده ایستا ممكن است بخشهایی از برنامه را كه هرگز اجرا نمیشوند پیدا كند و به برنامهنویس اعلام كند. با توجه به این اعلام یا اشكالی در برنامه وجود دارد كه اجازه نمیدهد برنامه هرگز به آن قسمت از كد برسد كه برنامهنویس با پی بردن به این مساله، اشكال را رفع كرده و آن بخش را دسترسیپذیر میكند و یا با صلاح دید خود آن بخش را حذف میكند تا از حجم كد كم كند. البته این امكان نیز وجود دارد كه برنامهنویس به منظور خاصی آن بخش را به برنامه خود اضافه كرده باشد. یك بررسیكننده ایستا همچنین میتواند متغیرهایی را كه قبل از تعریف به كار گرفته شدهاند، تشخیص دهد و یا متغیرهای تعریف شده بلااستفاده را به برنامهنویس اعلام كند. این نوع بررسیكننده، برنامهنویس را در تشخیص و رفع بسیاری از خطاهای منطقی یاری میرساند. ویرایشگر ساختار یك ویرایشگر ساختار، رشتهای از دستورات را برای ایجاد یك برنامه مبدا به عنوان ورودی دریافت میكند. این ویرایشگر نه تنها اعمال ایجاد و اصلاح یك متن از ویرایشگر متن معمولی را انجام میدهد، بلكه متن برنامه را تحلیل كرده و یك ساختار سلسله مراتبی مناسب روی برنامه مبدا قرار میدهد. بنابراین ویرایشگر ساختار، قادر به انجام كارهای بیشتری است كه برای آمادهسازی برنامهها مفید هستند. برای مثال میتواند بررسی كند كه ورودی به طور صحیح وارد شده باشد. قادر است كلمات كلیدی را به طور خودكار در برنامه قرار دهد. به عنوان مثال زمانی كه كاربر كلمه While را كه یك كلمه كلیدی از ساختار گردشی است، تایپ میكند، ویرایشگر، كلمه كلیدی دیگر این ساختار یعنی do را به طور خودكار در متن قرار میدهد و به كاربر یادآوری میكند كه بین آنها باید یك شرط قرار گیرد. همچنین میتواند از كلمه begin كلمه end و از پرانتز باز، براكت باز یا آكولاد باز، به ترتیب پرانتز بسته، براكت بسته و آكولاد بسته را نتیجه بگیرد و آن را در متن برنامه قرار دهد تا علاوه بر سرعت بخشیدن به برنامهنویسی، از بسیاری خطاها پیشگیری كند. پیشپردازشگر علاوه بر كامپایلر، چندین برنامه دیگر ممكن است برای ایجاد یك زبان مقصد قابل اجرا، لازم باشد. برنامه مبدا ممكن است به ماژولهایی تقسیم شود كه در فایلهای مجزا ذخیره شدهاند. كار جمعآوری برنامه مبدا گاهی اوقات به یك برنامه مجزا به نام پیشپردازشگر محول میشود. این پیشپردازشگر ممكن است بخشهای خلاصه شدهای را به احكام زبان مبدا تبدیل كند. برنامه مقصدی كه توسط كامپایلر ایجاد میشود، قبل از اینكه قابل اجرا باشد، ممكن است نیاز به پردازشهای بیشتری داشته باشد. كامپایلر كد زبان اسمبلی تولید میكند كه توسط اسمبلر به كد ماشین ترجمه شده و سپس با تعدادی روال كتابخانهای ادغام شده و بعد به كدی تبدیل میشود كه عملا روی ماشین قابل اجراست. در یك جمعبندی كلی میتوان این طور بیان كرد كه اسكلت برنامه مبدا به پیشپردازشگر تحویل داده میشود. پیشپردازشگر پس از انجام امور اولیه، خروجی خود را به عنوان برنامه مبدا به كامپایلر میدهد. كامپایلر پس از انجام امور مربوط به كامپایل، در صورتی كه با هیچگونه خطای قابل تشخیصی مواجه نشد، كد زبان مقصد یعنی اسمبلی تولید میكند و آن را به عنوان ورودی به اسمبلر میسپارد و اسمبلر آن را به كد ماشین جابهجاپذیر تبدیل میكند. این كد ماشین هنوز قابل اجرا نیست. در این مرحله ممكن است به تعدادی روال كتابخانهای نیز نیاز باشد. این روالها به همراه كد ماشین جابجاپذیر به بار كننده و پیوند دهنده داده میشود تا در نهایت كد ماشین قابل اجرا تولید شود.