Pragmatik von Programmiersprachen Im Kontext der Notation von Quelltexten Mike Becker, 11. Dezember 2014
Szenario: IT Dienstleister Unternehmen: Produkte: Kunden: IT Dienstleistung Beratung und Software möchten Spezialsoftware einsetzen 11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 2
Fragestellung Früher oder später: 11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 3
Lösungsansätze Mögliche Auswahlkriterien: Vorgabe des Kunden Best Practises Skillset der Mitarbeiter Vorlieben der Mitarbeiter 11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 4
Lösungsansätze Mögliche Auswahlkriterien: Vorgabe des Kunden = alternativlos Best Practises Skillset der Mitarbeiter Vorlieben der Mitarbeiter 11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 4
Lösungsansätze Mögliche Auswahlkriterien: Vorgabe des Kunden Best Practises = alternativlos Best Choice Skillset der Mitarbeiter Vorlieben der Mitarbeiter 11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 4
Lösungsansätze Mögliche Auswahlkriterien: Vorgabe des Kunden Best Practises Skillset der Mitarbeiter = alternativlos Best Choice keine Weiterentwicklung Vorlieben der Mitarbeiter 11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 4
Lösungsansätze Mögliche Auswahlkriterien: Vorgabe des Kunden Best Practises Skillset der Mitarbeiter Vorlieben der Mitarbeiter = alternativlos Best Choice keine Weiterentwicklung noch weniger Weiterentwicklung 11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 4
Lösungsansätze Mögliche Auswahlkriterien: Vorgabe des Kunden Best Practises Skillset der Mitarbeiter Vorlieben der Mitarbeiter = alternativlos Best Choice keine Weiterentwicklung noch weniger Weiterentwicklung Spracheigenschaften 11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 4
Aspekte einer Programmiersprache Notation Formale Sprache mit Alphabet und Grammatik Lexik und Syntax Bedeutung Was tut der notierte Algorithmus? Semantik Einsetzbarkeit Wie gut lässt sich der Lösungsweg ausdrücken? Pragmatik 11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 5
Pragmatik Szenario Pragmatik Lesbarkeit und Kompaktheit Eindeutigkeit Compilerunterstützung Funktionale Programmierung Fazit Bei natürlichen Sprachen: Was man mit Sprache bewirken kann (Wagenknecht, Hielscher) Ironie, Satire Höflichkeit, Provokation Überzeugen (rhetorische Tricks) Änderung der Bedeutung durch externe Einflüsse Beispiel: Wo bist du? Hier. 11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 6
Pragmatik Übertragen auf Programmiersprachen: Fachliche Einsatzbereiche Technisches Umfeld Beziehungen zwischen Mensch und Maschine 11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 7
Mögliche Betrachtungen 11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 8
Mögliche Betrachtungen 11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 8
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
Notation des Quellcodes Wichtige Bemerkungen um unsachliche Diskussionen zu vermeiden: Lesbarkeit: Eindeutigkeit: Kompaktheit: Compilerunterstützung: 11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 10
Notation des Quellcodes Wichtige Bemerkungen um unsachliche Diskussionen zu vermeiden: Lesbarkeit: ist allgemein subjektiv vergleichend und von außen bewerten Eindeutigkeit: Kompaktheit: Compilerunterstützung: 11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 10
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: Compilerunterstützung: 11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 10
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: 11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 10
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
Lesbarkeit und Kompaktheit Lesbarkeit Wie gut ist der Quelltext für Sprachneulinge verständlich? Kompaktheit Wie viele Instruktionen werden für die Problemlösung benötigt? 11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 11
Beispiel - Zeilen zählen mit Haskell main = print. length. lines =<< readfile "linecount.hs" 11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 12
Beispiel - Zeilen zählen mit Python with open("linecount.py") as f: for i, l in enumerate(f): pass print i + 1 11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 13
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
Beispiel - Zeilen zählen mit Assembler 11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 15
Lesbarkeit und Kompaktheit Feststellung Lesbarkeit und Kompaktheit sind in der Theorie unabhängig, aber unterliegen in der Praxis den gleichen Einflüssen. 11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 16
Lesbarkeit und Kompaktheit Feststellung Lesbarkeit und Kompaktheit sind in der Theorie unabhängig, aber unterliegen in der Praxis den gleichen Einflüssen. Merksatz Verbosität und Granularität erhöhen die Lesbarkeit auf Kosten der Kompaktheit. 11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 16
Lesbarkeit und Kompaktheit Feststellung Lesbarkeit und Kompaktheit sind in der Theorie unabhängig, aber unterliegen in der Praxis den gleichen Einflüssen. Merksatz Verbosität und Granularität erhöhen die Lesbarkeit auf Kosten der Kompaktheit. Beispiel (Java): synchronized 11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 16
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
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
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
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
Eindeutigkeit Feststellung Wiederverwendung von Schlüsselwörtern und Symbolen stellen nicht nur Programmierer, sondern auch Programe vor Herausforderungen. 11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 19
Eindeutigkeit Feststellung Wiederverwendung von Schlüsselwörtern und Symbolen stellen nicht nur Programmierer, sondern auch Programe vor Herausforderungen. Merksatz Je mehr Symbole und Schlüsselwörter eine eindeutige Bedeutung haben, desto kleiner sind die Lernkurve des Programmierers und der Umfang eines Parsers. 11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 19
Compilerunterstützung 11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 20
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 werden Beispiel: String Null (in Kurzschreibweise: String?) 11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 21
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 werden Beispiel: String Null (in Kurzschreibweise: String?) Das Typsystem wird zur Vermeidung von NPE ausgenutzt 11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 21
Vollständige Pfadabdeckung Beispiel (Ceylon): switch (cmpresult) case (smaller) { //... } case (equal) { //... } case (larger) { //... } 11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 22
Compilerunterstützung Feststellung Strengere Regeln ermöglichen es dem Compiler bei der Vermeidung von Fehlern zu unterstützen, aber erzwingen auch einen bestimmten Stil. 11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 23
Compilerunterstützung Feststellung Strengere Regeln ermöglichen es dem Compiler bei der Vermeidung von Fehlern zu unterstützen, aber erzwingen auch einen bestimmten Stil. Merksatz Die möglichen Kosten von Fehleranalyse und -behebung sind gegen die möglichen Kosten eines zu restriktiven Compilers abzuwägen. 11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 23
Fazit Soweit zur Theorie! Praxis? 11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 24
Fazit Soweit zur Theorie! Praxis selbst! 11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 24
Fazit Soweit zur Theorie! Praxis selbst! Hinweis: strategische Schokoladenreserven bereithalten. 11. Dezember 2014 Mike Becker Pragmatik von Programmiersprachen Seite 24