• Shuffle
    Toggle On
    Toggle Off
  • Alphabetize
    Toggle On
    Toggle Off
  • Front First
    Toggle On
    Toggle Off
  • Both Sides
    Toggle On
    Toggle Off
  • Read
    Toggle On
    Toggle Off
Reading...
Front

Card Range To Study

through

image

Play button

image

Play button

image

Progress

1/68

Click to flip

Use LEFT and RIGHT arrow keys to navigate between flashcards;

Use UP and DOWN arrow keys to flip the card;

H to show hint;

A reads text to speech;

68 Cards in this Set

  • Front
  • Back

Was ist ein Typ?

* Primitiver Begriff, vergleichbar mit dem Begriff Menge in der Mengenlehre

Was sind Intension und Extension eines Typs?

* Intension: Definition des Typ
* Extension: Wertebereich

Aus welchen Gründen typisiert man Programmelemente?

* Typisierung regelt das Speicher-Layout
* Typisierung erlaubt die effizientere Ausführung eines Programms
* Erhöht die Lesbarkeit eines Programms
* Ermöglicht das automatische Finden von logischen Fehlern
* Modularisierung

Inwiefern regelt Typisierung das Speicher-Layout?

* Compiler kann anhand des Typs bestimmen, wie viel Speicher er für eine Variable reservieren muss.
* Dies ist relevant für Variablen mit Wertsemantik.
* Daher für OOP nur von untergeordneter Bedeutung.

Warum sorgt Typisierung für effizientere Programmausführung?

Bestimmte Optimierungen lassen sich durchführen, wenn man weiß, dass die Werte einer Variable immer von demselben Typ und damit aus demselben Wertebereich sind.


Beispiel:


Wenn die Variable x nur ganze Zahlen enthält, kann der Compiler bei x := x + 1 die Ganzzahladdition oder die Inkrement-Anweisung des Prozessors verwenden und muss vor der Addition nicht erst prüfen, um welchen Typ es sich bei x handelt. Je nachdem, um welchen Typ es sich handelt, muss er dann noch zu den entsprechenden Operatoren verzweigen.

Warum erhöht Typisierung die Lesbarkeit eines Programms?

Durch Typisierung erhält man an der Stelle der Deklaration bereits einen Hinweis, für welche Menge von Werten eine Variable steht. Dadurch benötigt man bestimmte Kommentare nicht und das Programm wird auch bei schlechten Variablennamen etwas besser lesbar.

Warum ermöglicht Typisierung das automatische Finden von Fehlern?

* Nur durch ein gewisses Maß an Redundanz können logische Widersprüche entstehen, die das Auffinden von Fehlern ermöglichen.
* Die Verknüpfung von deklarierten Elementen mit Typen erlaubt genau diese Angabe von redundanten Informationen.
* Dies verlangt jedoch vermehrte Denk- und Schreibarbeit, die bei fehlerfreien Programmen unnötig wäre, aber kein Programm ist grundsätzlich fehlerfrei.
* Und Typisierung ersetzt auf diese Art bestimmte u.U. aufwändige Tests und erlaubt das leichtere Auffinden bestimmter Fehler.

Warum hilft Typisierung bei der Modularisierung?

Modularisierung entsteht, wenn ein Typ eine Schnittstelle oder ein Interface ist.

Was sind Typfehler?

* Ein großer Teil logischer Programmierfehler kann daran erkannt werden, dass eine Variable einen Wert bekommt, den sie eigentlich nicht haben dürfte.
* Beispiel: Eine für Zahlen gedachte Variable erhält eine Zeichenkette.
* Eine solch fehlbelegte Variable kann einen Ausdruck erzeugen, der nicht ausgewertet werden kann und somit zu einem Programmabbruch führen kann.
* Ein solcher Fehler ist ein Typfehler.
* Typfehler müssen keinen Programmabbruch erzeugen, sondern im schlimmsten Fall läuft das Programm weiter und es kommt nur zu falschen Ergebnissen.

Was sind Invarianten?

Invarianten beschränken die Menge der zulässigen Werte einer Variable. Es muss darauf geachtet werden, dass Typinvarianten eingehalten werden.

Was sind Typannotationen?

