Spec# Einführung. Formale Software-Entwicklung Seminar SS 07 Universität Karlsruhe Hilal Akbaba



Ähnliche Dokumente
SEP 114. Design by Contract

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Objektorientierte Programmierung. Kapitel 12: Interfaces

Client-Server-Beziehungen

Design by Contract with JML

Grundlagen von Python

Tagesprogramm

Vererbung & Schnittstellen in C#

Prinzipien Objektorientierter Programmierung

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

Innere Klassen in Java

Klassenbeziehungen & Vererbung

Typumwandlungen bei Referenztypen

Objektorientierte Programmierung

Prof. Dr. Uwe Schmidt. 21. August Aufgaben zur Klausur Objektorientierte Programmierung im SS 2007 (IA 252)

Einführung in die Programmierung

Objektorientierte Programmierung

Javakurs zu Informatik I. Henning Heitkötter

3 Objektorientierte Konzepte in Java

C# im Vergleich zu Java

Client-Server Beziehungen

Programmieren in Java

Java: Vererbung. Teil 3: super()

Gliederung Grundlagen Schlüsselworte try-catch Fehlerobjekte Fehlerklassen Schlüsselwort finally Schlüsselwort throws selbst erstellte Exceptions

Software Engineering. Zur Architektur der Applikation Data Repository. Franz-Josef Elmer, Universität Basel, HS 2015

Nathan Burgener. Design by Contract. Modul SWE

Programmieren I. Strategie zum Entwurf von Klassen. Beispiele. Design von Klassen. Dr. Klaus Höppner. Beispiel: Bibliothek

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

Java Kurs für Anfänger Einheit 5 Methoden

Gebundene Typparameter

Übung 1 mit C# 6.0 MATTHIAS RONCORONI

Suchbäume. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Sichtbarkeit & statische Methoden. Einsatz von Sichtbarkeit Einsatz statischer Methoden programmatische Realisierung 2 Beispielaufgaben

7. Objektorientierte Softwareentwicklung/3. Informatik II für Verkehrsingenieure

Einführung in Javadoc

Vorkurs C++ Programmierung

Software Engineering Klassendiagramme Assoziationen

Große Übung Praktische Informatik 1

Algorithmen und Datenstrukturen

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005

Java Einführung Collections

5.5.8 Öffentliche und private Eigenschaften

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

Javadoc. Programmiermethodik. Eva Zangerle Universität Innsbruck

Javakurs 2013 Objektorientierung

Java Einführung Abstrakte Klassen und Interfaces

Kapitel 6. Vererbung

Testen mit JUnit. Motivation

5. Abstrakte Klassen. Beispiel (3) Abstrakte Klasse. Beispiel (2) Angenommen, wir wollen die folgende Klassenhierarchie implementieren:

Ersetzbarkeit, Client-Server Beziehungen

2. Programmierung in C

Klausur zur Einführung in die objektorientierte Programmierung mit Java

Auszug aus. C sharp. Galileo Computing. Ein Service von. Tutorial und Referenz. von Eric Gunnerson

Objektorientierte Programmierung für Anfänger am Beispiel PHP

BEISPIELKLAUSUR Softwareentwicklung:

OO Softwareentwicklung

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 14/15. Kapitel 11. Fehler und Ausnahmen 1

4 Vererbung, Polymorphie

5. Abstrakte Klassen

Klausur WS 2006/07 Programmiersprache Java Objektorientierte Programmierung II 15. März 2007

1. Sei der String s = new String( xyzzy ) gegeben. Welcher Aufruf verändert s?

Der lokale und verteilte Fall

GetName(), GetName(), GetGeschlecht() und AelterWerden().

Java Einführung Packages

Klassenentwurf. Wie schreiben wir Klassen, die leicht zu verstehen, wartbar und wiederverwendbar sind? Objektorientierte Programmierung mit Java

Selbststudium OOP4 Auftrag

