Einleitung Typsystem Typisierung Zusammenfassung Literatur. Typisierung. Effiziente Programmierung. Thomas Schnieders

Ähnliche Dokumente
Java Einführung VARIABLEN und DATENTYPEN Kapitel 2

Einstieg in die Informatik mit Java

Repetitorium Informatik (Java)

Das Typsystem von Scala. L. Piepmeyer: Funktionale Programmierung - Das Typsystem von Scala

Prinzipielle Ausführungsvarianten I

2.5 Primitive Datentypen

Objektorientierte Programmierung

Einführung Datentypen Verzweigung Schleifen. Java Crashkurs. Kim-Manuel Klein May 4, 2015

Hello World. Javakurs 2014, 1. Vorlesung. Sebastian Schuck. basierend auf der Vorlage von Arne Kappen. wiki.freitagsrunde.org. 3.

Welche Informatik-Kenntnisse bringen Sie mit?

JAVA-Datentypen und deren Wertebereich

1 Polymorphie (Vielgestaltigkeit)

Java I Vorlesung 6 Referenz-Datentypen

Einstieg in die Informatik mit Java

Einführung in die Programmierung mit VBA

Deklarationen in C. Prof. Dr. Margarita Esponda

Ein erstes Java-Programm

Kapitel 3: Variablen

Javakurs für Anfänger

Einführung in die Programmierung 1

Javaprogrammierung mit NetBeans. Variablen, Datentypen, Methoden

Einführung Datentypen Verzweigung Schleifen Funktionen Dynamische Datenstrukturen. Java Crashkurs. Kim-Manuel Klein

RO-Tutorien 3 / 6 / 12

Einführung in die Informatik für Hörer aller Fakultäten II. Andreas Podelski Stephan Diehl Uwe Waldmann

Werkzeuge zur Programmentwicklung

Einleitung Entwicklung in C Hello-World! Konstrukte in C Zusammenfassung Literatur. Grundlagen von C. Jonas Gresens

Zeiger, Arrays und Strings in C und C++

Primitive Datentypen und Felder (Arrays)

Objektorientierte Programmierung OOP Programmieren mit Java

Übersicht. Vorstellung des OO-Paradigmas

Computeranwendung und Programmierung (CuP)

Die Programmiersprache C

Gliederung. Tutorium zur Vorlesung. Gliederung. Gliederung. 1. Gliederung der Informatik. 1. Gliederung der Informatik. 1. Gliederung der Informatik

Einstieg in die Informatik mit Java

Elementare Konzepte von

Java - Zahlen, Wahrheitswerte und Zeichen. Leibniz Universität IT Services Anja Aue

2. Programmierung in C

Prinzipien Objektorientierter Programmierung

String s1, s2; Eine Zuweisung geschieht am einfachsten direkt durch Angabe des Strings eingeschlossen in doppelte Hochkommata:

Programmierung mit C Zeiger

Einführung in die Programmierung Laborübung bei Korcan Y. Kirkici. 3.Übung bis

Java-Vorkurs Wintersemester 15/16

Java - Zahlen, Wahrheitswerte und Zeichen. Leibniz Universität IT Services Anja Aue

Dr. Monika Meiler. Inhalt

Tutoraufgabe 1 (Zweierkomplement): Lösung: Programmierung WS16/17 Lösung - Übung 2

Einführung in den Einsatz von Objekt-Orientierung mit C++ I

Dynamische Sprachen auf der JVM

Informatik I. Übung 2 : Programmieren in Eclipse. 5. März Daniel Hentzen

Numerische Datentypen. Simon Weidmann

AuD-Tafelübung T-B5b

Java für Computerlinguisten

Programmiertechnik Operatoren, Kommentare, Ein-/Ausgabe

Tutorium Rechnerorganisation

Klassen und Objekte. Einführung in Java. Folie 1 von Mai Ivo Kronenberg

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden

Einführung in die Java- Programmierung

Programmiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny

Die Programmiersprache C Eine Einführung

Der Datentyp String. Stringvariable und -vergleiche

Informationsverarbeitung im Bauwesen

Werner Achte rt DATA BECKER

Einführung in die STL

Java, OO und UML Fortsetzung

Klassenbeziehungen & Vererbung

Programmieren I. Prinzipieller Ablauf. Eigenschaften von JAVA. Source-Code Javac Bytecode. Java Virtual Machine (Java, Browser, Appletviewer)

Kurze Einführung in die Programmiersprache C++ und in Root