Eine Möglichkeit, Typinvarianten zu überwachen. Sie stellen die Verbindung einer Variable mit einem Typ dar, wobei der Typ die Menge von Werten festlegt, die die Variable ausschließlich haben darf. Typannotation erfolgt bei der Variablendeklaration; in nicht typisierten Sprachen kann sie auch hergeleitet werden und ist damit implizit.

Wann ist ein Programm typkorrekt?

Ein Programm ist typkorrekt, wenn alle Typinvarianten erfüllt werden.

Was sind semantische Fehler?

* Logische Fehler, die sich in unzulässigen Typzuweisungen ausdrücken sind semantische Fehler in Sprachen, die durch ihr Typsystem Typkorrektheit festzustellen erlauben.
* Das liegt daran, weil der Inhalt eines Elements nicht seiner intendierten Bedeutung entspricht.
* Die Semantik ist zweimal spezifiziert: in Form des Elementtyps und in Form seiner tatsächlichen Verwendung.
* Wenn sich aus beiden ein Widerspruch ableiten lässt, muss eine von beiden falsch sein.

Was muss ein Typsystem tun, um Freiheit von semantischen Fehler zu garantieren?

Es muss alle Wertzuweisungen in einem Programm überprüfen. Dazu zählen auch die impliziten Zuweisungen bei Methodenaufrufen, die, auch wegen des dynamischen Bindens, nicht immer offensichtlich sind. Zuweisungen und Methodenaufrufe, die nicht zu typinkorrekten Programmen führen, heißen zulässig.

Ist die Typüberprüfung in Smalltalk dynamisch?

Nein, sie ist nicht dynamisch, da Typfehler erst im letztmöglichen Moment offenbar werden, nämlich wenn auf einer Variable eine Methode aufgerufen werden soll, die für das Objekt, auf das die Variable verweist, gar nicht definiert ist.

Was ist statische Typprüfung?

* Soll die Typkorrektheit zur Übersetzungszeit gewährleisten.
* Typüberprüfung ist damit Aufgabe des Compilers und nicht Aufgabe des Laufzeitsystem oder des Programmierers, wie bei der dynamischen Typüberprüfung.
* Damit wird der Beweis geführt, dass bei keiner Programmausführung eine Typinvariante verletzt wird.

Welche Nachteile hat statische Typprüfung?

* Allerdings weist statische Typüberprüfung auch immer Programme zurück, die korrekt und sinnvoll sind.
* Bei höherer Genauigkeit wird das Typsystem immer aufwändiger und schwieriger zu benutzen.

Werden statische oder dynamische Typüberprüfung in der Praxis verwendet?

* Gute Typsysteme gehen Kompromisse ein.
* Eine statische Komponente findet möglichst viele Fehler, ohne den Programmierer zu sehr einzuschränken.
* Dynamische Komponente erledigt den Rest.

Inwiefern geht C++ keinen Kompromiss bzgl. der statischen und dynamischen Typprüfung ein?

* Ausnahme: C++, denn hier wird zugunsten der Performanz auf eine dynamische Komponente vollständig verzichtet.
* Da diese aber nicht alle Fehler abdeckt, sind C++-Programme nicht automatisch typkorrekt.

Was ist die Definition einer Variablen?

* Dem Bezeichner wird zugeordnet, wofür er steht.
* Bei einer Variable ist das eine bestimmte Stelle im Speicher, die genügend Platz bietet, um den Wert der Variablen aufzunehmen.
* Deklaration und Definition erfolgen oft in einem Ausdruck.

Was sind Definition und Deklaration bei Methoden?

* Definition: Methodenrumpf, also die Folge der Anweisungen, die mit der Methode verbunden sind und beim Aufruf aufgerufen werden sollen.
* Deklaration: Bekanntgebung des Namens und der formalen Parameter der Methode.

Was definiert in Smalltalk den Typ eines Objekts?

- Die Menge der Methoden, das Protokoll.


- Das Protokoll definiert einen Typ, nämlich die Menge der Objekte, die über dieses Protokoll verfügen.


