کامپایلر-کامپایلر

از ویکی‌پدیا، دانشنامهٔ آزاد
پرش به: ناوبری، جستجو

کامپایلر-کامپایلر یا کامپایلرساز (به انگلیسی: Compiler-compiler) در علوم کامپیوتر ابزاری است که با گرفتن توصیف یک زبان صوری و یک ماشین (مثلاً مجموعه دستورالعمل یک پردازنده) برای آن زبان یک تجزیه کننده یا کامپایلر می‌سازد. خروجی به شکل کد منبع کامپایلر یا تجریه کنندهٔ مذکور است و ورودی می‌تواند یک فایل متنی باشد که گرامر زبان را شرح دهد (برای نمونه به شکل فرم باکوس نائور). معمولاً کد ارایه شده توسط این ابزارها به تغییراتی نیاز دارد قبل از آن که آماده استفاده باشد.[۱]

شمای رفتاری کامپایلر-کامپایلر

تاریخچه[ویرایش]

اولین استفاده از لفظ کامپایلر-کامپایلر مربوط است به ۱۹۶۰ میلادی. تونی بروکر که در آن زمان در دانشگاه منچستر فعالیت می‌کرد، برای آسان شدن ساختن کامپایلر برای کامپیوتر اطلس (Atlas Computer) ابزاری با این نام ساخت. در اصطلاح شناسی امروزی، آنچه بروکر انجام داد بیشتر به یک کامپایلر نوعی با قابلیت گسترش نحوی مطابقت دارد تا کامپایلر-کامپایلر و عموماً کامپایلر-کامپایلرهای امروزی فقط تجزیه کننده می‌سازند. فراگیر شدن لفظ کامپایلر-کامپایلر بیشتر ناشی از یک (کامپایلر) می‌باشد تا کار بروکر.[۲] از روندهای جدید در این حوزه می‌توان به تلاش برای پیاده‌سازی کامپایلر سازهایی بر طبق معناشناسی زبان (Semantics) اشاره کرد. مقالهٔ بدوین[۳] که مربوط به ۱۹۸۲ میلادی است، به بررسی این موضوع می‌پردازد و ادعا می‌کند که این روش اولین گام برای ساخت خودکار کامپایلرهایی بهینه و مطمین، به معنی اینکه صحت برنامه قابل اثبات باشد، است.

مثال[ویرایش]

برای نمونه کد زیر جمع یک سری عدد را تجریه می کند: (بعنوان مثال رشته ی: "۰+۱+۲")

 // Common options, for example, the target language
 options
 {
  language = "CSharp";
 }
 // Followed by the parser 
 class SumParser extends Parser;
 options
 {
   k = 1; // Parser Lookahead: 1 Token
 }
 // Definition of an expression
 statement: INTEGER (PLUS^ INTEGER)*;
 // Here is the Lexer
 class SumLexer extends Lexer;
 options
 {
   k = 1; // Lexer Lookahead: 1 characters
 }
 PLUS: '+';
 DIGIT: ('0'..'9');
 INTEGER: (DIGIT)+;

کد بالا برای ANTLR می باشد و گرامر ساده ی ذکر شده را برای ANTLR توصیف می کند. با مقداردهی به language در بخش options می توان زبان خروجی را تعیین کرد, که ANTLR برنامه تجزیه کننده را با آن زبان به ما می دهد. همچنین با مقداردهی به k می توان الگوریتم تجزیه را تنظیم کرد. ANTLR با LL k کار می کند, و می توان k را به این شکل تعیین کرد. این عدد تعداد توکن هایی که برنامه جلو جلو نگاه می کند را مشخص می کند. سپس می توانیم در برنامه از تجزیه کننده ساخته شده توسط ANTLR کمک بگیریم:

 TextReader reader;
 // (...) Fill TextReader with character
 SumLexer lexer = new SumLexer(reader);
 SumParser parser = new SumParser(lexer);

 parser.expression();

اینجا با فراخوانی parser می توانیم عبارت ورودی را تجزیه کنیم.

انواع[ویرایش]

  • ANTLR

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

  • Bison

گنو_بایسون بخشی از پروژه گنو است و با خواندن مشخصات یک زبان مستقل از متن برای آن زبان تجزیه کننده می‌سازد. بطور پیش فرض، بایسون از LALR استفاده می‌کند اما از GLR هم پشتیبانی می‌کند.[۵]

  • Coco/R

وجه تمایز این ابزار استفاده از فرم باکوس نائور گسترش یافته برای توصیف زبان است. اسکنری که Coco/R می‌سازد، مانند یک ماشین تعیین‌پذیر حالات متناهی عمل می‌کند و از قابلیت تشخیص پراگما پشتیبانی می‌کند. پراگما توکن‌هایی هستند که بخشی از نحو نیستند اما در هر جایی از ورودی می‌توانند ظاهر شوند، و دستورهایی مختص کامپایلر هستند.[۶]

  • Lemon

بخشی از پروژه اس‌کیوال_لایت می‌باشد. تجزیه کننده ای که Lemon می‌سازد تجزیه‌کننده_ال‌ای‌ال‌آر می‌باشد و خروجی هم به زبان C است.[۷]

  • Yacc

یک_(کامپایلر) این ابزار توسط S.C.Johnson در آزمایشگاه‌های_بل توسعه یافته‌است. عموماً به همراه لکس استفاده می‌شود.[۸]

  • XPL

XPL یک زبان برنامه‌نویسی بر مبنای PL/I می‌باشد به همراه کامپایلری به همین زبان و یک کامپایلر-کامپایلر که به کمک آن بتوان کامپایلرهای مشابهی برای سایر زبان‌ها پیاده‌سازی کرد. XPL جزو اولین کامپایلر-کامپایلرها هست که در ۱۹۶۷ با اهداف آموزشی توسعه یافت.[۹]

جستارهای وابسته[ویرایش]

منابع[ویرایش]