Język opisu kompilatora

Język opisu kompilatora (CDL) to język programowania oparty na gramatyce afiksowej . Jest bardzo podobny do formy Backusa – Naura (BNF). Został zaprojektowany do tworzenia kompilatorów . Jest bardzo ograniczony w swoich możliwościach i przepływie sterowania, i celowo. Korzyści z tych ograniczeń są dwojakie.

Z jednej strony umożliwiają zaawansowaną analizę przepływu danych i sterowania stosowaną przez optymalizatory CDL2, co skutkuje niezwykle wydajnym kodem. Inną korzyścią jest to, że sprzyjają bardzo szczegółowej konwencji nazewnictwa. To z kolei prowadzi do programów, które w dużym stopniu samodokumentują się .

Język wygląda trochę jak Prolog (nie jest to zaskakujące, ponieważ oba języki powstały mniej więcej w tym samym czasie bez pracy nad gramatyką afiksową ). Jednak w przeciwieństwie do Prologu, przepływ sterowania w CDL jest deterministycznie oparty na sukcesie/porażce, tj. żadne inne alternatywy nie są wypróbowywane, gdy bieżąca się powiedzie. Pomysł ten jest również używany w gramatyce parsowania wyrażeń .

CDL3 to trzecia wersja języka CDL, znacznie różniąca się od poprzednich dwóch wersji.

Projekt

Oryginalna wersja, zaprojektowana przez Cornelisa HA Kostera z Uniwersytetu w Nijmegen , która pojawiła się w 1971 roku, miała dość nietypową koncepcję: nie miała rdzenia. Typowe źródło języka programowania jest tłumaczone na instrukcje maszynowe lub sekwencje tych instrukcji w puszkach. Reprezentują one rdzeń, najbardziej podstawowe abstrakcje obsługiwane przez dany język. Takimi prymitywami mogą być dodawanie liczb, wzajemne kopiowanie zmiennych i tak dalej. CDL1 nie ma takiego rdzenia. Obowiązkiem programisty jest dostarczenie prymitywnych operacji w formie, która może być następnie przekształcona w instrukcje maszynowe za pomocą asemblera lub kompilatora dla języka tradycyjnego. Sam język CDL1 nie ma koncepcji prymitywów, nie ma koncepcji typów danych poza słowem maszynowym (abstrakcyjna jednostka pamięci - niekoniecznie prawdziwe słowo maszynowe jako takie). Zasady oceny są raczej podobne do formularzy Backusa – Naura ; w rzeczywistości napisanie parsera dla języka opisanego w BNF jest raczej proste w CDL1.

Zasadniczo język składa się z reguł. Reguła może odnieść sukces lub nie. Reguła składa się z alternatyw, które są sekwencjami wywołań innych reguł. Reguła odnosi sukces, jeśli którakolwiek z jej alternatyw się powiedzie; są one wypróbowywane po kolei. Alternatywa powiedzie się, jeśli wszystkie wywołania jej reguł zakończą się powodzeniem. Język zapewnia operatorom tworzenie pętli oceny bez rekurencji (chociaż nie jest to bezwzględnie konieczne w CDL2, ponieważ optymalizator osiąga ten sam efekt) oraz kilka skrótów w celu zwiększenia wydajności oceny rekurencyjnej, ale podstawowa koncepcja jest taka, jak powyżej. Oprócz oczywistego zastosowania w bezkontekstowym analizowaniu gramatyki, CDL dobrze nadaje się również do aplikacji kontrolnych, ponieważ wiele aplikacji kontrolnych to zasadniczo głęboko zagnieżdżone reguły if-then.

Każda reguła CDL1 podczas oceny może działać na danych, które są nieokreślonego typu. W idealnej sytuacji dane nie powinny być zmieniane, chyba że reguła się powiedzie (brak skutków ubocznych w przypadku niepowodzenia). Powoduje to problemy, ponieważ chociaż ta reguła może się powieść, reguła, która ją wywołuje, może nadal zawieść, w takim przypadku zmiana danych nie powinna zostać zastosowana. Zapewnienie powyższego zachowania jest dość łatwe (choć wymaga dużej ilości pamięci), jeśli wszystkie dane są dynamicznie przydzielane na stosie. Jest to jednak dość trudne, gdy istnieją dane statyczne, co często ma miejsce. Kompilator CDL2 jest w stanie oflagować możliwe naruszenia dzięki wymogowi, aby kierunek parametrów (wejście, wyjście, wejście-wyjście) oraz typ reguł (może zawieść: test , predykat ; nie może zawieść : funkcja , akcja ; może mieć efekt uboczny: predykat , akcja ; nie może mieć efektu ubocznego: test , funkcja ) musi być określony przez programistę.

