A Dylan programozási nyelv

Miért Dylan?



Dinamikus vagy statikus nyelvek

A statikus nyelveknek ismerniük kell minden változó típusát fordítási időben (példa: C, Pascal, Eiffel). A forráskód fordítása hatékony, fordítási idei erős típusellenőrzés jelentősen csökkenti a hibalehetőségeket. A dinamikus nyelvek lehetőséget adnak a programozó számára, hogy olyan változókat deklaráljon, amelyek típusáról nem ad meg információkat (például: LISP, Perl, SmallTalk).
Ez egyszerűsíti a prototípus készítését és a megoldását bizonyos fajta objektum-orientált kódoknál. A Dylan jó egyensúlyt biztosít a statikus és a dinamikus nyelvek előnyei között. A programozó választhat a típus deklaráció megadása és elhagyása között. Megadott egyértelmű típusokat képes hatékonyan fordítani, és a típushibákat fordítási időben észrevenni. A deklaráció típusának elhagyásával, pedig a dinamikus nyelvek rugalmasságát éri el.

Funkcionális nyelvek

Funkcionális nyelveknél az egész program egy nagy függvény kiértékelését jelenti. Kifejezések, utasítások, és az eseményvezérelt struktúráknak van visszatérési értékük, amelyeket mint argumentumokat máshol felhasználhatnak.
A Dylan egy funkcionális nyelv, megengedi függvények írását:

define method shoe-size(person :: )   if (person = "Larry") 14; else 11; end if; end method;

A shoe-size függvénynek egy argumentuma van, egy string, és a visszatérési típusa nem definiált. (Ha ez a függvény nincs externálisan linkelve, akkor a fordítóprogram egyszerűen kikövetkezteti a visszatérési típust.) Ha a persons értéke ”Larry”, akkor a végrehajtás eredménye 14 különben 11. Mivel nem követi több utasítás az elágazást, annak visszatérési értéke lesz a függvény visszatérési értéke.
A következő függvény jobban imperatív stílusú:

define method shoe-size(person :: string)   let the-size = 11;   if (person = "Joe") the-size := 14;   end if;   the-size; end method;

Algebrai infix szintaxis

A LISP-en alapuló nyelvek teljes zárójelezésű prefix szintaxist használnak. Ez számtalan egymásba ágyazott zárójelet jelent, mint a shoe-size alábbi verziójában:

(define (shoe-size person)   (if (equal? person "Joe") 14 11))

Ez bizonyos szinten elegáns, de kell némi idő a megértéséhez.

Objektum orientáltság

Sok objektum orientált nyelvtől eltérően, a Dylan minden adatot objektumként kezel. Egész számok és szövegek is objektumok csakúgy, mint a függvények és az osztályok is.
A Dylan eléggé hatékonyra lett megtervezve. Fordítás idejű analízis és az explicit típusdeklaráció lehetőséget biztosít a fordítónak az optimalizálásra. Nyelvi elemek megengedik a programozónak, hogy egy osztályt zároljunk, ezáltal megakadályozva a későbbi alosztályok létrehozását.
A Dylan objektum modellje sok fontos tekintetben különbözik a C++ objektum modelljétől. Szabadon használhatunk többszörös öröklődést, anélkül, hogy az objektumok vágása, téves down-cast-olása vagy sok más C++-ban jellemző hiba miatt aggódnánk. A metódusok elkülönítettek az osztályok deklarációjától, ezáltal lehetővé téve, hogy a programozó új polimorfikus függvényeket írjon az osztályhoz, az érintett osztály szerkesztése nélkül.

Szemétgyűjtés

A szemétgyűjtős nyelvekben nincs szükség a free és a delete operátorokra, mert a nem használ heap memóriát egy automatikus nyelvi rutin szabadítja fel. Ez csökkenti a forráskód bonyolultságát, megszünteti a közös objektumok referenciának számlálásának kényszerét, elejét veszi hibás memóriafoglalásoknak és a memória elfolyásának.
Évekkel ezelőtt a szemétgyűjtő mechanizmus az alacsony hatékonyságról híresült el. Egy nagy, objektum orientált LISP program hatékonysága szörnyen alacsony volt egy kézzel írt, mikro-optimalizált assembly programhoz képest, és rengeteg buktató is megbújt benne. Szerencsére az idők változnak. A szemétgyűjtő technológiát tökéletesítették, hatékonyabb lett, és számos hibáját kijavították. A processzorok sebessége is ugrásszerűen megemelkedett, ami megengedi némileg a magasabb overhead-et.
A hagyományos sebességmérő módszerek szerinte a C++ hatékonyabb memóriakezelésre képes, mint a szemétgyűjtéssel rendelkező nyelvek. De az igazán nagy C++ rendszereknél más a helyzet. Kis kódrészleteknél – elég kicsinél ahhoz, hogy egy programozó optimalizálhassa a teljes memóriakezelést – valóban a C++ nyer a szemétgyűjtő ellen. Azonban a nagy rendszereknél a szemétgyűjtő mechanizmus már olyan előnyöket biztosít, amelyek miatt érdemes használni.

Miért nem Dylan?

A Dylan legnagyobb hátránya a kereskedelmi minőségű fordító hiánya, különösen Macintosh gépekre. Az Apple a jövőben nem kommentálja a technikai eredményeit, és a funkcionális Objektumok megcélozzák a Windows és a Linux piacokat az ő fordítójukkal. A Gwydion Project Dylan  implementációja támogatni fogja a UNIX, Windows, Macintosh platformokat, mikor elkészül.