زبان توصیف کامپایلر

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

نسخهٔ اوّلیه

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

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

در سال ۱۹۸۶ نسخهٔ ساده و با پیاده‌سازی مستقیمی از 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 نوشته شده‌است.