K10.1 DynamischeProgrammiersprachen thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/10-dyn&dsls&esot.pdf 02.Juni2017 2 DynamischeProgrammiersprachen n n DerBegriffDynamischenProgrammiersprache istnichtpräzisebzw. formaldefiniert. TypischerweiseverstehtmandarunterSprachen... 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/fs17/prog/10-dyn&dsls&esot.pdf 02.Juni2017 3 DynamischeTypüberprüfung n TypüberprüfungerfolgtzurLaufzeit(imGegensatzzurstatischen TypprüfungzurCompilezeit). Vertreter:Groovy,JavaScript,Lisp,Lua,Perl,PHP,Ruby,Python,... n n (i) CharakteristischeEigenschaft: 1. Werte/ObjektehabenTyp n 2. Ergo:TypinformationmusszusätzlichmitdemWert/Objektgeführtwerden. VariablenhabenkeinenTyp n Ergo:VariablekannwährendihrerLebenszeitWertebeliebigenTypsannehmen. à EskönnenwenigerbisgarkeineGarantienzurTypkompatibilitätzur Laufzeitgegebenwerden. thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/10-dyn&dsls&esot.pdf 02.Juni2017 4 DynamischeTypüberprüfung n (ii) Nachteile: n TypüberprüfungzurLaufzeithatgewissenAufwand(Overhead). n LaufzeitfehlerdurchTypinkompatibilitäten. n n Auftretens- undUrsacheort imQuelltextu.U.weitvoneinanderentfernt ErhöhterTestaufwand;volleAbdeckungallermöglichen AusführungenaberoftnichtmitsinnvollemAufwandmachbar. thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/10-dyn&dsls&esot.pdf 02.Juni2017 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/fs17/prog/10-dyn&dsls&esot.pdf 02.Juni2017 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 02.Juni2017 thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/10-dyn&dsls&esot.pdf 7 DuckTyping – Gegenüberstellung(iii) n n DuckTyping istdynamischeFormdesStructural Typing.Beiletzterem wirdTypkompatibilitäti.Allg.statischzurCompilezeit bestimmt. DieTypsystemederbisherinderVorlesungbehandeltenSprachen(C++, Java,Haskell)sindnominativ: n Typkompatibilitätbzw.-äquivalenzbestimmtdurchexplizite 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/fs17/prog/10-dyn&dsls&esot.pdf 02.Juni2017 8 Mixins n n (i) Idee:EinMixin deklariertunddefiniert eineMengevonMethodendieman(zur Laufzeit)beliebigvielenKlassenhinzufügt– „beimischt“,ohnedassesdabeieine Superklasseseinmuss(wasdamitdenUnterschiedzurVererbungdarstellt). 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/fs17/prog/10-dyn&dsls&esot.pdf 02.Juni2017 9 Mixins n KonzeptinderobjektorientiertenProgrammierung: 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:eliminiertProblemedesmehrfachenErbensvonMethoden (sieheauchDiamond-Problembzw.virtuelleMehrfachvererbunginC++) JavaInterface n n (ii) Unterschied: Methodensindimplementiert. MancheSprachenermöglichendas„beimischen“vonMethodenin eineKlassezurLaufzeit,wobeiMixins selbstzurCompilezeit definiertsind.Diesentsprichteinemlate binding. thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/10-dyn&dsls&esot.pdf 02.Juni2017 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. AuswertungzurLaufzeitmeistinterpretiert;kompilierteAuswertungbenötigt ZugriffaufdenCompilerdurchdasausführbareProgramm. AuswertungzurLaufzeitverfügbaru.a.inLua,Perl,Python,Ruby. Syntaxbzgl.eval variiertzwischendenProgrammiersprachen;z.B. impliziteKennzeichnungdurchPräfix# beiC/C++Makros. thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/10-dyn&dsls&esot.pdf 02.Juni2017 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/fs17/prog/10-dyn&dsls&esot.pdf 02.Juni2017 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})") AusprobierbarohnedassmaneineRuby-Laufzeitumgebung Installierenmussauf http://codepad.org/ thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/10-dyn&dsls&esot.pdf 02.Juni2017 13 Metaprogrammierung– Dynamische Programmodifikation n EbenfallsmitLisp wurdeerstmaligdieMöglichkeiteingeführt dasseinProgrammsichselbstzurLaufzeitmodifiziert. n n ProgrammbenutztsichselbstalsDaten.DurchModifikationdieser Datenkannessichselbstmodifizieren. DemzufolgeerfolgtkeineUnterscheidungmehrzwischen ProgrammundDaten. thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/10-dyn&dsls&esot.pdf 02.Juni2017 14 Dyn.Programmänderung– Beispiel n HinzufügeneinerneuenMethodezueinerKlasseund 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/fs17/prog/10-dyn&dsls&esot.pdf 02.Juni2017 K10.2 DomänenspezifischeProgrammiersprachen thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/10-dyn&dsls&esot.pdf 02.Juni2017 16 Unterscheidung n AllebisherbetrachtetenSprachenzählenzuden„general purpose“Sprachen:siesinduniversell,d.h.fürjegliche Programmieraufgaben(mehroderwenigergut)benutzbar. n n Programmiersprachensindnichtpersegutoderschlecht;siesind nurmehroderwenigergutgeeignetfüreinenbestimmtenZweck. EinedomänenspezifischeSprache(DSL)istfüreinen bestimmten,eingegrenztenProblembereichentworfen. n n Ziel:durchDomänenexpertenohneZusatzwissennutzbar:„weniger technisch“. BeispielefürNicht-Ziele– alsbewussteDesignentscheidung: n n Turing-Vollständigkeit Ausführbarkeit– Modellierungssprachenwiez.B.UML thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/10-dyn&dsls&esot.pdf 02.Juni2017 17 TypenvonDSLs (i) ManunterscheidetzwischenzweiTypenvonDSLs: 1. InterneDSL: n DefiniertmittelseinerWirtsprogrammiersprache(hostlanguage). DSL(„Programm“)isteingebettetineinWirtsprogramm. n Freiheitsgradebzgl.derDSLdaherdurchWirtssprachebeschränkt. n BeispieleinternerDSLs: n Gradle:Build-Sprache,aufBasisvonGroovydefiniert. n Rake:Build-Sprache,aufBasisvonRubydefiniert. thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/10-dyn&dsls&esot.pdf 02.Juni2017 18 TypenvonDSLs (ii) 2. ExterneDSL: n NichtmittelseinerbestehendenProgrammiersprachedefiniert n n n DefinitionderSyntaxalsformaleGrammatikmeistmitentsprechendenTools Freiheitsgrade„nur“durchEditorenundGesetzebzw.Grenzender maschinellenVerarbeitungbeschränkt(Berechenbarkeit, Ausführbarkeit,Komplexität). BisherhoherAufwandfürEntwicklungexternerDSLs.Neue FrameworkszurEntwicklung/Spezifikationerleichterndieserheblich, z.B.: Xtext [http://www.eclipse.org/Xtext] n n ErweiterteBackus-Naur-Form(EBNF)zurBeschreibungderGrammatik Parser,CompilerundTexteditorwerdenautomatischerzeugt thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/10-dyn&dsls&esot.pdf 02.Juni2017 19 BeispieleexternerDSLs n n n Csound:Software-SynthesizerzurKlang-/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 Verilog,VHDL:Hardwarebeschreibungssprachen n ...undviele,vielemehr n thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/10-dyn&dsls&esot.pdf 02.Juni2017 21 Ausblick 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 SelbstdefinierteModule(Erweiterungen)fürdomänenspezifischeBelange *SindeinelogischeKonsequenzdessenwasauchinnatürlichenSprachenpassiert: sie verändernsich,dajedersieverändernkann. thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/10-dyn&dsls&esot.pdf 02.Juni2017 23 ...Paradigmen...??? WashatdiesesComicmit(Programmier-)Paradigmenzutun? Antwort:InderPraxisderProgrammierungbzw.Softwareentwicklungfindetmanmindestensein nichttechnisches Paradigma,welchesnahezuunüberwindbarist. thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/10-dyn&dsls&esot.pdf 02.Juni2017 thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/10-dyn&dsls&esot.pdf 02.Juni2017 EsgibtmindestenszweiArtenvonMagieinderProgrammierung:Diejenige,dieentsteht,wenndunichts überProgrammierungweißt.Unddie,dieentsteht,wenndusehrsehrvielüberProgrammierungweißt. 0 vs.>100000 lines of code written 24