- Wenn ein Programm typkorrekt und eine Variable mit einem Protokoll als Typ typisiert ist, ist garantiert, dass jede Methode, die im Protokoll enthalten ist und die auf der Variable aufgerufen wird, für den Inhalt der Variable definiert ist, also für das referenzierte Objekt.

Was ist ein Typkonstruktor in Smalltalk?

* Die Protokollbildung ist das einzige Sprachkonstrukt in Smalltalk, mit dem man neue Typen definieren kann.
* Andere Sprachen sehen weitere Typkonstruktoren vor wie z.B. enum in Java

Was ist Zuweisungskompatibilität?

* Wenn zwei Typen zuweisungskompatibel sind, ist eine entsprechende Zuweisung zulässig
* sie führt dann zu keiner Verletzung einer Typinvariante.
* Es muss sich allerdings nicht um identische Typen handeln.
* transitive Eigenschaft

Was ist Typäquivalenz?

* Typen sind gleich.
* Es kann aber auch sein, dass sich Typen bis auf die Namen gleichen, dass z.B. in Strongtalk die die Typdefinition ausmachenden Methoden gleich sind.

Was ist der Unterschied zwischen nominaler und struktureller Typäquivalenz?


* Nominale: bezieht sich auf einen Namen (Namensäquivalenz)
* Strukturäquivalenz: Typen müssen sich in ihrer Struktur, aber nicht in ihrem Namen gleichen.

Welche formalen Eigenschaften hat die Typäquivalenz?

* symmetrisch: A äquivalent zu B --> B äquivalent zu A
* Reflexivität: Jeder Typ ist äquivalent zu sich selbst
* Transitiv: A äquivalent zu B, B äquivalent zu C (in der gleichen Art, also nominal oder strukturell), dann ist A äquivalent zu C

Wie wird Strukturäquivalenz festgestellt?

* Die Definition der beteiligten Typen wird rekursiv expandiert.
* Die in der Typdefinition vorkommenden Namen anderer Typen werden durch ihre Struktur ersetzt.
* Namen haben nur die Funktion der abkürzenden Schreibweise.
* Namensäquivalenz impliziert Strukturäquivalenz, aber nicht umgekehrt.
* Namensäquivalenz ist das stärkere Konzept.

Welche Bedeutung hat die Strukturäquivalenz?

* Als Bedingung der Zuweisungskompatibilität reicht Strukturäquivalenz aus, um Typfehler zu verhindern, also logische und Laufzeitfehler, die auf der Annahme einer nicht vorliegenden Eigenschaft (Methode) bei einem Wert einer Variable basieren.
* Sie garantiert, dass die Methoden eines Programms auf den jeweiligen Empfängerobjekten mit den geforderten Parameterobjekten auch durchgeführt werden können.

Was ist Type branding?

* Strukturäquivalenz ist eine rein syntaktische Bedingung.
* Typen, die inhaltlich nichts miteinander zu tun haben, können zuweisungskompatibel sein.
* Semantische Fehler sind noch immer möglich.
* In Sprachen mit Strukturäquivalenz wird gelegentlich jedem Typ eine für ihn charakteristische Methode exklusiv zugeordnet, so dass er mit keinem anderen Typ mehr strukturäquivalent ist (type branding).

Was ist Namensäquivalenz?

* Typen können neben ihrer formalen Funktion, dem Vermeiden von Fehlern, noch eine inhaltliche Filterfunktion ausüben.
* Dies setzt voraus, dass dem Typ eine Bedeutung beigemessen werden kann, die über seine bloße Struktur hinausgeht.
* Dies geschieht über Benennung des Typs, die gepaart mit Namensäquivalenz als Bedingung verlangt, dass einer Variable nur Werte gleicher Bedeutung zugewiesen werden können.

Welchen Nachteil hat Namensäquivalenz?

* Setzt voraus, dass getrennt voneinander entwickelte Programme zumindest an ihren Schnittstellen dieselben Typen verwenden.
* Das kann z.B. bei Webservices ein großes Hindernis sein.

Welche Vor- und Nachteile hat Strukturäquivalenz und wie kann man den Nachteil lösen?

