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

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

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

جستارهای وابسته 
 علوم کامپیوتر
 کامپایلر

منابع 

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