Kapitel 6. Vererbung

Kapitel 6. Vererbung

Universität Karlsruhe (TH)

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = Euro ergeben.

Tutorium Rechnerorganisation

Methoden. von Objekten definiert werden, Methoden,, Zugriffsmethoden und Read-Only

Java Einführung Umsetzung von Beziehungen zwischen Klassen. Kapitel 7

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen:

Willkommen zur Vorlesung. Objektorientierte Programmierung Vertiefung - Java

Applet Firewall und Freigabe der Objekte

Factory Method (Virtual Constructor)

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

Software Engineering Klassendiagramme Einführung

Daniel Warneke Ein Vortrag im Rahmen des Proseminars Software Pioneers

Einführung in die Programmierung für Wirtschaftsinformatik

13 OOP MIT DELPHI. Records und Klassen Ein Vergleich

Studentische Lösung zum Übungsblatt Nr. 7

Einführung in die Programmierung für NF

License Management SDK

Modellierung und Programmierung 1

Softwaretests in Visual Studio 2010 Ultimate Vergleich mit Java-Testwerkzeugen. Alexander Schunk Marcel Teuber Henry Trobisch

XML-Namensräume. Marc Monecke

Grundbegriffe der Informatik

Das Liskovsche Substitutionsprinzip

Zählen von Objekten einer bestimmten Klasse

Objektorientierte Programmierung OOP

Arrays von Objekten. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Pragmatik von Programmiersprachen

Excel Funktionen durch eigene Funktionen erweitern.

Computeranwendung und Programmierung (CuP)

Abschnitt 9: Schnittstellen: Interfaces

C++ Grundlagen. ++ bedeutet Erweiterung zum Ansi C Standard. Hier wird eine Funktion eingeleitet

Einführung in die Java- Programmierung

Transkript:

Spec# Einführung Formale Software-Entwicklung Seminar SS 07 Universität Karlsruhe Hilal Akbaba

Inhalt Einführung in C# Das Spec# System Die Konstrukte Vererben der Verträge System Architektur

Einführung in C# Weiterentwicklung der Konzepte von C++, Java, Visual Basic, sowie Delphi Eine objekorientierte prozedurale Microsoft.NET Programmiersprache

Was ist das Spec# System? Die Erweiterung von der objektorientierten Sprache C# Der Spec# Compiler, der in Microsoft Visual Studio integriert ist Der statische Programm Verifizier (Boogie), der Spec# Programm auf Korrektheit prüft

Spec# Programmiersprache Erweiterung von C# mit: Nicht-Null-Typen Checked Exception Methodenverträge Objektinvarianten Abwärtskompatibilität Jedes Spec# Programm ohne Spezikationen ist äquivalent zu einem C# Programm Sprachkompatibilität Andere.NET Sprachen können Spec# Programme aufrufen

Spec# Konstrukte Nicht-Null-Typen Exceptions Methodenverträge Vorbedingung Nachbedingung Ausnahmebehaftete Nachbedingung Rahmenbedingung Klassenverträge Klasseninvariante Objektinvariante

Nicht-Null-Typen Jede referenzierte Typ T beinhaltet den Wert null Spec# Type T! kann nicht den Wert null annehmen Eingeführt: Um Null-Referenz zu beseitigen können benutzt werden für Instanzen: kein Zugriff vor dem Initialisieren (Beispiel folgt) Lokale Variablen Rückgaben Können nicht benutzt werden für Arrayelemente Sprachkompatibilität Virtuelle Maschine

