Dylan (Programmiersprache)

Dylan ist eine Mehrparadigma-Programmiersprache, die Unterstützung für die funktionelle und objektorientierte Programmierung einschließt, und dynamisch und reflektierend ist, während die Versorgung eines Programmiermodells vorgehabt hat, effiziente Maschinencodegeneration einschließlich der feinkörnigen Kontrolle über dynamische und statische Handlungsweisen zu unterstützen. Es wurde am Anfang der 1990er Jahre von einer durch den Apple Computer geführten Gruppe geschaffen.

Dylan ist auf Schema und Allgemeines Lispeln zurückzuführen und fügt hinzu, dass ein einheitliches Gegenstand-System auf Common Lisp Object System (CLOS) zurückzuführen gewesen ist. In Dylan sind alle Werte (einschließlich Zahlen, Charaktere, Funktionen und Klassen) erstklassige Gegenstände. Dylan unterstützt Mehrfachvererbung, polymorphism, vielfache Absendung, Schlüsselwort-Argumente, Gegenstand-Selbstbeobachtung, Muster-basierte Syntax-Erweiterungsmakros und viele andere fortgeschrittene Eigenschaften. Programme können feinkörnige Kontrolle über den Dynamismus ausdrücken, Programme zulassend, die ein Kontinuum zwischen dynamischer und statischer Programmierung und Unterstützen der Entwicklungsentwicklung besetzen (schnellen prototyping berücksichtigend, der von der zusätzlichen Verbesserung und Optimierung gefolgt ist).

Die Hauptdesignabsicht von Dylan ist, eine dynamische Sprache zu sein, die gut passend ist, um kommerzielle Software zu entwickeln. Dylan versucht, potenzielle Leistungsprobleme zu richten, indem er "natürliche" Grenzen zur vollen Flexibilität von Lispeln-Systemen einführt, dem Bearbeiter erlaubend, klar compilable Einheiten (d. h., Bibliotheken) zu verstehen.

Obwohl das Abstammen von viel von seiner Semantik aus dem Schema und anderem Lispelt — wurden einige Durchführungen tatsächlich innerhalb von vorhandenen Lispeln-Systemen am Anfang gebaut — Dylan hat eine EINEM ALGOL ähnliche Syntax aber nicht eine einem Schema ähnliche Präfix-Syntax.

Geschichte

Dylan wurde am Anfang der 1990er Jahre von einer durch den Apple Computer geführten Gruppe geschaffen. Einmal in seiner Entwicklung war es für den Gebrauch mit dem Computer von Newton des Apfels beabsichtigt, aber die Durchführung von Dylan hat genügend Reife rechtzeitig nicht erreicht, und Newton hat stattdessen eine Kombination von C und von Walter Smith entwickeltem NewtonScript verwendet. Apfel hat ihren Entwicklungsaufwand von Dylan 1995 beendet, obwohl sie eine "" Ausgabe-Technologieversion verfügbar ("Apple Dylan TR1") gemacht haben, der einen fortgeschrittenen IDE eingeschlossen hat.

Zwei andere Gruppen haben zum Design der Sprache beigetragen und haben Durchführungen entwickelt: Harlekin hat einen kommerziellen IDE für Windows von Microsoft veröffentlicht, und Universität von Carnegie Mellon hat einen offenen Quellbearbeiter für Systeme von Unix veröffentlicht. Beide dieser Durchführungen sind jetzt offene Quelle und aufrechterhalten von einer Gruppe von Freiwilligen, Gwydion Maintainers.

Die Sprache von Dylan wurde Ralph codegenannt. James Joaquin hat den Namen Dylan für die "Dynamische Sprache gewählt."

Syntax

Am Anfang hat Dylan eine einem Schema ähnliche Präfix-Syntax verwendet, die auf S-Ausdrücken basiert:

(binden Sie ((Radius 5)

(Kreisumfang (* der Radius von 2 $pi)))

(wenn (> Kreisumfang 42)

(formatieren Sie "Hallo großen Kreis! c ist % =" Kreisumfang)

(formatieren Sie "Hallo Kreis! c ist % =" Kreisumfang)))

</Code>

Als das Sprachdesign vollendet wurde, wurde es zu einer einem ALGOL ähnlichen Syntax geändert, die von Michael Kahl mit der Erwartung entworfen ist, dass es für ein breiteres Publikum von Programmierern vertrauter sein würde:

lassen Sie Radius = 5;

lassen Sie Kreisumfang = 2 * $pi * Radius;

wenn (Kreisumfang> 42)

Format ("Hallo, großer Kreis! c ist % =", Kreisumfang);

sonst

Format ("Hallo, Kreis! c ist % =", Kreisumfang);

enden Sie wenn

</Code>

Ähnlich anderen funktionellen Programmiersprachen ist das Ergebnis einer Funktion der Wert des letzten bewerteten Ausdrucks — es gibt keine ausführliche "Rück"-Behauptung. Die folgende Funktion gibt den Wert zurück, "wenn" Behauptung (erzeugen Behauptungen auch Ergebnisse), der zum Wert entweder von "1" oder von "n * factorial (n - 1)" bewertet:

definieren Sie Methode factorial (n::

wenn (n = 0)

1

sonst

n * factorial (n - 1)

Ende

Endmethode;

</Code>

Module gegen namespace

Auf vielen objektorientierten Sprachen sind Klassen die primären Mittel von encapsulation und modularization; jede Klasse definiert einen namespace und kontrolliert, wie und welche Definitionen äußerlich sichtbar sind. Außerdem definieren Klassen auf vielen Sprachen eine unteilbare Einheit, die als Ganzes verwendet werden muss — wenn Sie eine Schnur-Verkettungsfunktion verwenden wollen, müssen Sie importieren und gegen die ganze Schnur kompilieren.

Einige Sprachen schließen auch einen getrennten, ausführlichen namespace oder Modul-System ein, das encapsulation auf eine allgemeinere Weise durchführt. Dylan ist solch eine Sprache.

In Dylan werden die Konzepte der Kompilieren-Einheit und Importeinheit getrennt, und Klassen haben nichts spezifisch, um mit auch zu tun. Eine Bibliothek definiert Sachen, die kompiliert und zusammen behandelt werden sollten, während ein Modul den namespace definiert. Klassen können zusammen in Modulen gelegt, oder über sie geschnitten werden, wie der Programmierer wünscht. Häufig besteht die ganze Definition für eine Klasse in einem einzelnen Modul nicht, aber wird über mehrere ausgebreitet, die zusammen fakultativ gesammelt werden. Verschiedene Programme können verschiedene Definitionen derselben Klasse, einschließlich nur haben, was sie brauchen.

Denken Sie zum Beispiel eine Erweiterungsbibliothek für die Regex-Unterstützung auf der Schnur. Auf einigen Sprachen, in der Größenordnung von der in Schnuren einzuschließenden Funktionalität, muss die Funktionalität zur Schnur namespace selbst hinzugefügt werden. Sobald Sie das tun, wird die Schnur-Klasse größer, und Leute, die regex noch nicht zu verwenden brauchen, müssen dafür in der vergrößerten Bibliotheksgröße "zahlen". Aus diesem Grund werden diese Sorten von Erweiterungen normalerweise in ihren eigenen namespaces und Gegenstände gelegt. Die Kehrseite zu dieser Annäherung ist, dass die neue Funktionalität nicht mehr ein Teil der Schnur ist; statt dessen wird es in seinem eigenen Satz von Funktionen isoliert, die getrennt genannt werden müssen. Statt, der die natürliche Organisation aus einem OO Gesichtspunkt sein würde, verwenden Sie etwas wie, der effektiv die Einrichtung umkehrt.

Außerdem unter Dylan können viele Schnittstellen für denselben Code definiert werden, zum Beispiel konnte die Schnur-Verkettungsmethode sowohl in die Schnur-Schnittstelle als auch in die "Concat"-Schnittstelle gelegt werden, die zusammen alle verschiedenen Verkettungsfunktionen von verschiedenen Klassen sammelt. Das wird in Mathebibliotheken allgemeiner verwendet, wo Funktionen dazu neigen, auf sich weit unterscheidende Objektarten anwendbar zu sein.

Ein praktischerer Gebrauch der Schnittstelle-Konstruktion soll öffentliche und private Versionen eines Moduls, etwas bauen, was andere Sprachen als ein "Bolzen auf der" Eigenschaft einschließen, die unveränderlich Probleme verursacht und Syntax hinzufügt. Unter Dylan kann der Programmierer einfach jede Funktion legen rufen die "Private" Schnittstelle oder "Entwicklungs"-Schnittstelle herbei, und sammeln öffentlich zugängliche Funktionen im "Publikum". Unter Java oder C ++ wird die Sichtbarkeit eines Gegenstands im Code selbst definiert, bedeutend, dass, um eine ähnliche Änderung zu unterstützen, der Programmierer gezwungen würde, die Definitionen völlig umzuschreiben, und zwei Versionen zur gleichen Zeit nicht haben konnte.

Klassen

Klassen in Dylan beschreiben "Ablagefächer" (Datenmitglieder, Felder, ivars, usw.) von Gegenständen nach einer den meisten OO Sprachen ähnlichen Mode. Der ganze Zugang zu Ablagefächern ist über Methoden, als in CLOS und Plausch. Verzug-Hauer und Setter-Methoden werden gestützt auf den Ablagefach-Namen automatisch erzeugt. Im Vergleich mit den meisten anderen OO Sprachen werden andere auf die Klasse anwendbare Methoden häufig außerhalb der Klasse definiert, und so schließen Klassendefinitionen in Dylan normalerweise die Definition der Lagerung nur ein. Zum Beispiel:

definieren Sie Klasse

Ablagefach-Titel::

Ablagefach-Position::

Endklasse;

</Code>

In diesem Beispiel wird die Klasse "" definiert. &lt;class name&gt; Syntax ist Tagung nur, um die Klassennamen hervortreten zu lassen — die Winkelklammern sind bloß ein Teil des Klassennamens. Im Vergleich auf einigen Sprachen ist die Tagung, den ersten Brief des Klassennamens oder zum Präfix der Name mit einem "C" oder "T" (zum Beispiel) zu kapitalisieren. erbt von einer einzelnen Klasse, und enthält zwei Ablagefächer, eine Schnur für den Fenstertitel haltend, und einen X-Y-Punkt für eine Ecke des Fensters haltend. In diesem besonderen Beispiel ist der Titel ein Verzug-Wert gegeben worden, während die Position nicht hat. Die fakultative "Init-Schlüsselwort"-Syntax erlaubt dem Programmierer, den Anfangswert des Ablagefaches anzugeben, wenn sie einen Gegenstand der Klasse realisiert.

Auf Sprachen wie C ++ oder Java würde die Klasse auch seine Schnittstelle definieren. In diesem Fall hat die Definition oben keine ausführlichen Instruktionen, so sowohl im Sprachzugang zu den Ablagefächern als auch in den Methoden wird betrachtet, bedeutend, dass sie nur durch Unterklassen verwendet werden können. Um Code ohne Beziehung zu erlauben, die Fensterbeispiele zu verwenden, würden sie erklärt werden müssen.

In Dylan werden diese Sorten von Sichtbarkeitsregeln als ein Teil des Codes selbst, aber vom System des Moduls/Schnittstelle nicht betrachtet. Das fügt beträchtliche Flexibilität hinzu. Zum Beispiel konnte eine während der frühen Entwicklung verwendete Schnittstelle alles Öffentliches erklären, wohingegen ein verwendeter in der Prüfung und Aufstellung das beschränken konnte. Mit C ++ oder Java würden diese Änderungen Änderungen zum Quellcode selbst verlangen, so werden Leute es nicht tun, wohingegen in Dylan das ein Konzept völlig ohne Beziehung ist.

Obwohl dieses Beispiel es nicht verwendet, unterstützt Dylan auch Mehrfachvererbung.

Methoden und allgemeine Funktionen

In Dylan werden Methoden mit keiner besonderen Klasse wirklich vereinigt; von Methoden kann als vorhanden außerhalb Klassen gedacht werden. Wie CLOS basiert Dylan auf Mehrmethoden, wo die spezifische Methode, genannt zu werden, gestützt auf den Typen aller seiner Argumente gewählt wird. Die Methode muss während der Übersetzung, das Verstehen nicht bekannt sein, das ist, dass die erforderliche Funktionalität verfügbar sein kann oder nicht, gestützt auf den Einstellungen des Benutzers kann.

Unter Java würden dieselben Methoden in einer besonderen Klasse isoliert. Um diese Funktionalität zu verwenden, wird der Programmierer gezwungen, diese Klasse zu importieren und sich darauf ausführlich zu beziehen, um die Methode zu nennen. Wenn diese Klasse nicht verfügbar, oder während der Übersetzung unbekannt ist, wird die Anwendung einfach nicht kompilieren.

In Dylan wird Code von der Lagerung in Funktionen isoliert. Viele Klassen haben Methoden, die ihre eigenen Funktionen nennen, dadurch schauend und zu den meisten anderen OO Sprachen aufgelegt seiend. Jedoch kann Code auch in allgemeinen Funktionen gelegen werden, bedeutend, dass sie einer besonderen Klasse nicht beigefügt werden, und heimisch von jedem genannt werden können. Die Verbindung einer besonderen allgemeinen Funktion zu einer Methode in einer Klasse wird dieser Weg vollbracht:

definieren Sie umdrehung-blaue Methode (w::

w.color: = $blue;

Endmethode;

</Code>

Diese Definition ist denjenigen auf anderen Sprachen ähnlich, und würde wahrscheinlich innerhalb der Klasse kurz zusammengefasst. Bemerken Sie: = Setter-Anruf, der syntaktischer Zucker dafür ist.

Das Dienstprogramm von allgemeinen Methoden tritt in sein eigenes ein, wenn Sie mehr "allgemeine" Beispiele denken. Zum Beispiel ist eine allgemeine Funktion auf den meisten Sprachen, der eine menschlich-lesbare Form für den Gegenstand zurückgibt. Zum Beispiel könnte ein Fenster seinen Titel und seine Position in parens zurückgeben, während eine Schnur sich zurückgeben würde. In Dylan konnten diese Methoden alle in ein einzelnes genanntes Modul"", gesammelt werden, dadurch diesen Code von der Definition der Klasse selbst entfernend. Wenn ein besonderer Gegenstand a nicht unterstützt hat, konnte er im Modul leicht hinzugefügt werden.

Dehnbarkeit

Dieses ganze Konzept könnte einige Leser als sehr seltsam schlagen. Der Code, um für ein Fenster zu behandeln, wird darin nicht definiert? Das könnte keinen Sinn haben, bis Sie denken, wie Dylan den Anruf behandelt. Auf den meisten Sprachen, wenn das Programm dafür kompiliert wird, wird nachgeschlagen und durch einen Zeigestock (mehr oder weniger) zur Methode ersetzt. In Dylan kommt das vor, wenn das Programm zuerst geführt wird; die Durchlaufzeit baut einen Tisch von method-name/parameters Details und schlägt Methoden dynamisch über diesen Tisch nach. Das bedeutet, dass eine Funktion für eine besondere Methode überall nicht nur in der Übersetzungszeit-Einheit gelegen werden kann. Schließlich wird dem Programmierer beträchtliche Flexibilität in Bezug darauf gegeben, wohin man ihren Code legt, sie entlang Klassenlinien, wo passend und funktionellen Linien sammelnd, wo es nicht ist.

Die Implikation hier ist, dass ein Programmierer Funktionalität zu vorhandenen Klassen hinzufügen kann, indem er Funktionen in einer getrennten Datei definiert. Zum Beispiel könnten Sie hinzufügen wollen zum ganzen s Rechtschreibung zu prüfen, der auf den meisten Sprachen Zugang zum Quellcode der Schnur-Klasse verlangen würde - und solche grundlegenden Klassen in der Quellform selten ausgegeben werden. In Dylan (und andere "ausziehbare Sprachen") konnte die Rechtschreibung prüfende Methode im Modul hinzugefügt werden, alle Klassen definierend, an die es über die Konstruktion angewandt werden kann. In diesem Fall könnte die wirkliche Funktionalität in einer einzelnen allgemeinen Funktion definiert werden, die eine Schnur nimmt und die Fehler zurückgibt. Wenn das Modul in Ihr Programm kompiliert wird, werden alle Schnuren (und andere Gegenstände) die zusätzliche Funktionalität bekommen.

Das könnte noch alles nicht erklingen lassen, was offensichtlich, aber tatsächlich es ein durch fast alle OO Sprachen gesehenes häufiges Problem ist; nicht alles baut eine Klassenkonstruktion ein, viele Probleme gelten für alle Gegenstände im System, und es gibt keine natürliche Weise, das zu behandeln.

Apple Dylan

Apple Dylan ist die Durchführung von durch den Apple Computer erzeugtem Dylan. Es wurde für das Produkt des Apple Newton ursprünglich entwickelt.

Siehe auch

  • Server-Seiten von Dylan
  • Beutelbär (Webserver)

Links


Djbdns / Dubliner Kern
Impressum & Datenschutz