Informatik I Das Typsystem (am Bsp. Python vs. C++)

Ähnliche Dokumente
Grundlagen der Programmierung in C++ Arrays und Strings, Teil 1

Java Einführung VARIABLEN und DATENTYPEN Kapitel 2

Funktionale Programmiersprachen

Unterlagen. CPP-Uebungen-08/

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

Kapitel 4. Programmierkurs. Datentypen. Arten von Datentypen. Wiederholung Kapitel 4. Birgit Engels, Anna Schulze WS 07/08

Variablen. CoMa-Übung VIII TU Berlin. CoMa-Übung VIII (TU Berlin) Variablen / 15

3. Java - Sprachkonstrukte I

Crashkurs C++ - Teil 1

Java I Vorlesung Imperatives Programmieren

Bru ckenkurs Programmieren

Variablen, Konstanten und Datentypen

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

Die Programmiersprache C Eine Einführung

Polymorphie Begriffsklärung und Anwendung

Informationsverarbeitung im Bauwesen

Einführung in die C-Programmierung

RO-Tutorien 3 / 6 / 12

Grundlagen. Die Komponenten eines C Programms. Das erste Programm

Grundlagen der Programmierung in C++ Zusammengesetzte Typen

Scala. Funktionale (Zustandslose) Objekte

Kapitel 3: Variablen

RO-Tutorien 15 und 16

7 Funktionen. 7.1 Definition. Prototyp-Syntax: {Speicherklasse} {Typ} Name ({formale Parameter});

Grundlagen der Informatik 2. Operatoren

JAVA-Datentypen und deren Wertebereich

Grundlagen der OO- Programmierung in C#

Grundlagen der Programmierung in C Basics

Funktionale Programmierung Grundlegende Datentypen

6. Grundlagen der Programmierung

Einführung in die Programmiersprache C

Einführung in C. EDV1-04C-Einführung 1

Programmierkurs Python I

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

Lösung der OOP-Prüfung WS12/13

2.5 Primitive Datentypen

Grundlagen von C# - 1

Einführung in die STL

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

5.1 Mehr Basistypen. (Wie viele Werte kann man mit n Bit darstellen?)

Objektorientierte Programmierung

Repetitorium Informatik (Java)

Grundlagen der Programmierung in C Funktionen

OCP Java SE 8. Lambda

F Zeiger, Felder und Strukturen in C

Algorithmen und Programmieren II Einführung in Python (Teil 2)

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 12/13. Kapitel 3. Grunddatentypen, Ausdrücke und Variable

Programmierkurs C++ Variablen und Datentypen

3.2 Datentypen und Methoden

Einführung in die Programmierung mit VBA

Projekt 3 Variablen und Operatoren

Einführung in die Programmiersprache C

Algorithmen und Datenstrukturen

7. Einführung in C++ Programmieren / Algorithmen und Datenstrukturen 1 Prof. Dr. Bernhard Humm FB Informatik, Hochschule Darmstadt

Einführung in die C++ Programmierung für Ingenieure

Die einfachsten Anweisungen

Grundlagen der Programmierung in C++ Kontrollstrukturen

Kapitel 2: Python: Ausdrücke und Typen. Grundlagen der Programmierung 1. Holger Karl. Wintersemester 2016/2017. Inhaltsverzeichnis 1

Prof. Dr. Oliver Haase Karl Martin Kern Achim Bitzer. Programmiertechnik Operatoren, Kommentare, Ein-/Ausgabe

C- Kurs 03 Ausdrücke und Operatoren

Java Einführung Methoden. Kapitel 6

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

3.8 Objekttypen und Arrays. Wir werden uns in diesem Kapitel näher mit den Objekttypen in Java beschäftigen.

2 Eine einfache Programmiersprache

Polymorphismus 179. Function.h. #include <string>

Funktionales C++ zum Ersten

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 29

Variablen. Deklaration: «Datentyp» «Variablenname» Datentyp bestimmt Größe in Bytes: sizeof Beispiel: long int v; Größe: 4 Bytes

2 Eine einfache Programmiersprache

1 Polymorphie (Vielgestaltigkeit)

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

Programmierkurs C/C++

Grundlagen der Programmierung

Programmiertechnik Skalare Typen,Variablen, Zuweisungen