Ponieważ ocena reguł opiera się na wywoływaniu coraz prostszych reguł, na dole powinny znajdować się jakieś prymitywne reguły, które wykonują rzeczywistą pracę. W tym miejscu CDL1 jest bardzo zaskakujący: nie ma tych prymitywów. Musisz sam podać te zasady. Jeśli potrzebujesz dodawania w swoim programie, musisz utworzyć regułę z dwoma parametrami wejściowymi i jednym parametrem wyjściowym, a wyjście jest ustawione jako suma dwóch danych wejściowych przez twój kod. Kompilator CDL używa twojego kodu jako ciągów (istnieją konwencje dotyczące odwoływania się do zmiennych wejściowych i wyjściowych) i po prostu emituje go w razie potrzeby. Jeśli opisujesz swoją regułę dodawania za pomocą asemblera, będziesz potrzebował asemblera do przetłumaczenia danych wyjściowych kompilatora CDL na kod maszynowy. Jeśli opisujesz wszystkie prymitywne reguły (makra w terminologii CDL) w Pascalu lub C, to potrzebujesz kompilatora Pascala lub C, aby działał po kompilatorze CDL. Ten brak podstawowych prymitywów może być bardzo bolesny, gdy trzeba napisać fragment kodu, nawet dla najprostszej operacji instrukcji maszynowej. Jednak z drugiej strony daje dużą elastyczność w implementowaniu ezoterycznych, abstrakcyjnych prymitywów działających na egzotycznych abstrakcyjnych obiektach („słowo maszynowe” w CDL bardziej przypomina „jednostkę przechowywania danych, bez odniesienia do rodzaju przechowywanych tam danych ). Dodatkowo duże projekty wykorzystywały starannie przygotowane biblioteki prymitywów. Zostały one następnie zreplikowane dla każdej architektury docelowej i systemu operacyjnego, umożliwiając tworzenie wysoce wydajnego kodu dla wszystkich.

Aby poczuć język, oto mały fragment kodu zaadaptowany z podręcznika CDL2:

AKCJA quicksort + >from + >to -p -q: mniej+od+do, split+from+to+p+q, quicksort+from+q, quicksort+p+to; +. AKCJA split + >i + >j + p> + q> -m: make+p+i, make+q+j, add+i+j+m, half+m, (ponownie: przesuń w górę+j+p +m, przesuń w dół+i+q+m, (mniej+p+q, zamień przedmiot+p+q, incr+p, decr+q, *ponownie; mniej+p+m, zamień przedmiot+p+m, incr+p; mniej+m+q, zamiana przedmiotu+q+m, decr+q; +)). FUNKCJA przesuń w górę + >j + >p> + >m: mniej+j+p; mniejszy przedmiot+m+p; incr+p, *. FUNKCJA ruch w dół + >i + >q> + >m: mniej+q+j; mniejszy przedmiot+q+m; decr+q, *. TEST mniej+>a+>b:=a"<"b. FUNKCJA make+a>+>b:=a"="b. FUNKCJA add+>a+>b+sum>:=sum"="a"+"b. FUNKCJA połowa+>a>:=a"/=2". FUNKCJA incr+>a>:=a"++". FUNKCJA decr+>a>:=a"--". TEST mniejszy element+>i+>j:="items["i"] i+>jt:=t"=elementy["i"];elementy["i"]=elementy["j"];elementy["j"]="t.

Operacje pierwotne są tutaj zdefiniowane w kategoriach języka Java (lub C). To nie jest kompletny program; musimy zdefiniować elementy tablicy Java gdzie indziej.

CDL2, który pojawił się w 1976 roku, zachował zasady CDL1, ale uczynił język odpowiednim dla dużych projektów. Wprowadził moduły, wymusił zmianę danych tylko w przypadku sukcesu i nieco rozszerzył możliwości języka. Optymalizatory w kompilatorze CDL2, a zwłaszcza w CDL2 Laboratory (IDE dla CDL2) były światowej klasy i nie tylko w swoim czasie. Jedna cecha optymalizatora laboratoryjnego CDL2 jest prawie wyjątkowa: może przeprowadzać optymalizacje w jednostkach kompilacji, tj. traktować cały program jako pojedynczą kompilację.

CDL3 jest nowszym językiem. Zrezygnował z otwartej funkcji poprzednich wersji CDL i zapewnia prymitywy podstawowego dostępu do arytmetyki i pamięci. Wyjątkowo purytańska składnia wcześniejszych wersji CDL (liczba słów kluczowych i symboli zapisanych w pojedynczych cyfrach) również została złagodzona. Niektóre podstawowe pojęcia są teraz wyrażane w składni, a nie jawnej semantyce. Ponadto do języka wprowadzono typy danych.

Używać

Komercyjny mbp Cobol (kompilator języka Cobol na PC), jak również system MProlog (przemysłowa implementacja Prologu działająca na wielu architekturach (IBM mainframe, VAX, PDP-11, Intel 8086 itd.) oraz systemy operacyjne (DOS/OS/CMS/BS2000, VMS/Unix, DOS/Windows/OS2)). W szczególności to ostatnie świadczy o przenośności CDL2.

Chociaż większość programów napisanych w CDL to kompilatory, istnieje co najmniej jedna komercyjna aplikacja GUI, która została opracowana i utrzymywana w CDL. Ta aplikacja była aplikacją do akwizycji obrazów dentystycznych, obecnie należącą do DEXIS. System zarządzania gabinetem dentystycznym był kiedyś rozwijany również w CDL.

Oprogramowanie komputera szachowego Mephisto III zostało napisane w CDL2.

Dalsza lektura