Dynamische Programmiersprache

Im Informatik, a Dynamische Programmiersprache ist eine Klasse von hochrangige Programmiersprachen, was bei Laufzeit Führen Sie viele gemeinsame Programmierverhalten aus, die Statische Programmiersprachen während während der Durchführung Zusammenstellung. Diese Verhaltensweisen könnten eine Erweiterung des Programms beinhalten, indem neu hinzugefügt wird Codedurch Ausdehnung Objekte und Definitionen oder durch Ändern der Typ System. Obwohl ähnliche Verhaltensweisen in nahezu jeder Sprache mit unterschiedlichem Grad an Schwierigkeits-, Komplexitäts- und Leistungskosten nachgeahmt werden können, bieten dynamische Sprachen direkte Instrumente, um sie zu verwenden. Viele dieser Funktionen wurden zuerst als native Merkmale in der implementiert Lispeln Programmiersprache.

Die meisten dynamischen Sprachen sind auch dynamisch getippt, aber nicht alle sind. Dynamische Sprachen werden häufig (aber nicht immer) als als bezeichnet Skriptsprachen, obwohl dieser Begriff im engsten Sinne auf Sprachen bezieht, die für eine bestimmte Laufzeitumgebung spezifisch sind.

Implementierung

Bewerten

Einige dynamische Sprachen bieten eine bewerten Funktion. Diese Funktion nimmt eine Zeichenfolge oder Zusammenfassung Syntaxbaum enthalten Code in der Sprache und führt ihn aus. Wenn dieser Code für einen Ausdruck steht, wird der resultierende Wert zurückgegeben. Erik Meijer und Peter Drayton unterscheiden die Laufzeitcodegenerierung angeboten von eval aus dem dynamische Belastung angeboten von gemeinsame Bibliothekenund warnen, dass in vielen Fällen eval lediglich zur Implementierung verwendet wird Funktionen höherer Ordnung (durch Übergabe von Funktionen als Saiten) oder Deserialisierung.[1]

Objektlaufzeitänderung

Ein Typ- oder Objektsystem kann normalerweise während der Laufzeit in einer dynamischen Sprache geändert werden. Dies kann bedeuten, neue Objekte aus einer Laufzeitdefinition zu generieren oder basierend auf Mischungen von vorhandenen Typen oder Objekten. Dies kann auch auf das Ändern der ändern Nachlass oder Typbaum und so die Art und Weise, wie sich vorhandene Typen verhalten (insbesondere in Bezug auf die Aufruf von Methoden).

Geben Sie Inferenz ein

Da viele dynamische Sprachen mit einem dynamischen Typensystem ausgestattet sind, markiert die Laufzeit -Inferenz von Typen, die auf Werten für interne Interpretation basieren, eine gemeinsame Aufgabe. Da sich die Werttypen während der Interpretation ändern können, wird es regelmäßig bei Atomoperationen verwendet.

Variable Speicherzuweisung

Bei statischen Programmiersprachen (möglicherweise indirekt) müssen Entwickler die Größe des verwendeten Speichers vor der Kompilierung definieren (es sei denn, sie arbeiten mit Zeigerlogik). In Übereinstimmung mit der Änderung von Objektrennzeiten müssen dynamische Sprachen implizit (neu) Speicher basierend auf individuellen Vorgängen zuweisen.

Betrachtung

Betrachtung ist in vielen dynamischen Sprachen üblich und betrifft normalerweise Analyse der Arten und Metadaten von Generika oder polymorph Daten. Es kann jedoch auch die vollständige Bewertung und Änderung des Code eines Programms als Daten enthalten, z. B. die Funktionen, die LISP bei der Analyse liefert S-Expressionen.

Makros