Liste Programmieren Java Überblick

Informationsverarbeitung im Bauwesen

Programmieren in C. C Syntax Datentypen, Operatoren und Kontrollstrukturen. Prof. Dr. Nikolaus Wulff

Übungen zur Vorlesung Einführung in die Informatik Wintersemester 2010/11

Short Introduction to C# C# (C SHARP) Microsofts Antwort auf Java

Haskell, Typen, und Typberechnung. Grundlagen der Programmierung 3 A. Einige andere Programmiersprachen. Typisierung in Haskell

Einstieg in die Informatik mit Java

Skriptsprachen am Beispiel Python

1.2 Attribute und Methoden Aufbau einer Java-Klasse:

Vorlesung Programmieren

Präsentation Interfaces

7. Schnittstellen Grundlagen zu Schnittstellen. 7. Schnittstellen

Java Generics & Collections

Einführung in die C-Programmierung

Testen mit JUnit. Motivation

Programmieren in C++ Überladen von Methoden und Operatoren

Programmieren in C/C++ und MATLAB

Java Kurs für Anfänger Einheit 2 Datentypen und Operationen

Algorithmen und Programmierung II

Gebundene Typparameter

Grundzüge der Programmierung. Wiederverwendung VERERBUNG

Modul 122 VBA Scribt.docx

Algorithmen & Programmierung. Ausdrücke & Operatoren (1)

Kapitel 5. Datentypen und Operatoren

Inhalt. 1. Einführung in die Informatik. 2. Algorithmen. 3. Programmiersprache Visual Basic. 4. Grundlagen der Datenbanktechnologie.

Das erste Programm soll einen Text zum Bildschirm schicken. Es kann mit jedem beliebigen Texteditor erstellt werden.

Dr. Monika Meiler. Inhalt

Programmieren - C++ Funktions-Templates

Propädeutikum zur Programmierung

Systemnahe Programmierung in C/C++

Projektgruppe 453: Entwurf eines Managementwerkzeugs zur Verwaltung von Sicherheitsdiensten für komplexe eingebettete Dienstesysteme

Informatik. Studiengang Chemische Technologie. Michael Roth Hochschule Darmstadt -Fachbereich Informatik- WS 2012/2013.

Silke Trißl, Prof. Ulf Leser Wissensmanagement in der Bioinformatik. Jede Applikation braucht eine Klasse mit einer main-methode

Problemstellung. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 24: Reflection 1. IDE und automatische Tests.

Transkript:

Typisierung Effiziente Programmierung Thomas Schnieders Fachbereich Informatik Fakultät für Mathematik, Informatik und Naturwissenschaften Universität Hamburg 2018-04-26 Thomas Schnieders Typisierung 1 / 24

Gliederung (Agenda) 1 Einleitung 2 Typsystem 3 Typisierung 4 Zusammenfassung 5 Literatur Thomas Schnieders Typisierung 2 / 24

Einleitung Was sind Typen Was bedeutet Typsicherheit Typsicherheit durch Typumwandlung (implizit und explizit) Schwache und starke Typisierung Dynamische und statische Typisierung Thomas Schnieders Typisierung 3 / 24

Typsystem Der Typ definiert Wertebereich und zugehörige Operationen (für ein Objekt) Wertebereich in Java 1 Integer a = 3; // klappt, da 3 im Wertebereich 2 Integer b = 2147483648; // Fehler : out of Range Operationen 1 Integer a = 3; 2 int b = a. intvalue (); // klappt, da Methode fuer Integer zulaessig 3 int c = a. length (); // Fehler : Methode kann auf a nicht angewendet werden Thomas Schnieders Typisierung 4 / 24

Der Typ definiert Wertebereich und zugehörige Operationen (für ein Objekt) Ein Objekt ist ein Speicherbereich, in dem der Wert eines angegeben Typ abgelegt wurde Ein Wert ist eine Folge von Bits im Speicher, der entsprechend seines Typs interpretiert wird Eine Variable ist ein benanntes Objekt (Zuweisung bei der Deklaration) [Str10] Thomas Schnieders Typisierung 5 / 24

Programmiersprachen können zwischen unterschiedlichen Typgruppen unterschieden. In Java zwei Arten von Typen: Primitivtypen (einfache, eingebaut): byte, short, int, long, float, double, boolean. char Referenztypen: Damit lassen sich Objektverweise auf Zeichenketten, Datenstrukturen realisieren. [Ull18] In C++ Unterteilung in Grundtypen (int, short, bool, char, usw.) und die daraus ableitbaren oder zusammengesetzten Typen Thomas Schnieders Typisierung 6 / 24

