Dynamische Programmiersprachen

Werbung
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
Zugehörige Unterlagen
Herunterladen