Eine begrenzte Anzahl dynamischer Programmiersprachen bietet Funktionen, die sich kombinieren lassen Code -Selbstbeobachtung (Die Fähigkeit, Klassen, Funktionen und Schlüsselwörter zu untersuchen, um zu wissen, was sie sind, was sie tun und was sie wissen) und in einer Funktion namens bewerten Makros. Die meisten Programmierer heute, die sich des Begriffs bewusst sind Makro sie begegnet sind in C oder C ++, wo sie ein statisches Merkmal sind, das in einer kleinen Untergruppe der Sprache aufgebaut ist und nur von String -Substitutionen im Text des Programms in der Lage ist. In dynamischen Sprachen bieten sie jedoch Zugriff auf die Innenarbeit des Compilers. und Voller Zugriff auf den Interpreter, die virtuelle Maschine oder die Laufzeit, die die Definition von sprachähnlichen Konstrukten ermöglicht, die den Code optimieren oder die Syntax oder Grammatik der Sprache ändern können.

Montage, C, C ++, frühzeitig Java, und Forran Passen Sie im Allgemeinen nicht in diese Kategorie ein.[Klarstellung erforderlich]

Beispielcode

Die folgenden Beispiele zeigen dynamische Funktionen mithilfe der Sprache Common Lisp und sein Gemeinsames Lisp -Objektsystem (Clos).

Berechnung von Code zur Laufzeit und verspäteter Bindung

Das Beispiel zeigt, wie eine Funktion zur Laufzeit aus dem Computerquellcode geändert werden kann

; Der Quellcode wird als Daten in einer Variablen gespeichert Cl-User > (Defparameter *Best-Guess-Formula* '(Lambda (x) (* x x 2.5))) *Best-Guess-Formula* ; Eine Funktion wird aus dem Code erstellt und zur Laufzeit kompiliert. Die Funktion ist unter dem Namen Best-Guess verfügbar Cl-User >  (kompilieren 'beste Annahme *Best-Guess-Formula*) # 15 40600152f4> ; Die Funktion kann aufgerufen werden Cl-User > (beste Annahme 10.3) 265.225 ; Der Quellcode kann zur Laufzeit verbessert werden Cl-User > (setf *Best-Guess-Formula* `(Lambda (x) ,(aufführen 'sqrt (dritte *Best-Guess-Formula*)))) (Lambda (X) (Sqrt (* X X 2.5))) ; Eine neue Version der Funktion wird zusammengestellt Cl-User > (kompilieren 'beste Annahme *Best-Guess-Formula*) # 16 406000085c> ; Der nächste Anruf wird die neue Funktion aufrufen, eine Funktion der späten Bindung Cl-User > (beste Annahme 10.3) 16.28573 

Objektlaufzeitänderung

Dieses Beispiel zeigt, wie eine vorhandene Instanz geändert werden kann, um einen neuen Steckplatz beizuschließen, wenn sich ihre Klasse ändert, und dass eine vorhandene Methode durch eine neue Version ersetzt werden kann.

; eine Personklasse. Die Person hat einen Namen. Cl-User > (Defklasse Person () ((Name : initarg :Name))) # PERSON 4020081fb3> ; Eine benutzerdefinierte Druckmethode für die Objekte der Klassenperson Cl-User > (Defmethod Druck-Objekt ((p Person) Strom)  (druckfreies Objekt (p Strom :Typ t)  (Format Strom "~ a" (Slot-Wert p 'Name)))) # Druck-Objekt NULL (PERSON T) 4020066e5b> ; Eine Beispielpersoninstanz Cl-User > (setf *Person-1* (maßgeschneidert 'Person :Name "Eva Luator")) # Eva Luator> ; Die Klassenperson erhält einen zweiten Slot. Es hat dann den Namen und das Alter von Slots. Cl-User > (Defklasse Person () ((Name : initarg :Name) (das Alter : initarg :das Alter : initform :Unbekannt))) # PERSON 4220333e23> ; Aktualisieren der Methode zum Drucken des Objekts Cl-User > (Defmethod Druck-Objekt ((p Person) Strom)  (druckfreies Objekt (p Strom :Typ t)  (Format Strom "~ ein Alter: ~" (Slot-Wert p 'Name) (Slot-Wert p 'das Alter)))) # Druck-Objekt NULL (PERSON T) 402022ADE3> ; Das vorhandene Objekt hat sich jetzt geändert, es hat einen zusätzlichen Slot und eine neue Druckmethode Cl-User > *Person-1* # Eva Luator das Alter: Unbekannt> ; Wir können den neuen Zeitalter der Instanz festlegen Cl-User > (setf (Slot-Wert *Person-1* 'das Alter) 25) 25 ; Das Objekt wurde aktualisiert Cl-User > *Person-1* # Eva Luator das Alter: 25> 