Objektorientierte Programmierung mit C++ SS 2007

Wie kann man es verhindern das Rad immer wieder erneut erfinden zu müssen?

Programmieren in C++ Templates

Grundlagen der Programmierung

JAVA BASICS. 2. Primitive Datentypen. 1. Warum Java? a) Boolean (logische Werte wahr & falsch)

Skriptsprachen: Python

Weitere Operatoren und Datentypen. Speicherklassen. Speicherklassen: static

Algorithmen zur Datenanalyse in C++

1. Referenzdatentypen: Felder und Strings. Referenz- vs. einfache Datentypen. Rückblick: Einfache Datentypen (1) 4711 r

1. Referenzdatentypen: Felder und Strings

Transkript:

Wozu Typen? Informatik I Das Typsystem (am Bsp. Python vs. C++) Sicherheit der Software (Internet, Atomanlagen, etc.) Wird die Platte formatiert, wenn man sich eine Webseite mit einem JPEG-Bild im Browser ansieht? G. Zachmann Clausthal University, Germany zach@in.tu-clausthal.de G. Zachmann Informatik 1 - WS 05/06 Typsysteme 2 Definitionen Ziel: Semantische Bedeutung einem Speicherblock zuordnen Konzept des Typs bzw. Typsystems 3 Definitionen von Typ : Denotational: Typ := Menge von Werten. Konstruktiv: Typ := - entweder: primitver, eingebauter Typ (int, float, ), - oder: zusammengesetzt aus anderen Typen. Abstrakt: Typ := Interface, bestehend aus Menge von Operationen (Funktionen, Operatoren), die auf Werte dieses Typs angewendet werden können Type Error := Operation (Operand / Funktion) ist für Werte (Variablen, Ausdrücke, Rückgabewerte) nicht definiert Zahl / Uhrzeit Type Checking := Type-Errors finden, dann Fehlermeldung ausgeben oder auflösen Typen zweier Operanden müssen gleich sein G. Zachmann Informatik 1 - WS 05/06 Typsysteme 3 G. Zachmann Informatik 1 - WS 05/06 Typsysteme 4 1

2 Arten von Type-Checking Static Typing (C++) Static type checking / statically typed := type checking zur Compile-Zeit durch den Compiler Dynamic type checking / dynamically typed := Type checking zur Laufzeit durch den Interpreter (bzw. die Virtual Machine) Type Inference := Typ der Variablen wird aus dem Kontext hergeleitet; Typen dürfen unvollständig sein. Konsequenz: Compiler muß zu jeder Zeit Typ eines Wertes im Speicher kennen Relativ einfach machbar, wenn Variablen einem Speicherblock fest zugeordnet sind Typ(Variable) = Typ(Speicherbereich) Bessere Performance (Compiler generiert sofort richtigen Code) Konsequenz für die Sprache bzgl. Variablen: Variable = unveränderliches Triple( Name, Typ, Speicherbereich ) Variablen müssen vom Programmierer vorab deklariert werden Syntax in C++: Beispiele: Type Variable; int i; // the variable 'i' float f1, f2; char c1, // comment c2; // comment G. Zachmann Informatik 1 - WS 05/06 Typsysteme 5 G. Zachmann Informatik 1 - WS 05/06 Typsysteme 6 Dynamic Typing (Python) float i = 3.0; i = 1; // überschr. 3.0 i = "hello"; // error int i = 1; // error i 3.0 1.0 Problem: Typ von Speicherblock wird durch Typ der darübergelegten Variable bestimmt! Konsequenzen: Typ von Variable/Wert wird zur Laufzeit (jedesmal) überprüft Werte im Speicher müssen unveränderlichen Type-Tag haben Variable muß nicht an festen Speicherbereich gebunden werden Welcher Operator, wird jeweils zur Laufzeit entschieden "Generic Programming" wird einfacher Variablen müssen nicht deklariert werden Wesentlich kürzere Compile-Zeiten, Performance penalty Debugger mit höherer Funktionalität ("program in the debugger") Konsequenz für die Sprache bzgl. Variablen: Variable = veränderliches Paar( Name, Speicherbereich ) Variablen müssen vom Programmierer nicht deklariert werden G. Zachmann Informatik 1 - WS 05/06 Typsysteme 7 G. Zachmann Informatik 1 - WS 05/06 Typsysteme 8 2

