PCP - Programming Concepts & Paradigms
Lernkartei zum Modul Programming Concepts & Paradigms der HSLU
Lernkartei zum Modul Programming Concepts & Paradigms der HSLU
-
- 1 / 44
-
Lernkarten
Was bedeutet Turing-Vollständigkeit?
Universelle Programmierbarkeit, d.h. damit lassen sich grundsätzlich alle Funktionen berechnen, welche mit einer [fiktiven] Turing-Maschine berechnet werden können.
Definition: Programmierparadigma
Fundamentaler Programmierstil, eine bestimmt Art die Struktur und Elemente von Programmen aufzubauen
Nenne Beispiele für imperative Programmierparadigmen:
- strukturiert (Pascal)
- prozedural (C)
- objektorientiert (Java)
Nenne Beispiele für deklarative Programmierparadigmen:
- funktional (Scheme)
- logisch (Prolog)
Programmierparadigmen sind eher ___ als ___ zu sehen
Was bedeutet imperative Programmierung?
Problemlösung (Berechnungslogik) wird schrittweise in Befehlen beschrieben: Wie ist das Problem zu lösen?
Was bedeutet deklarative Programmierung?
Berechnungslogik wird beschrieben ohne den Kontrollfluss zu definieren: Was sind die Fakten zum Problem?
Erkläre imperativ am Beispiel „Kreis“
- Imperative Programmierung: WIE
- Kreis: Resultat einer 360 Grad Rotation um einen festen Mittelpunkt mit dem Zirkel
- Beschreibung von einer konkreten Lösung, so wird schrittweise vorgegangen
Erkläre deklarativ am Beispiel ,,Kreis"
- Deklarative Programmierung: WAS
- Kreis: Menge aller Punkte, die von einem vorgegebenen Punkt denselben Abstand hat
- Reine Problembeschreibung ohne konkreten Lösungsweg!
Was sind Charakteristiken der imperativen/prozeduralen Problemlösung?
- Der Fokus liegt auf den Befehlen (Anweisungen)
- Kontrollfluss ist vorgegeben (sequentiell bis auf Kontrollstrukturen wie z.B. Funktionen, Bedingungen oder Schleifen)
Was sind Charakteristiken der deklarativ-logischen Problemlösung?
- Einzelne Fakten und Regeln sind angegeben
- Kontrollfluss ist nicht (explizit) vorgegeben
Was sind Charakteristiken der deklarativ-funktionalen Problemlösung?
- Fokus liegt auf Definition von Ein- und Ausgaben von Funktionen
- Kontrollfluss ist nicht (explizit) vorgegeben
Wann spricht man von strukturierter Programmierung?
Spezialisierung des imperativen Paradigmas, verlangt Beschränkung auf drei Kontrollstrukturen:
- Sequenzen (Hintereinander auszuführende Programmanw.)
- Auswahl (Verzweigung: Bedingung)
- Wiederholung (Schleifen)
Konsequenz: „goto“ darf nicht eingesetzt werden, sonst „Spaghetticode“ (= Code mit verworrenen Kontrollstrukturen)
Wann spricht man von prozeduraler Programmierung?
Spezialisierung des imperativen Paradigmas, bietet Unterteilung von Programmen in Teilprogramme (= Prozedur, oder je nach Sprache: Routine, Unterprogramm, Funktion)
- Vermeidet Code-Duplikation
- Prozeduren können Argumente entgegen nehmen und Ergebnisse zurück geben
- Unterscheidung in Programm-globale und Prozedurlokale Variablen
Oft genannt als „Gegenstück“ zur objektorientierten Programmierung innerhalb der imperativen Sprachen
Wann spricht man von objektorientierter Programmierung?
Spezialisierung des imperativen Paradigmas, laufende Programme bestehen aus einzelnen Objekte, welche miteinander interagieren (Nachrichten austauschen = Methoden aufrufen)
Objekte sind typischerweise Instanzen von Klassen (Geht auch anders, z.B. mit Prototypen in JavaScript)
- Klassen definieren Zustand (Variablen) und Verhalten (Methoden)
- Vererbung, Polymorphismus, usw.
Entstanden als Weiterentwicklung von prozeduraler Programmierung und abstrakten Datentypen
Was macht den Unterschied aus zwischen prozeduraler und strukturierter Programmierung?
Grundsätzlich überlappen sich die beiden Paradigmen an vielen Stellen.
Verwendung von Kontrollstrukturen wie Sequenzen, Auswahl und Wiederholung und Verzicht auf goto? => Strukturierte Programmierung
Programme in kleinere Teilaufgaben aufspalten? => Prozedurale Programmierung
Nenne die bekanntesten Unter-Programmierparadigmen der deklarativen Programmiernung.
- logische Programmierung (z.B. Prolog)
- funktionale Programmierung (z.B. Scheme)
Wann spricht man von logischer Programmierung?
Spezialisierung vom deklarativen Paradigma: Programm besteht aus Fakten und Regeln, aus welchen auf Anfrage automatisch versucht wird, eine Lösungsaussage herzuleiten
Lösungsweg wird nicht angegeben
Basierend auf mathematischer Logik (Horn-Klauseln, Resolution)
Wann spricht man von funktionaler Programmierung?
Spezialisierung des deklarativen Paradigmas: Programme bestehen ausschliesslich aus Definitionen von Funktionen mit Parametern und Rückgabewerten
- Der Rückgabewert hängt ausschliesslich von den Parametern ab (-> Referenzielle Transparenz!)
- Es gibt keinen Zustand und keine veränderbaren Daten
Basiert auf dem formalen System des Lambda-Kalkül
Welche imperativen Programmierparadigmen kennen Sie?
- strukturiert
- prozedural
- objektorientiert
Welche deklarativen Programmierparadigmen kennen Sie?
- logisch
- funktional
Was ist eine Programmiersprache?
Programmiersprache = formal konstruierte Sprache, entworfen um Befehle an Maschinen (speziell Computer) zu übermitteln
Definition Syntax
Gibt das Muster (die formale Struktur) vor, nach dem Programme einer Sprache aufgebaut sind
➔„Zusammenfügungsregeln“
Definition Semantik
Definiert die Bedeutung von Programmen (Anweisungen, Operatoren, usw.)
➔„Interpretationsregeln“
Was beschreibt die Mächtigkeit einer Programmiersprache?
Die Mächtigkeit einer Programmiersprache beschreibt, den Umfang der darin festhaltbaren Algorithmen.
Was trifft für Java zu?
Warum soll bei der strukturierten Programmierung auf goto-Statements verzichtet werden?
Nach Dijkstra: Mit der goto-Anweisung sind verworrene Kontrollstrukturen möglich (= „Spaghetticode“) – Auswahl und Wiederholung sind einfacher verständlicher und Programmfluss nachvollziehbar
In welchem Verhältnis stehen imperative und strukturierte Programmierung?
Strukturierte Programmierung ist eine Spezialisierung der imperativen Programmierung, die sich auf die drei Kontrollstrukturen...
- Sequenzen
- Auswahl
- Wiederholung
...beschränkt. Goto-Statements sind zu vermeiden.
Was sind struct-Strukturen?
Mit struct lässt sich eine Liste von Variablen zusammenfassen.
Beispiel Deklaration:
struct point {
int x;
int y;
char color;
};
Verwendung:
struct point p;
p.x = 100;
p.y = 200;
p.color = 'g';
printf(" p = (%i, %i)", p.x, p.y);
Definition Abstrakte Datentypen
Abstrakte Datentypen (ADT) sind mathematische Modelle für Datenstrukturen und darauf definierte Operationen (mit vorgegebenem Effekt)
- Welche „Unschönheit“ existiert im Zusammenhang mit abstrakten Datentypen?
- Wie löst die Objektorientierung diese Unschönheit?
- Implementierung der Datenstruktur ist (grundsätzlich) getrennt und unabhängig von der Implementierung der dazu gehörigen Funktionen.
- Die Funktionen „hängen“ direkt an den Daten: Klassen haben definierte „Daten“ (Zustand: Instanzvariablen) und „Funktionen“ (Verhalten: Methoden)
Worin unterscheidet sich die Implementierung von einem abstrakten Datentyp in C fundamental von einer Implementierung in Java?
In C ist die Implementierung der Daten getrennt von derjenigen der Operationen, wohingegen bei Java die Implementierung der Daten und Operationen innerhalb der Klasse zusammengefasst sind.
Um welche Konzepte erweitert die OOProgrammiersprache Java im wesentlichen die prozedurale Programmiersprache C?
- Klassen und Instanzen
- Interfaces
- Sichtbarkeit
- Packages
- Exception Handling
Definition: Endrekursion (tail recursion)
Eine Prozedur ist endrekursiv, wenn:
- sie nur einen rekursiven Aufruf hat und
- dieser rekursive Aufruf ist der letzte Aufruf in der letzten Klausel von dieser Prozedur
- zusätzlich müssen die Aufrufe vor dem rekursiven Aufruf alle deterministisch sein
Was ist der Vorteil von Endrekursion?
Kein Backtracking notwendig: Endrekursion kann als Iteration ohne zusätzlichen Speicherplatz ausgeführt werden
Wie wird Endrekursion auch genannt?
last call optimization
Definition: Memoization
Optimierung durch Assertions.
Es werden zur Laufzeit Fakten und Regeln in die Wissensdatenbank eingefügt oder entfernt. Man vermeidet so das mehrfache berechnen von Zwischenresultaten,
Warum kann eine endrekursive Prozedur von Prolog effizienter ausgeführt werden, als eine nicht-endrekursive Prozedur?
Endrekursive Prozeduren können von Prolog als Iteration ausgeführt werden, was effizienter ist.
Beschreiben sie in eigenen Worten, auf was für einer Beobachtung „Optimierung mit Assertions“ beruht und wie diese konkret in Prolog umgesetzt wird.
Beobachtung: Bei einer rekursiven Prozedur werden Zwischenresultate mehrfach berechnet.
Diese Zwischenresultate speichert man bei einer Optimierung mit Assertions in Prolog in die Wissensdatenbank.
Einfügen mit asserta/1 oder assertz/1 und entfernen mit retract/1
Was antwortet Prolog auf die folgende Anfrage: X = [a | [b]]?
X = [a, b]