Vorteil: Compiler unterscheidet zwischen primitiven Typen und Referenztypen Bytecode kann dadurch ebenfalls zwischen den Typen unterscheiden Laufzeitumgebung kann den Programmcode schneller ausführen Thomas Schnieders Typisierung 7 / 24

Typsicherheit Typsicherheit Typsicherheit: Ausmaß, in dem eine Programmiersprache Typfehler verhindert Typfehler äußert sich durch unerwünschtes oder fehlerhaftes Programmverhalten Keine Typverletzungen: Datentypen werden gemäß ihren Definitionen verwendet Typsicherheit herzustellen ist je nach Sprache dann Aufgabe des Compilers (Statisch Typisiert) oder des Interpreters (Dynamisch Typisiert). Sprachunterstützung durch implizite Typumwandlung. Thomas Schnieders Typisierung 8 / 24

Implizite Typumwandlung Implizite Typumwandlung Datentyp wird in einen anderen Datentypen umgewandelt Erscheint nicht im Quelltext int zu long in Java 1 int a = 3; 2 double b = a; // b hat jetzt den Wert 3.0 arithmetische Typumwandlung Java 1 int a = 3; 2 double b = 4.7; 3 double c = a + b; // b hat jetzt den Wert 7.7 double zu int C++ (Achtung: Informationsverlust) 1 double a = 3.3; 2 int b = a; // b hat jetzt den Wert 3 Thomas Schnieders Typisierung 9 / 24

Implizite Typumwandlung Typumwandlung im Funktionsaufruf in Java 1 public void func ( long a){... } // irgendeine Funktion 2 int b = 1000; 3 //... 4 func (b); // der Aufruf Thomas Schnieders Typisierung 10 / 24

Explizite Typumwandlung Explizite Typumwandlung Möglichkeit der expliziten Typumwandlung mittels Cast-Operator Syntax: (typ) Argument Unärer Operator mit hoher Präzedenz Der Wert des Ausdrucks wird in den angegebenen Typ konvertiert Thomas Schnieders Typisierung 11 / 24

Explizite Typumwandlung Explizite Typzuweisung in Java 1 int i = 1; 2 short s = ( short ) i; 1 int i = 1000000000; 2 short s = ( short ) i; In beiden Zuweisungen findet weder der Compiler noch die Laufzeitumgebung einen Fehler Umwandlung von int (4 byte) nach short (2 byte)[gü17] Die höherwertigen 2 byte werden abgeschnitten Dadurch nimmt s im 2. Beispiel den Wert -13.824 (Interpretation im 2er-Komplement) Typerweiterung: short zu int Typeinschränkung: int zu short Thomas Schnieders Typisierung 12 / 24

Explizite Typumwandlung Typumwandlung ist auch mit Referenztypen möglich z.b. im Rahmen von Vererbung oder der Implementation von Interfaces Beispiel: explizite Umwandlung in Java 1 Object o1 = new String (" test "); 2 String s = ( String ) o1; Umwandlung gelingt, da das von o1 referenzierte Objekt ein String ist [Str16] Thomas Schnieders Typisierung 13 / 24

Typisierung Einleitung: Unterteilung: Stark oder schwach typisiert Dynamisch oder statisch typisiert Java ist stark und statisch typisiert C++ ist schwach und statisch typisiert Python ist stark und dynamisch typisiert Thomas Schnieders Typisierung 14 / 24

Starke und schwache Typisierung Starke und schwache Typisierung Keine genaue Definition, aber verschiedenen Merkmale zur Stärke der Typisierung vorhanden: Nichtvorhandensein irgendwelcher Konvertierungsmethoden und fehlende Möglichkeit, das Typsystem zu umgehen Nur explizite Typumwandlungen möglich Typüberprüfung zur Übersetzungs- statt zur Laufzeit Implizite Typumwandlung nur zwischen ähnlichen Typen Generelle Unterscheidung zwischen Typen[Wik18] Allgemein: stark typisierte Sprachen prüfen die Typisierung strenger zur Compilezeit Thomas Schnieders Typisierung 15 / 24