Ändern eines Integers Beispiele: Achtung: manche Operationen erzeugen eine Kopie! i = 3.0 i = 1; // bindet i neu i = "hello"; // dito list = [1,2,3] listref = list listcopy = list[:] list.append( 4 ) Zuordnung zwischen Variablenname list listref listcopy und Wert/Objekt im Speicher heißt auch Binding 3.0 i 1 "hello" list object [1, 2, 3, 3] 4] list object [1, 2, 3] a = 1 a 1 a b = a b a 1 2 a = a+1 b 1 Analog bei Listen neues int Object erstellt durch Addieren des Operators (1+1) alte Referenz gelöscht durch Zuweisung (a=...) G. Zachmann Informatik 1 - WS 05/06 Typsysteme 9 G. Zachmann Informatik 1 - WS 05/06 Typsysteme 10 Strongly Typed / Weakly Typed Beispiele Achtung: keine einheitliche und strenge Definition 1. Sprache ist strongly typed (stark typisiert), wenn es schwierig/unmöglich ist, einen Speicherblock (der ein Objekt enthält) als anderen Typ zu interpretieren (als den vom Objekt vorgegebenen). Uminterpretierung funktioniert nur mit Casts und Pointern, oder Unions 2. Sprache ist strongly typed (stark typisiert), wenn es wenig automatische Konvertierung (coercion) für die eingebauten Operatoren und Typen gibt. Insbesondere: wenn es keine Coercions gibt, die Information verlieren. Def. 1 ist sinnvoller, Def. 2 häufig bei Programmierern Verlust von Information in C++ (Definition 2): int i = 3.0; In C++: liefert nur Warning Uminterpretierung in C++ (Definition 1): float f = 3; printf( "%d\n", f ); In C++: nur Warning i = 3.0 In Python: Konst. ist Float, i ist nur Name, der an Konst. gebunden wird f = 3.0 print "%d" % f In Python: Konvertierung G. Zachmann Informatik 1 - WS 05/06 Typsysteme 11 G. Zachmann Informatik 1 - WS 05/06 Typsysteme 12 3

Typing-Quadrant Mit OO-Sprachen kann man die Stärke der Typisierung gemäß Definition 2 (fast) beliebig weit "aufweichen". Bsp.: Resultat der automatischen Konvertierung nicht klar: string s = "blub"; s += 3.1415; // gültig s = 3.1415; // dito s = "12" s += 1 # Fehlermeldung Orthogonalität: Achtung: static/dynamic typing und strong/weak typing sind orthogonal zueinader!! static C C++ * Java Haskell weak strong In einer hypothetischen, eigenen String-Klasse in C++ Mit eingebautem String-Typ in Python *) ohne C-style casts und ohne reinterpret_cast dynamic Python Häufig falscher Sprachgebrauch! ("strong" = "static und strong", oder gar: "strong" = "static") Achtung: weak strong ist eher Kontinuum G. Zachmann Informatik 1 - WS 05/06 Typsysteme 13 G. Zachmann Informatik 1 - WS 05/06 Typsysteme 14 Hierarchie bzgl. Typisierung Exkurs: Inferred Typing untyped Beispiele: Assembler, (Perl) Declared types Beispiele: C++, Java, Pascal Programmiersprachen Statically typed typed Inferred types Beispiele: ML, Haskell Dynamically typed Beispiele: Python, Java Type-Deklarationen sind lästig unnötig schränken ein Idee: der Compiler kann den Typ (fast immer) folgern Sehr simple Form von Type-Inference in Python: x = 1 # 1 wird als int interpr. x = 1.0 # 1.0 wird als float interpr. Und in C++: float f = 3 / 2; Compiler schließt, wir wollten Integer-Division haben G. Zachmann Informatik 1 - WS 05/06 Typsysteme 15 G. Zachmann Informatik 1 - WS 05/06 Typsysteme 17 4

