Pragmatik von Programmiersprachen
Im Kontext der Notation von Quelltexten
Mike Becker, 11. Dezember 2014
Szenario Pragmatik Lesbarkeit und Kompaktheit Eindeutigkeit Compilerunterstützung Funktionale Programmierung Fazit
Szenario: IT Dienstleister
Unternehmen: IT DienstleistungProdukte: Beratung und SoftwareKunden: möchten Spezialsoftware einsetzen
11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 2
Szenario Pragmatik Lesbarkeit und Kompaktheit Eindeutigkeit Compilerunterstützung Funktionale Programmierung Fazit
Fragestellung
Früher oder später:
11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 3
Szenario Pragmatik Lesbarkeit und Kompaktheit Eindeutigkeit Compilerunterstützung Funktionale Programmierung Fazit
Lösungsansätze
Mögliche Auswahlkriterien:
• Vorgabe des Kunden
= alternativlos
• Best Practises
6= Best Choice
• Skillset der Mitarbeiter
⇒ keine Weiterentwicklung
• Vorlieben der Mitarbeiter
⇒ noch weniger Weiterentwicklung
• Spracheigenschaften
11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 4
Szenario Pragmatik Lesbarkeit und Kompaktheit Eindeutigkeit Compilerunterstützung Funktionale Programmierung Fazit
Lösungsansätze
Mögliche Auswahlkriterien:
• Vorgabe des Kunden = alternativlos
• Best Practises
6= Best Choice
• Skillset der Mitarbeiter
⇒ keine Weiterentwicklung
• Vorlieben der Mitarbeiter
⇒ noch weniger Weiterentwicklung
• Spracheigenschaften
11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 4
Szenario Pragmatik Lesbarkeit und Kompaktheit Eindeutigkeit Compilerunterstützung Funktionale Programmierung Fazit
Lösungsansätze
Mögliche Auswahlkriterien:
• Vorgabe des Kunden = alternativlos
• Best Practises 6= Best Choice
• Skillset der Mitarbeiter
⇒ keine Weiterentwicklung
• Vorlieben der Mitarbeiter
⇒ noch weniger Weiterentwicklung
• Spracheigenschaften
11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 4
Szenario Pragmatik Lesbarkeit und Kompaktheit Eindeutigkeit Compilerunterstützung Funktionale Programmierung Fazit
Lösungsansätze
Mögliche Auswahlkriterien:
• Vorgabe des Kunden = alternativlos
• Best Practises 6= Best Choice
• Skillset der Mitarbeiter ⇒ keine Weiterentwicklung
• Vorlieben der Mitarbeiter
⇒ noch weniger Weiterentwicklung
• Spracheigenschaften
11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 4
Szenario Pragmatik Lesbarkeit und Kompaktheit Eindeutigkeit Compilerunterstützung Funktionale Programmierung Fazit
Lösungsansätze
Mögliche Auswahlkriterien:
• Vorgabe des Kunden = alternativlos
• Best Practises 6= Best Choice
• Skillset der Mitarbeiter ⇒ keine Weiterentwicklung
• Vorlieben der Mitarbeiter ⇒ noch weniger Weiterentwicklung
• Spracheigenschaften
11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 4
Szenario Pragmatik Lesbarkeit und Kompaktheit Eindeutigkeit Compilerunterstützung Funktionale Programmierung Fazit
Lösungsansätze
Mögliche Auswahlkriterien:
• Vorgabe des Kunden = alternativlos
• Best Practises 6= Best Choice
• Skillset der Mitarbeiter ⇒ keine Weiterentwicklung
• Vorlieben der Mitarbeiter ⇒ noch weniger Weiterentwicklung
• Spracheigenschaften
11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 4
Szenario Pragmatik Lesbarkeit und Kompaktheit Eindeutigkeit Compilerunterstützung Funktionale Programmierung Fazit
Aspekte einer Programmiersprache
NotationFormale Sprache mit Alphabet und GrammatikLexik und Syntax
BedeutungWas tut der notierte Algorithmus?Semantik
EinsetzbarkeitWie gut lässt sich der Lösungsweg ausdrücken?Pragmatik
11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 5
Szenario Pragmatik Lesbarkeit und Kompaktheit Eindeutigkeit Compilerunterstützung Funktionale Programmierung Fazit
Pragmatik
Bei natürlichen Sprachen:
Was man mit Sprache bewirken kann (Wagenknecht, Hielscher)Ironie, SatireHöflichkeit, ProvokationÜberzeugen (rhetorische Tricks)
Änderung der Bedeutung durch externe EinflüsseBeispiel: „Wo bist du?“ – „Hier.“
11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 6
Szenario Pragmatik Lesbarkeit und Kompaktheit Eindeutigkeit Compilerunterstützung Funktionale Programmierung Fazit
Pragmatik
Übertragen auf Programmiersprachen:
Fachliche Einsatzbereiche
Technisches Umfeld
Beziehungen zwischen Mensch und Maschine
11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 7
Szenario Pragmatik Lesbarkeit und Kompaktheit Eindeutigkeit Compilerunterstützung Funktionale Programmierung Fazit
Mögliche Betrachtungen
11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 8
Szenario Pragmatik Lesbarkeit und Kompaktheit Eindeutigkeit Compilerunterstützung Funktionale Programmierung Fazit
Mögliche Betrachtungen
11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 8
Szenario Pragmatik Lesbarkeit und Kompaktheit Eindeutigkeit Compilerunterstützung Funktionale Programmierung Fazit
Notation des Quellcodes
Mögliche Kriterien für die Untersuchung:
Lesbarkeit
Eindeutigkeit
Kompaktheit
Compilerunterstützung
11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 9
Szenario Pragmatik Lesbarkeit und Kompaktheit Eindeutigkeit Compilerunterstützung Funktionale Programmierung Fazit
Notation des Quellcodes
Wichtige Bemerkungen um unsachliche Diskussionen zu vermeiden:
Lesbarkeit:
ist allgemein subjektiv⇒ vergleichend und von außen bewerten
Eindeutigkeit:
der Mensch gewöhnt sich schnell⇒ Bedeutung für Software?
Kompaktheit:
Optik versus Metrik
Compilerunterstützung:
Nicht nur mit VI programmieren
11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 10
Szenario Pragmatik Lesbarkeit und Kompaktheit Eindeutigkeit Compilerunterstützung Funktionale Programmierung Fazit
Notation des Quellcodes
Wichtige Bemerkungen um unsachliche Diskussionen zu vermeiden:
Lesbarkeit:ist allgemein subjektiv⇒ vergleichend und von außen bewerten
Eindeutigkeit:
der Mensch gewöhnt sich schnell⇒ Bedeutung für Software?
Kompaktheit:
Optik versus Metrik
Compilerunterstützung:
Nicht nur mit VI programmieren
11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 10
Szenario Pragmatik Lesbarkeit und Kompaktheit Eindeutigkeit Compilerunterstützung Funktionale Programmierung Fazit
Notation des Quellcodes
Wichtige Bemerkungen um unsachliche Diskussionen zu vermeiden:
Lesbarkeit:ist allgemein subjektiv⇒ vergleichend und von außen bewerten
Eindeutigkeit:der Mensch gewöhnt sich schnell⇒ Bedeutung für Software?
Kompaktheit:
Optik versus Metrik
Compilerunterstützung:
Nicht nur mit VI programmieren
11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 10
Szenario Pragmatik Lesbarkeit und Kompaktheit Eindeutigkeit Compilerunterstützung Funktionale Programmierung Fazit
Notation des Quellcodes
Wichtige Bemerkungen um unsachliche Diskussionen zu vermeiden:
Lesbarkeit:ist allgemein subjektiv⇒ vergleichend und von außen bewerten
Eindeutigkeit:der Mensch gewöhnt sich schnell⇒ Bedeutung für Software?
Kompaktheit:Optik versus Metrik
Compilerunterstützung:
Nicht nur mit VI programmieren
11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 10
Szenario Pragmatik Lesbarkeit und Kompaktheit Eindeutigkeit Compilerunterstützung Funktionale Programmierung Fazit
Notation des Quellcodes
Wichtige Bemerkungen um unsachliche Diskussionen zu vermeiden:
Lesbarkeit:ist allgemein subjektiv⇒ vergleichend und von außen bewerten
Eindeutigkeit:der Mensch gewöhnt sich schnell⇒ Bedeutung für Software?
Kompaktheit:Optik versus Metrik
Compilerunterstützung:Nicht nur mit VI programmieren
11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 10
Szenario Pragmatik Lesbarkeit und Kompaktheit Eindeutigkeit Compilerunterstützung Funktionale Programmierung Fazit
Lesbarkeit und Kompaktheit
LesbarkeitWie gut ist der Quelltext für Sprachneulinge verständlich?
KompaktheitWie viele Instruktionen werden für die Problemlösung benötigt?
11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 11
Szenario Pragmatik Lesbarkeit und Kompaktheit Eindeutigkeit Compilerunterstützung Funktionale Programmierung Fazit
Beispiel - Zeilen zählen mit Haskell
main = print . length . lines=<< readFile "linecount.hs"
11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 12
Szenario Pragmatik Lesbarkeit und Kompaktheit Eindeutigkeit Compilerunterstützung Funktionale Programmierung Fazit
Beispiel - Zeilen zählen mit Python
with open("linecount.py") as f:for i, l in enumerate(f):
passprint i + 1
11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 13
Szenario Pragmatik Lesbarkeit und Kompaktheit Eindeutigkeit Compilerunterstützung Funktionale Programmierung Fazit
Beispiel - Zeilen zählen mit Java
import java.io.∗;
public class LineCount {public static void main(String args[])
throws IOException {try (BufferedReader reader = new BufferedReader(
new InputStreamReader(new FileInputStream("LineCount.java")))) {
int n = 0; while(reader.readLine() != null) n++;System.out.printf("%d\n", n);
}}
}
11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 14
Szenario Pragmatik Lesbarkeit und Kompaktheit Eindeutigkeit Compilerunterstützung Funktionale Programmierung Fazit
Beispiel - Zeilen zählen mit Assembler
11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 15
Szenario Pragmatik Lesbarkeit und Kompaktheit Eindeutigkeit Compilerunterstützung Funktionale Programmierung Fazit
Lesbarkeit und Kompaktheit
FeststellungLesbarkeit und Kompaktheit sind in der Theorie unabhängig, aberunterliegen in der Praxis den gleichen Einflüssen.
MerksatzVerbosität und Granularität erhöhen die Lesbarkeit auf Kosten derKompaktheit.
Beispiel (Java): synchronized
11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 16
Szenario Pragmatik Lesbarkeit und Kompaktheit Eindeutigkeit Compilerunterstützung Funktionale Programmierung Fazit
Lesbarkeit und Kompaktheit
FeststellungLesbarkeit und Kompaktheit sind in der Theorie unabhängig, aberunterliegen in der Praxis den gleichen Einflüssen.
MerksatzVerbosität und Granularität erhöhen die Lesbarkeit auf Kosten derKompaktheit.
Beispiel (Java): synchronized
11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 16
Szenario Pragmatik Lesbarkeit und Kompaktheit Eindeutigkeit Compilerunterstützung Funktionale Programmierung Fazit
Lesbarkeit und Kompaktheit
FeststellungLesbarkeit und Kompaktheit sind in der Theorie unabhängig, aberunterliegen in der Praxis den gleichen Einflüssen.
MerksatzVerbosität und Granularität erhöhen die Lesbarkeit auf Kosten derKompaktheit.
Beispiel (Java): synchronized
11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 16
Szenario Pragmatik Lesbarkeit und Kompaktheit Eindeutigkeit Compilerunterstützung Funktionale Programmierung Fazit
Schlüsselwort-Eindeutigkeit
Beispiel (Java):
class Foo implements Bar// ...List<? extends Bar> list = new ArrayList<Foo>();
Beispiel (Python):
for e in l:# <Block>else# <Block>
11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 17
Szenario Pragmatik Lesbarkeit und Kompaktheit Eindeutigkeit Compilerunterstützung Funktionale Programmierung Fazit
Symbol-Eindeutigkeit
Beispiel (C#):
G(F < A, B > (-7))
Beispiel (C++):
typedef sometype<T1, T2<T1, T3> >
11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 18
Szenario Pragmatik Lesbarkeit und Kompaktheit Eindeutigkeit Compilerunterstützung Funktionale Programmierung Fazit
Symbol-Eindeutigkeit
Beispiel (C#):
G(F < A, B > (-7))
Beispiel (C++):
typedef sometype<T1, T2<T1, T3> >
11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 18
Szenario Pragmatik Lesbarkeit und Kompaktheit Eindeutigkeit Compilerunterstützung Funktionale Programmierung Fazit
Symbol-Eindeutigkeit
Beispiel (C#):
G(F < A, B > (-7))
Beispiel (C++):
typedef sometype<T1, T2<T1, T3> >
11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 18
Szenario Pragmatik Lesbarkeit und Kompaktheit Eindeutigkeit Compilerunterstützung Funktionale Programmierung Fazit
Eindeutigkeit
FeststellungWiederverwendung von Schlüsselwörtern und Symbolen stellen nichtnur Programmierer, sondern auch Programe vor Herausforderungen.
MerksatzJe mehr Symbole und Schlüsselwörter eine eindeutige Bedeutunghaben, desto kleiner sind die Lernkurve des Programmierers und derUmfang eines Parsers.
11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 19
Szenario Pragmatik Lesbarkeit und Kompaktheit Eindeutigkeit Compilerunterstützung Funktionale Programmierung Fazit
Eindeutigkeit
FeststellungWiederverwendung von Schlüsselwörtern und Symbolen stellen nichtnur Programmierer, sondern auch Programe vor Herausforderungen.
MerksatzJe mehr Symbole und Schlüsselwörter eine eindeutige Bedeutunghaben, desto kleiner sind die Lernkurve des Programmierers und derUmfang eines Parsers.
11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 19
Szenario Pragmatik Lesbarkeit und Kompaktheit Eindeutigkeit Compilerunterstützung Funktionale Programmierung Fazit
Compilerunterstützung
11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 20
Szenario Pragmatik Lesbarkeit und Kompaktheit Eindeutigkeit Compilerunterstützung Funktionale Programmierung Fazit
NullPointerException-Vermeidung
NullPointerException-Vermeidung in Ceylon:
null ist keine Instanz von Object, sondern von Null
Null ist nicht instanzierbar, sondern ein Enumerationstyp
null ist die einzige Instanz von Null
über Union-Types kann jeder beliebige Typ optional werdenBeispiel: String | Null (in Kurzschreibweise: String?)
⇒ Das Typsystem wird zur Vermeidung von NPE ausgenutzt
11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 21
Szenario Pragmatik Lesbarkeit und Kompaktheit Eindeutigkeit Compilerunterstützung Funktionale Programmierung Fazit
NullPointerException-Vermeidung
NullPointerException-Vermeidung in Ceylon:
null ist keine Instanz von Object, sondern von Null
Null ist nicht instanzierbar, sondern ein Enumerationstyp
null ist die einzige Instanz von Null
über Union-Types kann jeder beliebige Typ optional werdenBeispiel: String | Null (in Kurzschreibweise: String?)
⇒ Das Typsystem wird zur Vermeidung von NPE ausgenutzt
11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 21
Szenario Pragmatik Lesbarkeit und Kompaktheit Eindeutigkeit Compilerunterstützung Funktionale Programmierung Fazit
Vollständige Pfadabdeckung
Beispiel (Ceylon):
switch (cmpResult)case (smaller) {// ...}case (equal) {// ...}case (larger) {// ...}
11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 22
Szenario Pragmatik Lesbarkeit und Kompaktheit Eindeutigkeit Compilerunterstützung Funktionale Programmierung Fazit
Compilerunterstützung
FeststellungStrengere Regeln ermöglichen es dem Compiler bei der Vermeidungvon Fehlern zu unterstützen, aber erzwingen auch einen bestimmtenStil.
MerksatzDie möglichen Kosten von Fehleranalyse und -behebung sind gegendie möglichen Kosten eines zu restriktiven Compilers abzuwägen.
11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 23
Szenario Pragmatik Lesbarkeit und Kompaktheit Eindeutigkeit Compilerunterstützung Funktionale Programmierung Fazit
Compilerunterstützung
FeststellungStrengere Regeln ermöglichen es dem Compiler bei der Vermeidungvon Fehlern zu unterstützen, aber erzwingen auch einen bestimmtenStil.
MerksatzDie möglichen Kosten von Fehleranalyse und -behebung sind gegendie möglichen Kosten eines zu restriktiven Compilers abzuwägen.
11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 23
Szenario Pragmatik Lesbarkeit und Kompaktheit Eindeutigkeit Compilerunterstützung Funktionale Programmierung Fazit
Fazit
Soweit zur Theorie!
Praxis?
Hinweis: strategische Schokoladenreserven bereithalten.
11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 24
Szenario Pragmatik Lesbarkeit und Kompaktheit Eindeutigkeit Compilerunterstützung Funktionale Programmierung Fazit
Fazit
Soweit zur Theorie!
Praxis⇒ selbst!
Hinweis: strategische Schokoladenreserven bereithalten.
11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 24
Szenario Pragmatik Lesbarkeit und Kompaktheit Eindeutigkeit Compilerunterstützung Funktionale Programmierung Fazit
Fazit
Soweit zur Theorie!
Praxis⇒ selbst!
Hinweis: strategische Schokoladenreserven bereithalten.
11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 24