Zusammenstellung von Code zur Laufzeit basierend auf der Klasse der Instanzen

Im nächsten Beispiel die Klasse Person bekommt eine neue Superklasse. Das drucken Die Methode wird so definiert, dass sie mehrere Methoden in die effektive Methode zusammenfasst. Die effektive Methode wird basierend auf der Klasse des Arguments und den verfügbaren Laufzeiten und anwendbaren Methoden zusammengestellt.

; die Klassenperson Cl-User > (Defklasse Person () ((Name : initarg :Name))) # PERSON 4220333e23> ; Eine Person druckt nur ihren Namen Cl-User > (Defmethod Druck-Objekt ((p Person) Strom)  (druckfreies Objekt (p Strom :Typ t)  (Format Strom "~ a" (Slot-Wert p 'Name)))) # Druck-Objekt NULL (PERSON T) 40200605ab> ; eine Personinstanz Cl-User > (Defparameter *Person-1* (maßgeschneidert 'Person :Name "Eva Luator")) *Person-1* ; Anzeige einer Personinstanz Cl-User > *Person-1* # Eva Luator> ; Jetzt definieren Sie die Druckmethode, um erweiterbar zu sein ; Die Umgebung erstellt den Kontext für die Druckmethode und ruft die nächste Methode auf Cl-User > (Defmethod Druck-Objekt :um ((p Person) Strom)  (druckfreies Objekt (p Strom :Typ t)  (Call-Next-Method))) # Druck-Objekt (:UM) (PERSON T) 4020263743> ; Die primäre Methode druckt den Namen Cl-User > (Defmethod Druck-Objekt ((p Person) Strom)  (Format Strom "~ a" (Slot-Wert p 'Name))) # Druck-Objekt NULL (PERSON T) 40202646bb> ; Eine neue Klassen-ID-Mixin bietet eine ID Cl-User > (Defklasse id-mixin () ((Ich würde : initarg :Ich würde))) # Id-mixin 422034a7ab> ; Die Druckmethode druckt nur den Wert des ID -Steckplatzes Cl-User > (Defmethod Druck-Objekt :nach ((Objekt id-mixin) Strom)  (Format Strom "Id: ~ a" (Slot-Wert Objekt 'Ich würde))) # Druck-Objekt (:NACH) (Id-mixin T) 4020278e33> ; Jetzt definieren wir die Klassenperson neu, um das Mixin-ID-Mixin einzuschließen Cl-User 241 > (Defklasse Person (id-mixin) ((Name : initarg :Name))) # PERSON 4220333e23> ; Die vorhandene Instanz * Person-1 * hat jetzt einen neuen Slot und wir setzen ihn auf 42 Cl-User 242 > (setf (Slot-Wert *Person-1* 'Ich würde) 42) 42 ; erneut das Objekt anzeigen. Die Print-Object-Funktion verfügt nun über eine effektive Methode, die drei Methoden aufruft: eine Umrandungsmethode, die primäre Methode und die After-Methode. Cl-User 243 > *Person-1* # Eva Luator ICH WÜRDE: 42> 

Beispiele

Zu den beliebten dynamischen Programmiersprachen gehören JavaScript, Python, Rubin, Php, Lua und Perl. Das Folgende werden im Allgemeinen als dynamische Sprachen angesehen:

Siehe auch

Verweise

  1. ^ Meijer, Erik und Peter Drayton (2005), Statische Typisierung, wo möglich, bei Bedarf dynamische Tippen: das Ende des Kalten Krieges zwischen den Programmiersprachen (PDF), Microsoft Konzern, Citeseerx 10.1.1.69.5966
  2. ^ Kapitel 24. Dynamische Sprachunterstützung. Static.springSource.org. Abgerufen am 2013-07-17.
  3. ^ < "Archivierte Kopie". Archiviert von das Original Am 2014-03-02. Abgerufen 2014-03-02.{{}}: CS1 Wartung: Archiviertes Kopie als Titel (Link)

Weitere Lektüre

Externe Links

(Viele verwenden den Begriff "Skriptsprachen".)