Etwas komplexeres Beispiel Type-Inference in einer Funktion: def fact( n ): if n == 0: return 1 else: return n * fact(n-1) Angenommen, Python wäre eine statisch typisierte Sprache: Test 'n == 0' n muß int sein, Zeile 'return 1' fact muß Funktion sein, die int liefert Zusammen fact muß Funktion von int nach int sein letzte Zeile: klassisches, statisches Type-Checking Macht nur für statisch typisierte Sprachen Sinn Schlußfolgerung 1.x.empty() x muß Sequenztyp sein, da empty() nur auf solchen definiert ist def mkpairs(x): if x.empty(): return x else: xx = [x[0], x[0]] xx.append( mkpairs(x[1:]) ) return xx Liefert neue Sequenz bestehend aus den Elementen 1- von Sequenz x 2.return x Funktion mkpairs muß Typ Sequenz Sequenz haben 3. Rest ist Type Checking G. Zachmann Informatik 1 - WS 05/06 Typsysteme 18 G. Zachmann Informatik 1 - WS 05/06 Typsysteme 19 Konvertierungen Beispiel wo Inferenz nicht so ohne weiteres funktioniert: Multiplikation verlangt, daß x vom typ Float oder Int ist Also sqr:float Float oder sqr:int Int Nicht definierter Typ sqr kann auch kein parametrisierter Typ sein, also vom Typ T T, da ja nicht jeder beliebige Typ T erlaubt ist Lösung: mehrere, überladene Funktionen erzeugen, falls benötigt (à la Templates in C++) def sqr(x): return x*x Absolutes Strong Typing gemäß Def. 2 nur Operanden genau gleichen Typs erlaubt Automatische Konvertierungen im Typsystem: Begriffe: automatic conversion, coercion, implicit cast, promotion Definition: coercion := autom. Konvertierung des Typs eines Ausdruckes zu dem Typ, der durch den Kontext benötigt wird. Sprachgebrauch: int i = 1; unsigned int u = i + 1; // error float f = u + 1.0; // error - coercion bei built-in Types - implicit cast bei user-defined Types (Klassen) G. Zachmann Informatik 1 - WS 05/06 Typsysteme 20 G. Zachmann Informatik 1 - WS 05/06 Typsysteme 21 5

Widening: Coercion vom "kleineren" Typ in den "größeren" Typ. "kleinerer" Typ = kleinerer Wertebereich int i = 1; unsigned int u = i + 1; // 1 1u float f = u + 1.0f; // 1u 1.0f Promotion-Hierarchie, definiert im C++-Standard: bool char int unsigned int long int float double long double Narrowing: Coercion vom "größeren" in den "kleineren" Typ Gefährlich: was passiert mit Werten außerhalb des kleineren Wertebereichs?! Achtung: Coercion ist "lazy", d.h., so spät wie möglich, von innen nach außen! float f = 1E30; int j = f; char c = j; float f = 1/2; // f == 0.0! G. Zachmann Informatik 1 - WS 05/06 Typsysteme 22 G. Zachmann Informatik 1 - WS 05/06 Typsysteme 23 "Typarithmetik" in Ausdrücken Funktionen eines Typsystems Zur Compile-Zeit muß der Baum eines Ausdruckes mit Typinformationen annotiert werden Zum Type-Checking Um die richtigen Assembler-Befehle zu erzeugen + float float int 1.0 1 sin float Konv. float / int 1 float Pi 2.0 2 float int Sicherheit: ungültige Operationen verhindern "hello world" / 3.0 Optimierung Dokumentation: ein gut gewählter Typname ist genauso wichtig wie eine ausührliche Beschreibung, wozu der Typ verwendet wird! Abstraktion typedef NumSecondsAfter1970 unsigned int; struct ComplexNumber { float r, i; }; Wesentlicher Bestandteil jedes APIs (von z.b. Libraries) 1 + sin( Pi / 2 ) Konv. 2 int G. Zachmann Informatik 1 - WS 05/06 Typsysteme 24 G. Zachmann Informatik 1 - WS 05/06 Typsysteme 25 6

Charakteristika von Programmiersprachen Statisch typisiert dynamisch typisiert Stark typisiert schwach typisiert Mit type inference mit deklarierten Typen Low level high level Assembler Forth C C++ Python low high Objekt-orientierte / funktionale / logische Sprache Compiliert interpretiert (Skriptsprache) G. Zachmann Informatik 1 - WS 05/06 Typsysteme 26 7