Starke und schwache Typisierung Stark Typisiert sind z.b. Java oder Python Beispiel in Java 1 Object o1 = new String (" test "); 2 Object o2 = new Integer (1) ; 3 String s1 = o1; // Type mismatch 4 String s2 = ( String ) o1; 5 s1 = ( String ) o2; // Laufzeitfehler Thomas Schnieders Typisierung 16 / 24

Starke und schwache Typisierung Schwach typisiert sind z.b. C, C++, oder Assembler In C++ können z.b. Zeiger oder Zahlen implizit in boolsche Ausdrücke umgewandelt werden. Beispiel in C++ 1 MeineKlasse * meinobjekt = meineklasse (); 2 String * text = new String (" test "); 3 text = ( String *) meinobjekt ; Fehler wird nicht zur Laufzeit entdeckt, sondern erst wenn die Variable text im Programm aufgerufen wird. Thomas Schnieders Typisierung 17 / 24

Statische Typisierung Statische Typisierung Typ von Variablen und Parameter im Quelltext deklariert Variablen sind somit einem festen Typen zugeordnet Einschränkung in der Zuweisung von Objekten Überprüfung zur Compilezeit Statisch in Java 1 String foo = " pokipsi "; 2 char [] chararray = foo. tochararray (); 3 foo = new int [3]; // Fehler : Type mismatch Thomas Schnieders Typisierung 18 / 24

Statische Typisierung Vorteile: Überprüfung des Wertebereichs und der zulässigen Operationen zur Compilezeit übernommen, sodass kompilierte Anwendung besser optimiert werden können Programmcode ist lesbarer, da klar ist, welche Aufgabe eine Variable hat Fehlererkennung durch den Compiler [Str16, S. 96] Thomas Schnieders Typisierung 19 / 24

Dynamische Typisierung Dynamische Typisierung Variablen sind im Quellcode keine deklarierenden Typen zugeordnet Variable kann Referenzen auf beliebige Objekte aufnehmen Prüfung, ob Funktionen auf konkrete Objekte zulässig sind: dynamisch zur Laufzeit Thomas Schnieders Typisierung 20 / 24

Dynamische Typisierung Dynamisch: Variablenzuweisung in Python 1 a = 1 # a ist eine ganze Zahl 2 a = 2.0 # a ist jetzt eine Gleitkommazahl 3 a. upper () # Scheitert : a ist keine Zeichenkette 4 a # gibt den Wert von a aus 5 -> 2.0 6 a = " jetzt ist a ein String " 7 a += 1 # Scheitert : Inhalt von a ist String 8 a. upper () # Gibt den neuen String aus 9 -> ' JETZT IST A EIN STRING ' Funktionen in Python 1 def add (x,y): 2 return x + y Thomas Schnieders Typisierung 21 / 24

Dynamische Typisierung Vorteile: größere Flexibilität Variablen, Parameter und Ergebnisse von Funktionen benötigen keine deklarierenden Typen Funktionen können mit einer größeren Vielzahl von Objekten verwendet werden Notwendigkeit der explizite Typumwandlung entfällt Nachteile: Je nach Zustand des Programms können Funktionen Objekte unterschiedlichen Types zurückgeben. Probleme beim Programmieren In statisch typisierten Sprachen liefert eine Methode immer einen festen Typen zurück. Thomas Schnieders Typisierung 22 / 24

Zusammenfassung Was haben wir bis hierhin gelernt? Typen: Haben Wertebereich und zulässige Operationen Können umgewandelt werden Typsicherheit Muss sichergestellt sein, um lauffähige Software entwickeln zu können durch Typumwandlung: implizit (Sprachunterstützung) und explizit (durch Programmierer) Typisierung Stark oder schwach anhand von Merkmalen zur Typumwandlung Dynamisch oder statisch statisch: Typen im Quelltext angeben dynamisch: Typen nicht im Quelltext angegeben Thomas Schnieders Typisierung 23 / 24

Literatur [Gü17] [Str10] [Str16] [Ull18] Kai Günster. Einführung in Java. Rheinwerk Computing, Bonn, 2017. Bjarne Stroustrup. Einführung in die Programmierung mit C++. Pearson Studium, München, 2010. Bernhard Lahres; Gregor Raýman; Stefan Strich. Objektorientierte Programmierung. Rheinwerk Computing, Bonn, 2016. Christian Ullenboom. Java ist auch eine Insel. Rheinwerk Computing, Bonn, 2018. [Wik18] Wikipedia. Starke typisierung, 2018. [Online; accessed 16-April-2018]. Thomas Schnieders Typisierung 24 / 24