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

تاریخچه
-------

### نسخهٔ اوّلیه

زبان توصیف کامپایلر در سال ۱۹۷۰ طراحی و در سال ۱۹۷۱ توسط Cornelis H. A. Koster در دانشگاه رادبود پیاده‌سازی شد. ظهور این زبان هم‌زمان بود با ظهور زبان برنامه‌نویسی الگول۶۸ و اولین آزمایش زبان توصیف کامپایلر با این زبان انجام شد. این زبان سال‌ها در دانشگاه صنعتی برلین(غربی) برای درس طراحی کامپایلر تدریس می‌شد. در کشورهای دیگری نظیر فرانسه، مجارستان و جمهوری دموکراتیک آلمان نیز از این زبان استفاده می‌شده است. بسیاری از کسانی که از این زبان استفاده می‌کردند آن را مطابق خواست خود گسترش داده‌اند.

### نسخهٔ ثانویه

در سال ۱۹۷۵ با اعمال تغییراتی نسخهٔ جدید این زبان با نام CDL2 تثبیت شد. برای این که این زبان روی ماشین‌های مختلف قابل اجرا باشد، چند نسخه تولیدکنندهٔ کد برای آن نوشته شد. این زبان ویژگی‌هایی داشت که نسخهٔ قبلی فاقد آن‌ها بودند. از قبیل:

* بهینه‌سازی سراسری
* کامپایل‌های جداگانه
* بررسی معنایی ایستا
* برنامه‌نویسی پودمانی

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

در سال ۱۹۷۶ زبان توصیف کامپایلر پا از حوزهٔ دانشگاهی فراتر گذاشت و سازندگان آن با چند سازندهٔ آلمانی قرارداد بستند. در نتیجهٔ این قرارداد پروژه‌ای در سال ۱۹۷۷ در دانشگاه صنعتی برلین با هدف ساختن یک سیستم برنامه‌نویسی مبتنی بر CDL2 و مناسب استفاده در صنعت کلید خورد. در کنار این پروژه در دانشگاه رادبود توسعه و نگه‌داری کامپایلر CDL2 در حال انجام بود.

### پیاده‌سازی با پاسکال

در سال ۱۹۸۶ نسخهٔ ساده و با پیاده‌سازی مستقیمی از CDL2 با نام Tiny CDL2 به زبان پاسکال پیاده‌سازی شد. هدف این پیاده‌سازی آشنایی قشر گسترده‌تری از مردم با این زبان و فلسفهٔ ایجاد آن بود.

### نسخهٔ سوم

نسخهٔ سوم این زبان در سال ۲۰۰۴ و با نام CDL3 ارائه شد.  این زبان تغییرات زیادی نسبت به CDL1 کرده. بسیاری از مفاهیم در این نسخهٔ جدید به جای معنای صریح، با نحو بیان شده‌اند. عملگرهای ابتدایی برای دسترسی به داده و عملیات ریاضی هم به زبان اضافه شده‌اند.

طراحی
-----

نسخهٔ اوّلیهٔ این زبان بسیاری از ویژگی‌های زبان‌های معمول برنامه‌نویسی را ندارد. از جملهٔ این ویژگی‌ها داشتن عملگرهای توکار مثل جمع، ضرب، مقایسه و یا عمل تخصیص است.  قواعد ارزیابی این زبان شبیه به نحو قواعد فرم باکوس نائور است که برای بیان قواعد زبان‌های مستقل از متن ارائه شده‌است. 

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

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

قطعه‌ای کد از دستورالعمل CDL2 برای شهود به ساختار این زبان در زیر آمده‌است. شایان ذکر است که این قطعه برنامه برنامهٔ کاملی نیست. عملگرهای ابتدایی به زبان جاوا(یا سی) نوشته شده اند و لازم است اعضای آرایه تعریف شوند.

```
ACTION quicksort +>from +>to -p -q:
  less+from+to, split+from+to+p+q,
    quicksort+from+q, quicksort+p+to;
  +.

ACTION split +>i +>j + p> + q> -m:
  make+p+i, make+q+j, add+i+j+m, halve+m,
    (again: move up+j+p+m, move down+i+q+m,
       (less+p+q, swap item+p+q, incr+p, decr+q, *again;
        less+p+m, swap item+p+m, incr+p;
        less+m+q, swap item+q+m, decr+q;
        +)).

FUNCTION move up +>j +>p> +>m:
  less+j+p;
  smaller item+m+p;
  incr+p, *.

FUNCTION move down +>i +>q> +>m:
  less+q+j;
  smaller item+q+m;
  decr+q, *.

TEST less+>a+>b:=a"<"b.
FUNCTION make+a>+>b:=a"="b.
FUNCTION add+>a+>b+sum>:=sum"="a"+"b.
FUNCTION halve+>a>:=a"/=2".
FUNCTION incr+>a>:=a"++".
FUNCTION decr+>a>:=a"--".

TEST smaller item+>i+>j:="items["i"]<items["j"]".
ACTION swap items+>i+>j-t:=t"=items["i"];items["i"]=items["j"];items["j"]="t.
```

استفاده
-------

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

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

علاوه بر این‌ها یک نرم‌افزار رابط کاربری گرافیکی تجاری هم به زبان CDL نوشته و نگه‌داری شده. این برنامه یک برنامهٔ گرفتن تصویرهای دندان بوده و مالکیت آن اکنون با  DEXIS  است. یک نرم‌افزار مدیریت مطب دندانپزشکی و برنامهٔ Mephisto که یک رایانهٔ شطرنج‌باز است نیز با CDL نوشته شده‌است.

منابع
-----

1. ↑  «Affix Grammar».
2. 1 2 3 4  «Implementing portable and efficient software in an open-ended language».
3. ↑  «CDL3» (PDF).
4. ↑  «Mephisto».