Beispiel(1) class Student : Person { Transcript! t ; public Student (string name, EnrollmentInfo! ei) : base(name) { t = new Transcript(ei);

Beispiel(1) class Student : Person { Transcript! t ; public Student (string name, EnrollmentInfo! ei) : t(new Transcript(ei)), base(name) {

Beispiel(2) class MyLibrary { public static void Clear(int[]! xs) { for (int i = 0; i < xs.length; i++) { xs[i] = 0; class ClientCode { static void Main() { int[] xs = null; MyLibrary.Clear(xs); // Error: null is not a valid argument

Umgang mit Exceptions in C# Sie sind alle unchecked Exceptions Keine explizite Angabe an der Methodensignatur Unklarer Zustand von Aufrufer und seiner Datenstruktur

Fehlerursache Client Fehler: tritt auf, wenn die Methode auf unerlaubte Weise aufgerufen wird, z.b.:requiresviolationexc. Provider Fehler: unterteilt in Admissible Fehler: tritt auf, wenn die Methode auf ein Ereignis (z.b.: Eingabe) wartet Observed Program Fehler: tritt unabhängig von dem Programm auf, z.b.: ArrayIndexOutOfBounds oder StackOverflow

Exceptions in Spec # Gibt es zwei Arten von Exceptions: Checked Exception: z.b.: admissible Fehler muss in Methodensignatur deklariert werden Unchecked Exception: z.b.: observed Programm Fehler oder Client Fehler muss nicht in Methodensignatur deklariert werden Jede checked Exception ist ein Objekt von der abgeleiteten Laufzeitexception-Klasse Implementiert in Schnittstelle ICheckedException Wird in der Methode durch throws Menge angegeben

Checked Exception in Spec#(1) public String ReadMessage() throws SocketClosedException; Methode darf mit einer Exception SocketClosedException oder einer Exception eine Unterklasse von SocketClosedException terminieren Sicherer Zustand des Programms nach dem Terminieren

Checked Exception in Spec#(2) Auswerten des Typs von der Exception e kann in dem Fall fehlschlagen. public void MyExcept(){ Exception e = new CheckedException(); throw e; //checked Exception Wenn der Compiler nicht garantieren kann, dass die throws- Deklaration eingehalten wird, findet eine Laufzeit Prüfung statt. public void Cheater(){ Exception e = new CheckedException(); if (!(e is ICheckedException)) throw e; else { /* irgendein Fehler*/

Checked- und Unchecked Exception Jede checked Exception ist ein Unchecked Exception aber nicht umgekehrt. Spec# Exception ICheckedException CheckedException Checked exceptions Unchecked exceptions

Methodenverträge Vorbedingung: definiert Bedingung, welche vor dem Methodenaufruf gelten muss. Nachbedingung: definiert Bedingung, welche nach dem Methodenaufruf gelten muss. Ausnahmebehaftete Nachbedingung: definiert Bedingung, welche nach einer checked Exception gelten muss Rahmenbedingung: definiert Einschränkung, welche den Schreibzugriff auf Speicherstellen begrenzt

Vorbedingung(1) wird durch requires gekennzeichnet class ArrayList{ int count; // Anzahl der Elemente bool IsReadOnly, IsFixedSize;... public void Insert(int index, object value) requires 0<=index && index<=count; requires!isreadonly &&!IsFixedSize; {...

Vorbedingung mit Exception(2) class ArrayList{... public void Insert(int index, object value) requires 0<=index && index<=count; otherwise ArgumentOutOfRangeException; requires!isreadonly &&!IsFixedSize; otherwise NotSupportException; {... Syntax: requires Bedingung [otherwise unchecked Exception];

Nachbedingung Wird durch ensures gekennzeichnet ensures count == old(count) + 1; ensures value == this[index ]; ensures Forall{int i in 0 : index ; old(this[i]) == this[i]; ensures Forall{int i in index : old(count); old(this[i]) == this[i + 1]; Syntax: Forall Ouantor Index i bei unterer Grenze eingeschlossen, oberer ausgeschlossen old(x) ruft den Wert beim Methodeneintritt von x ab

Ausnahmebehaftete Nachbedingung versichert den Zustand des Objekts (in dem Fall a), falls EndOfFileException geworfen wird void ReadToken(ArrayList! a) throws EndOfFileException ensures a.count ==old(a.count);

Rahmenbedingung class Konto{ int kontostand; int kontonr;... public void einzahlen(int betrag) modifies kontostand; {... Syntax: modifies Liste der Variable mit Schreibrecht;

Rahmenbedingung class Konto{ int kontostand; Sollte jeder meinen Kontostand wissen? int kontonr;... public void einzahlen(int betrag) modifies kontostand; {... Syntax: modifies Liste der Variable mit Schreibrecht;

Rahmenbedingung class Konto{ private int kontostand; private int kontonr;... public void einzahlen(int betrag) modifies kontostand; {... Syntax: modifies Liste der Variable mit Schreibrecht

Rahmenbedingung class Konto{ private int kontostand; private int kontonr;... public void einzahlen(int betrag) modifies kontostand; Widerspruch zur {... Datenkapselung(Geheimnisprinzip) Syntax: modifies Liste der Variable mit Schreibrecht

Rahmenbedingung class Konto{ private int kontostand; private int kontonr;... public void einzahlen(int betrag) modifies this^ Konto; {... Syntax: modifies Liste der Variable mit Schreibrecht;

Klassenverträge Objektinvariante Bedingung, die in jedem Zustand aller Objekte gelten muss Klasseninvariante Bedingung, die für Klassenvariablen gelten muss

Objektinvariante class StudentenAusweisVerwaltung{ Student[]! Students; bool[]! Verschollen; invariant Students.Length==Verschollen.Length;... Syntax: invariant Bedingung;

Objektinvariante(2) class T { private int x, y; invariant 0 <= x && x< y ; public T( ){ x = 0 ; y = 1 ; private void M( ){ x = x + 3 ; y = 4 * y ;

Objektinvariante(2) class T { private int x, y; invariant 0 <=x && x< y ; public T( ){ x= 0 ; y= 1 ; private void M( ){ x= x + 3 ; y= 4 * y ; Beim ersten Aufruf ist x=3 und y=1, also gilt die Invariante nicht

Objektinvariante(2) class T { private int x, y; invariant 0 <=x && x< y ; public T( ){ x= 0 ; y= 1 ; private void M( ){ expose(this){ x= x + 3 ; y= 4 y ; erzielt: Exklusiven Zugriff auf das Objekt Keine Invariantenprüfung innerhalb des expose Blocks Nebenbedingung: expose(this) implizit bei public Methoden immer da Mehrfaches expose auf das selbe Objekt verboten Eine public Methode darf eine andere public Methode von der selben Klasse nicht aufrufen, wenn auf das selbe Objekt zugegriffen wird

Vererben der Verträge Methodenverträge werden vererbt Zusätzliche Nachbedingungen können hinzugefügt werden Eine Veränderung der Vorbedingung ist nicht erlaubt Methoden eines Interfaces können auch Verträge besitzen Mehrfachvererbung können Probleme verursachen Vorbedingungen müssen gleich sein

System Architektur Es gibt drei Prüstufen: 1.Stufe: wird durch statischen Typprüfer angeboten, was als ein Teil der Compiler läuft 2.Stufe: Laufzeitprüfung, die durch den Compiler unterstützt wird. Der Compiler: Produziert nicht nur ausführbaren Code, sondern bewahrt auch alle Verträge im compilerten Code Werden manche Verträge (z.b.:vor und Nachbedingungen) geprüft (auf Wusch) können die Laufzeittests abgeschaltet werden (aus Effizienzgründen) 3.Stufe: wird durch den statische Verifizierer angeboten, wandelt das Programm in eine Zwischensprache BoogiePL um beweist anhand der Formel, die aus BoogiePL ensteht, die Korrektheit, falls es für Boogie möglich ist

Zusammenfassung Spec# Sprache: ist in Entwicklungsphase typsicher abwärtskompatibel werden Fehler leichter gefunden

Vielen Dank für die Aufmerksamkeit...