K09.1 DynamischeProgrammiersprachen thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/09-dyn&dsls&esot.pdf 03.Juni2016 2 DynamischeProgrammiersprachen n n DerBegriffDynamischenProgrammiersprache istnichtpräzisebzw. formaldefiniert. Typischerweise verstehtmandarunterSprachen... n ...beidenenzurLaufzeit Tätigkeitenausgeführtwerden,diebei„statischen Sprachen“* zurCompilezeit ausgeführtwerden,z.B.: n n n n n n DynamischeTypüberprüfung DynamischeBestimmungdesTypsanhandstrukturellerEigenschaften ModifikationvonProgrammenzurLaufzeit ...dieInterpretiertausgeführtwerden(Skriptsprachen) ...dieautomatischeSpeicherverwaltunganbieten Motivation: n n ProduktivitätbeiderProgrammierungerhöhenund/oder ErlernbarkeitderProgrammiersprachevereinfachen *AuchdieserBegriffistnichtpräzisedefiniert. thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/09-dyn&dsls&esot.pdf 03.Juni2016 3 DynamischeTypüberprüfung n Typüberprüfung erfolgtzurLaufzeit(imGegensatzzurstatischen TypprüfungzurCompilezeit). n n (i) Vertreter:Groovy,JavaScript,Lisp,Lua,Perl,PHP,Ruby,Python,... CharakteristischeEigenschaft: 1. Werte/ObjektehabenTyp n 2. Ergo:Typinformation musszusätzlichmitdemWert/Objektgeführt werden. VariablenhabenkeinenTyp n Ergo:VariablekannwährendihrerLebenszeitWertebeliebigen Typsannehmen. à EskönnenwenigerbisgarkeineGarantienzurTypkompatibilitätzur Laufzeitgegebenwerden. thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/09-dyn&dsls&esot.pdf 03.Juni2016 4 DynamischeTypüberprüfung n (ii) Nachteile: n Typüberprüfung zurLaufzeithatgewissenAufwand(Overhead). n Laufzeitfehler durchTypinkompatibilitäten. n n Auftretens- undUrsacheort imQuelltextu.U.weitvoneinanderentfernt ErhöhterTestaufwand;volleAbdeckungallermöglichen AusführungenaberoftnichtmitsinnvollemAufwandmachbar. thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/09-dyn&dsls&esot.pdf 03.Juni2016 5 DuckTyping n (i) Idee: EinObjektistkompatibelzueinemTypT wenneszur LaufzeitdieMethoden (undAttribute)vonT besitzt. n n Analog:zweiObjektesindtypkompatibelwennsiezurLaufzeit gleicheMethoden(undAttribute)besitzen. Ergo:ObjektmussimGrundegenommenüberhauptkeinen statischenTypbesitzen.DerTypwirddynamisch(zurLaufzeit) anhandseinerStruktur, nämlichdervorhandenenMethoden(und Attribute),bestimmt. NamegehtzurückaufeinGedichtvonJ.W.RILEY: „When Isee abird that walks like aduckand swims like aduck and quacks like aduck,Icall that bird aduck.“ thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/09-dyn&dsls&esot.pdf 03.Juni2016 6 DuckTyping (ii) Beispiel(Python): class Vogel: def __init__(self, name): self.name = name def __str__(self): return self.__class__.__name__ + ' ' + self.name class Ente(Vogel): def quak(self): print str(self)+': quak' class Frosch: def quak(self): print str(self)+': quak' tiere = [Vogel('Gustav'), Ente('Donald'), Frosch('Kermit')] for t in tiere: try: t.quak() except AttributeError: print 'Kann nicht quaken:', t Ausgabe: Kann nicht quaken: Vogel Gustav Ente Donald: quak Frosch Kermit: quak 03.Juni2016 thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/09-dyn&dsls&esot.pdf 7 DuckTyping – Gegenüberstellung(iii) n n DuckTyping istdynamischeFormdesStructural Typing.Beiletzterem wirdTypkompatibilitäti.Allg.statischzurCompilezeit bestimmt. DieTypsystemederbisherinderVorlesungbehandelten Sprachen(C++, Java,Haskell)sindnominativ: n Typkompatibilitätbzw.-äquivalenz bestimmtdurchexplizite Typdeklarationenund/oderTypnamen. // explizite Deklaration äquivalenter // Typen durch Typaliase in C++ // unterschiedliche Typen in C++ // mit identischer Struktur typedef unsigned char BYTE; struct Foo { int id; char name[80]; -- explizite Deklaration äquivalenter -- Typen durch Typsynonyme in Haskell type String = [Char]; }; struct Bar { int id; char name[80]; }; thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/09-dyn&dsls&esot.pdf 03.Juni2016 8 Mixins n n (i) Idee:EinMixin deklariertunddefiniert eineMengevonMethoden die man(zurLaufzeit)beliebigvielen Klassenhinzufügt– „beimischt“. Direktunterstütztu.a.in:Go,Ruby,Scala Beispiel(Ruby): # Mixin das Logging-Methoden bereitstellt # Verwendung module Logging class Foo def logInfo # Methode für Info-Ausgabe # Implementierung ... include Logging # ... end end def logErr # Methode für Fehler-Ausgabe class Bar # Implementierung ... end end include Logging # ... end thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/09-dyn&dsls&esot.pdf 03.Juni2016 9 Mixins n Konzeptinderobjektorientierten Programmierung: n n n KeineFormderSpezialisierung(Vererbung)sonderneinMittelum Funktionalität(dynamisch)einerKlassehinzuzufügen. Motivation:don‘t repeat yourself (dry) Vergleichbarmit: n Mehrfachvererbung:Klassekann(alle)Methodenübereinodermehrere Mixins erhalten. n n Unterschied:eliminiertProbleme desmehrfachenerbens vonMethoden (A sub B,C sub D;sieheauchDiamond-Problem bzw.virtuelle Mehrfachvererbung inC++) JavaInterface n n (ii) Unterschied: Methoden sindimplementiert. MancheSprachenermöglichen das„beimischen“vonMethodenin eineKlassezurLaufzeit,wobeiMixins selbstzurCompilezeit definiertsind.Diesentsprichteinem late binding. thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/09-dyn&dsls&esot.pdf 03.Juni2016 10 Metaprogrammierung– eval n MitLisp wurdeerstmaligdieMöglichkeiteingeführt,eininein ProgrammalsDateneingebettetesProgrammfragment p (welches inderselbenSprachegeschriebenist)auszuwerten unddas Ergebniszurückzuliefern (Ausdruck)bzw.auszuführen (Anweisung(en)). n n Auswertung/Ausführungvonp entwederzur: n Compilezeit: n Laufzeit: BenötigteineEvaluierungsfunktion:eval(p) n n n n StatischeMetaprogrammierung z.B.:C/C++MakrosundC++Templates DynamischeMetaprogrammierung p liegtinFormvonDatenfüreval vor. Auswertung zurLaufzeitmeistinterpretiert;kompilierte Auswertung benötigt Zugriff aufdenCompilerdurchdasausführbareProgramm. AuswertungzurLaufzeitverfügbaru.a.inLua,Perl,Python,Ruby. Syntaxbzgl.eval variiertzwischendenProgrammiersprachen; z.B. implizite KennzeichnungdurchPräfix# beiC/C++Makros. thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/09-dyn&dsls&esot.pdf 03.Juni2016 11 eval - Beispiele JavaScript: Perl: // Auswertung eines Ausdrucks x = 3; alert(eval('x + 3')); // Auswertung eines Ausdrucks $x = 3; print eval('$x + 3'), "\n"; // Ausführung von Anweisungen x = 3; eval('x += 3; alert(x);'); // Ausführung von Anweisungen $x = 3; eval('$x += 3; print "$x\n";'); Python(interaktiverModus>>>): >>> # Auswertung eines Ausdrucks >>> x = 3 >>> eval('x + 3') 6 >>> >>> >>> >>> 6 >>> 8 x = 3 y = 4 exec "x += 3; y += 4" x y thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/09-dyn&dsls&esot.pdf 03.Juni2016 12 eval undQuines n eval lässtsichverwendenumsogenannteQuines zu implementieren: n n Definition:EinQuine isteinProgrammdasskeineEingabenhatund beiAusführungexaktseineneigenenQuelltextausgibt. EineQuine istdamiteineSpezialformvonMetaprogrammen. Beispiel(Ruby): eval s=%q(puts"eval s=%q(#{s})") Ausprobierbar ohnedassmaneineRuby-Laufzeitumgebung Installierenmussauf http://codepad.org/ thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/09-dyn&dsls&esot.pdf 03.Juni2016 13 Metaprogrammierung– Dynamische Programmodifikation n EbenfallsmitLisp wurdeerstmaligdieMöglichkeiteingeführt dasseinProgrammsichselbstzurLaufzeitmodifiziert. n ProgrammbenutztsichselbstalsDaten.DurchModifikationdieser Datenkannessichselbstmodifizieren.Demzufolgeerfolgtkeine UnterscheidungmehrzwischenProgrammundDaten. thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/09-dyn&dsls&esot.pdf 03.Juni2016 14 Dyn.Programmänderung– Beispiel n HinzufügeneinerneuenMethode zueinerKlasseund Ausführungdieser(Ruby): class Foo # initiale Definition der Klasse ... end # füge neue Methode 'hello' zur Klasse 'Foo' hinzu Foo.class_eval("def hello; return 'hello'; end”) # erzeuge neue Instanz und führe 'hello' aus Foo.new.hello n Ähnlichkannmanmitremove_method inRubyeineMethodemC einerKlasseC zurLaufzeitentfernen.Beachte:hatmC jedochmSup einerSuperklasseSup überschrieben,dannkanndanachimmer nochmSup aufInstanzenC vonaufgerufenwerden(daererbt). thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/09-dyn&dsls&esot.pdf 03.Juni2016 K09.2 DomänenspezifischeProgrammiersprachen thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/09-dyn&dsls&esot.pdf 03.Juni2016 16 Unterscheidung n Allebisherbetrachteten Sprachenzählenzuden„general purpose“Sprachen:siesinduniversell,d.h.fürjegliche Programmieraufgaben(mehroderwenigergut)benutzbar. n n Programmiersprachensindnichtpersegutoderschlecht;siesind nurmehroderwenigergutgeeignetfüreinenbestimmtenZweck. Einedomänenspezifische Sprache(DSL)istfüreinen bestimmten,eingegrenzten Problembereichentworfen. n n Ziel:durchDomänenexpertenohneZusatzwissennutzbar:„weniger technisch“. BeispielefürNicht-Ziele– alsbewussteDesignentscheidung: n n Turing-Vollständigkeit Ausführbarkeit– Modellierungssprachen wiez.B.UML thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/09-dyn&dsls&esot.pdf 03.Juni2016 17 TypenvonDSLs (i) ManunterscheidetzwischenzweiTypenvonDSLs: 1. InterneDSL: n n n Definiertmittelseiner Wirtsprogrammiersprache(hostlanguage). DSL(„Programm“)isteingebettetineinWirtsprogramm. Freiheitsgrade bzgl.derDSLdaher durchWirtssprachebeschränkt. Beispiele internerDSLs: n Gradle:Build-Sprache,aufBasisvonGroovydefiniert. n Rake:Build-Sprache,aufBasisvonRubydefiniert. thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/09-dyn&dsls&esot.pdf 03.Juni2016 18 TypenvonDSLs (ii) 2. ExterneDSL: n Nichtmittelseinerbestehenden Programmiersprachedefiniert n n n Definition derSyntaxalsformaleGrammatikmeistmitentsprechenden Tools Freiheitsgrade „nur“durchEditorenundGesetze bzw.Grenzender maschinellenVerarbeitung beschränkt(Berechenbarkeit, Ausführbarkeit, Komplexität). BisherhoherAufwandfürEntwicklungexterner DSLs.Neue FrameworkszurEntwicklung/Spezifikationerleichtern dieserheblich, z.B.: Xtext [http://www.eclipse.org/Xtext] n n ErweiterteBackus-Naur-Form(EBNF)zurBeschreibungderGrammatik Parser,CompilerundTexteditorwerdenautomatischerzeugt thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/09-dyn&dsls&esot.pdf 03.Juni2016 19 BeispieleexternerDSLs n n n Csound:Software-Synthesizer zurKlang-/Musikerzeugung LaTeX:Textsatz PROMOS:Modellierungvon(finanzmathematischen) Produkten,z.B.Versicherungsprodukte n Struktur,Varianten,Kostenmodell,Regeln n R:statistischesRechnenundErzeugungstatistischerGrafiken n Sieve: DefinitionvonE-Mail-Filtern n SQL:AnfragesprachefürrelationaleDatenbanken n Verilog,VHDL:Hardwarebeschreibungssprachen n ...undviele,vielemehr thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/09-dyn&dsls&esot.pdf 03.Juni2016 21 ZuguterLetzt:einAusblick WogehtdieEntwicklungvonProgrammiersprachenhin?Werdenwirneue Paradigmensehen?WassindaktuelleTrends? Trends: n Multi-Paradigmen-Sprachen n n n Imperativ,objektorientiert,funktional,generisch(,logikorientiert) Beispiele: D,F#,Scala Polyglott-Programmierung n VerwendungundengeKopplungmehrererProgrammiersprachen Mittel- bzw.langfristig: n ModulareSprachen* n n StandardisierteModulefürgrundlegendeBelange Selbstdefinierte Module(Erweiterungen)fürdomänenspezifische Belange *SindeinelogischeKonsequenzdessenwasauchinnatürlichenSprachenpassiert: sie verändernsich,dajedersieverändernkann. thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/09-dyn&dsls&esot.pdf 03.Juni2016 thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/09-dyn&dsls&esot.pdf 03.Juni2016 EsgibtmindestenszweiArtenvonMagieinderProgrammierung:Diejenige,dieentsteht,wenndunichts überProgrammierungweißt.Unddie,dieentsteht,wenndusehrsehrvielüberProgrammierungweißt. 0 vs.>100000 lines of code written 23 24 ...Paradigmen...??? WashatdiesesComicmit(Programmier-)Paradigmenzutun? Antwort:InderPraxisderProgrammierungbzw.Softwareentwicklungfindetmanmindestensein nichttechnisches Paradigma,welchesnahezuunüberwindbarist. thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/09-dyn&dsls&esot.pdf 03.Juni2016