* Strukturäquivalenz bietet mehr Flexibilität, da sie die Äquivalenz von Typen erlaubt, bei deren Definition man nichts von dem anderen wusste.
* Nachteil: Zufällig strukturelle Übereinstimmungen können zu einer Äquivalenz führen, die gar nicht vorgesehen ist.
* Type branding führt eine optionale Namensäquivalenz durch die Hintertür ein.

Was ist Typerweiterung?

* Der Typ auf der rechten Seite einer Zuweisung darf eine Erweiterung um zusätzliche Methoden dessen auf der linken Seite sein
* Der erweiternde Typ wird relativ zu dem bereits bestehenden, dem erweiterten Typ, definiert.
* Methodendeklaration wird an den erweiternden Typen vererbt, dieser braucht sie nicht noch einmal zu wiederholen.

Wann nennt man einen Typ typkonform zu einem anderen?

Einen Typ, dessen Definition alle deklarierten Elemente der Definition eines anderen Typen enthält, nennt man typkonform. In vielen Sprachen eine notwendige und hinreichende Voraussetzung für die Zuweisungskompatibilität.

Welche Varianten der Typkonformität gibt es?

* Strukturelle Typkonformität
* Nominale Typkonformität
* Zur strukturellen Typkonformität reicht es aus, wenn der konforme Typ alle Elemente des Typs enthält, zu dem er konform sein soll.
* Für die nominale Typkonformität muss explizit und zusätzlich die Erweiterung eines anderen Typs angegeben werden.

Welche Nachteile hat die strukturelle Typkonformität gegenüber der nominalen?

* Ein strukturelles Typsystem, vor allem wenn es dem Programmierer nicht die eigene Benennung von Typen ermöglicht, erlaubt es nicht dem Programmierer nicht, die Absicht und damit die intendierte Semantik auszudrücken.
* Das macht Programme schwerer zu lesen und zu debuggen.
* Fehler, die eine strukturelle Typprüfung produziert, weisen oft nicht auf eine eigentliche Fehlerquelle hin.

Was ist Typeinschränkung?

* Ein Typ wird auf Basis eines anderen durch Löschen von Methoden definiert.
* Die in einer Deklaration verwendeten Typen können durch andere, speziellere ersetzt werden.

Welche Möglichkeiten der Typeinschränkung gibt es?

- durch Löschen von Methoden


- durch Spezialisierung

Warum ist nur die Referenzsemantik in Fragen der Zuweisungskompatibilität interessant?

* Bei Wertsemantik wird bei der Zuweisung eine Kopie erstellt.
* Dabei muss man überlegen, ob eine Variable vom Typ T in einer Variable vom Typ S gespeichert werden kann.
* Je nach interner Repräsentation ist dafür nämlich kein Platz.

Wie kann man strukturelles und nominales Subtyping miteinander vergleichen?

* Nominales Subtyping: Ein Subtyp muss aus einem namentlich erwähnten Supertypen abgeleitet sein, um als sein Subtyp zu gelten.
* Strukturelles Subtyping: Ein Typ muss lediglich die Definition von Subtyp erfüllen.
* Nominales Subtyping impliziert strukturelles.
* Nominales Subtyping macht die Subtypenbeziehung antisymmetrisch, das strukturelle nicht.

Was ist Subtyping?

* Subtypen werden auf Basis von bereits bestehenden Typen definiert.
* Definition erfolgt unter Angabe des oder der direkten Supertypen und relativ zu diesen.

Was ist ein Subtyp?

* Ein Typ, dessen Werte überall da auftauchen dürfen, wo ein Wert des Typs, von dem er ein Subtyp ist, verlangt wird.
* Subtyp steht nicht für eine besondere Art von Typ, sondern für eine Rolle in einer Beziehung zwischen zwei Typen, der Subtypenbeziehung.
* Die Gegenrolle heißt Supertyp.

Was sind direkte und indirekte Subtypen?

* Direkter Subtyp: Zwischen einem Typen und seinem Subtypen liegt kein weiterer Typ.
* Indirekter Subtyp: Zwischen einem Typen und seinem Subtypen liegen weitere Typen.

Welche Eigenschaften hat die Subtypenbeziehung?

Transitiv und reflexiv aber nicht symmetrisch.

Was gilt bei Typkorrektheit bei Redefinition von Methoden?

