Dynamische Programmiersprachen

Werbung
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
Herunterladen