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

کامپایلر-کامپایلر یا کامپایلرساز در علوم کامپیوتر ابزاری است که با گرفتن توصیف یک زبان صوری و یک ماشین (مثلا مجموعه دستورالعمل یک پردازنده) برای آن زبان یک تجزیه‌کننده یا کامپایلر می‌سازد. خروجی به شکل کد منبع کامپایلر یا تجریه‌کننده مذکور است و ورودی می‌تواند یک فایل متنی باشد که گرامر زبان را شرح دهد (برای نمونه به شکل فرم باکوس نائور). معمولا کد ارائه شده توسط این ابزارها به تغییراتی نیاز دارد قبل از آن که آماده استفاده باشد.
شمای رفتاری کامپایلر-کامپایلر
تاریخچه
اولین استفاده از لفظ کامپایلر-کامپایلر مربوط است به ۱۹۶۰ میلادی. تونی بروکر که در آن زمان در دانشگاه منچستر فعالیت می‌کرد، برای آسان شدن ساختن کامپایلر برای کامپیوتر اطلس (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 جزو اولین کامپایلر-کامپایلرها هست که در ۱۹۶۷ با اهداف آموزشی توسعه یافت.
علوم کامپیوتر
کامپایلر