Eingabeparameter dürfen sich nur nach oben, also zu einem Supertypen hin, Rückgabetypen nur nach unten, zu einem Subtypen hin, verändern.

Was sind Kontravarianz und Kovarianz?

* Beides drückt eine Änderung im Verhältnis zur Änderung des Empfängertyps aus.
* Kontravarianz: Veränderung zum Empfängertyp gegenläufig
* Kovarianz: gleichgerichtete Veränderung

Was ist Invarianz bzw. Novarianz?

* Schönheitsfehler im Konzept der Gegenläufigkeit bei der Veränderung von Parameter- und Ergebnistypen
* Annahme: Eine Methode gibt dasselbe Objekt x zurück, das sie als Parameter bekommt
* Sie kann Objekte eines Supertypen von X entgegennehmen, kann aber gleichzeitig keinen Subtypen von X zurückgeben.
* Das Umgekehrte ist auch nicht möglich
* --> Unverändlichkeit von Parametertypen.

Was ist Inklusionspolymorphie?

* auch: Subtyppolymorphie
* Darunter versteht man im Wesentlichen dasselbe wie unter Subtyping: Wo Objekte eines Typs erwartet werden, dürfen Objekte anderer Typen erscheinen, weil der erste Typ die anderen subsumiert.

Warum ist Inklusionspolymorphie so attraktiv?

* Der Wertebereich von Typen lässt auf unvorhergesehene Umfänge ausweiten.
* Besonders interessant für die Weiterentwicklung und Wiederverwendung von Programmen.
* Dabei werden einfach neue Typen hinzugefügt, die anstelle bereits existierender eingesetzt werden können, ohne dass an einem Programm weitere Änderungen vorgenommen werden müssten.
* Die Regeln einer strengen Typprüfung werden dadurch aufgelockert, ohne an Typsicherheit zu verlieren.

Was ist Typumwandlung?

* Ein Verfahren, bei dem der vorgefundene Typ eines Ausdrucks in einen vorgegebenen konveriert wird.
* Mit dem Objekt, für das der Ausdruck steht, passiert nichts.
* Lediglich wird der Compiler davon überzeugt, dass der Ausdruck den bei der Umwandlung angegebenen Typ hat.
* Grund: Man möchte ein Objekt, das auf eine Variable eines Supertyps verweist, wie ein Objekt seins tatsächlichen Typs behandeln, weil man eine Methode aufrufen möchte, die der Supertyp nicht hat.

Welche Arten von Typumwandlungen gibt es?

* Up cast: zum Supertypen hin (typsicher)
* Down cast: zum Subtypen hin (nicht typsicher)
* Cross cast: zu Typen, die weder Sub- noch Supertyp sind (nicht typsicher)

Wofür verwendet man Cross Casts?

Cross casts sind selten und stehen in der interfacebasierten Programmierung für einen Rollenwechsel eines Objekts

Welcher Zusammenhang besteht zwischen Typen und Klassen?

* Typen sind abstrakte Spezifikationen, die zum einen den Wertebereich von Variablen einschränken und zum anderen das Protokoll (den Funktionsumfang) angeben
* Klassen sind Konstrukte, die es erlauben Objekte als Instanzen zu bilden und mit Implementierungen zu versehen

Was ist das Geheimnisprinzip?

Nur die Elemente einer Klassendefinition, die für Benutzer einer Klasse zur Verwendung gedacht sind, sollen durch die Schnittstelle nach außen getragen werden - der Rest soll verborgen bleiben.

Können absolute Schnittstellen als Typen angesehen werden?

* Absolute Schnittstelle kommt, wenn sie wirklich keine Implementierungsdetails verrät, einem Typ gleich, da sie nur aus Deklarationen von Methoden besteht.
* Einige Sprachen erlauben es, die Instanzvariablen ihrer Objekte in die Schnittstelle der Klassen aufzunehmen.
* Damit wird die Repräsentation der Objekte nach außen sichtbar, was dem Geheimnisprinzip widerspricht.

Welche Gründe gibt es für die Trennung von Typen und Klassen?

* Klassen dienen der Angabe von Implementierungen und damit als Container für ausführbaren Code.
* Typen dienen der Formulierung von Invarianzen, die für Variablenbelegungen gelten müssen und deren Verletzung auf einen Programmierfehler hinweist.
* Da beide im Wesentlichen über die gleichen Elemente verfügen, lässt sich die Definition beider in einem Sprachkonstrukt zusammenfassen.

Welche Unterschiede zwischen Typen und Klassen gibt es während der Laufzeit?

* Typinformation beeinflusst die Ausführung eines laufenden Programms insofern, dass sie ein Programm bei Verletzung einer Invariante abbrechen lässt und damit einen schwieriger zuordenbaren Fehler zuvorkommt.
* Klasseninformation beeinflusst die Ausführung eines laufenden Programms insofern, dass sie Grundlage des dynamischen Bindens ist und in einem Programm als Eigenschaft von Objekten abgefragt werden kann.

Was ist eine parametrische Typdefinition?

* Unterscheidet sich von einer normalen Typdefinition dadurch, dass in der Typdefinition verwendete, andere Typen nicht genannt werden müssen, sondern durch Platzhalter, die Typparameter, vertreten werden können.
* Diese Typparameter sind Variablen, deren Wert implizit auf Typen beschränkt ist.

Was ist die Instanziierung eines parametrischen Typs?

* Typvariablen werden erst bei der Verwendung eines parametrisierten Typs in der Deklaration eines anderen Programmelements mit einem Wert, also einem Typ belegt.
* Erst dabei entsteht ein konkreter Wertebereich, der dem deklarierten Programmelement zugewiesen wird.
* Ein parametrischer Typ, bei dem Typvariablen nicht belegt sind, hat keinen konkreten Wertebereich.

Was ist die Idee des parametrischen Polymorphismus?

* Aus einer Typdefinition sollen durch Parametrisierung viele Typen entstehen. Eine parametrische Typdefinition steht also nicht für einen Typ, sondern für theoretisch beliebig viele.
* Formale Typparameter: Typvariablen, die in parametrischen Typdefinitionen vorkommen.
* Aktuelle Typparameter: Die konkreten Typen, die bei der Verwendung des Typen in die formalen Typparameter eingesetzt werden.
* Die Verwendung eines parametrisch definierten Typs führt bereits zur Übersetzungszeit zu einer Zuweisung an die Typvariablen. Es ist also keine dynamische Komponente.
* Typen müssen keine Objekte sein, um Typvariablen zugewiesen zu bekommen.

Wie sieht die generische Typdefinition in Strongtalk aus?

Typ: A


Typvariablen: T


Protokoll:


x ^<T>


x: einT <T> ^ <Self>


* Für Typvariablen verwendet man einen Großbuchstaben, damit man keine anderen Typen verdeckt.
* T ist kein Typ, sondern eine Typvariable

Wie sieht die Instantiierung eines parametrischen Typs in Strongtalk aus?

| a <A[Integer]> |

Welche Unzulänglichkeiten hat der einfache, parametrische Polymorphismus?

* Ohne Inklusionspolymorphie wäre es nicht möglich, in einer Collection mit Elementtyp XYZ auch Objekte eines Subtyps von XYZ zu speichern.
* Die erhöhte Typsicherheit bei der Verwendung von parametrisch definierten Typen wird mit einer geringeren Typsicherheit innerhalb der Typdefinition (Klassendefinition) erkauft.

Wie verhält es sich mit Subtyping bei parametrischen Typen?

Parametrischer Polymorphismus überträgt die Subtypenbeziehung seiner aktuellen Typparameter nicht auf die durch Instanziierung erzeugten Typen.

Was ist beschränkter parametrischer Polymorphismus?

Eine Art der Beschränkung des Wertebereichs von Typvariablen, die auf Subtyping beruht.

Was sind rekursive Typen?

* Ein Typ, der sich selbst in seiner Definition referenziert.
* Die Methoden des Typs haben den eigenen Typ als Übergabeparameter oder als Rückgabetyp.
* Die strukturelle Äquivalenz zweier rekursiver Typen ist nicht leicht festzustellen, da die dazu notwendige Expansion rekursiver Typen unendlich große Definitionen ergibt.

Was bedeutet Typisierung von Programmelementen?

Programmelemente werden mit einem Typ annotiert.