Praktische Semantik von Programmiersprachen - Cheatsheet.pdf

Praktische Semantik von Programmiersprachen - Cheatsheet
Praktische Semantik von Programmiersprachen - Cheatsheet Small-Step- und Big-Step-Semantik Definition: Small-Step- und Big-Step-Semantik sind zwei Ansätze zur formalen Beschreibung der Ausführung von Programmen. Details: Small-Step-Semantik: Definiert die Programmausführung als eine Folge kleiner Berechnungsschritte. Nutzt Übergangsrelationen: \(e \rightarrow e'\) bedeutet Ausdruck \(e\) reduziert...

© StudySmarter 2024, all rights reserved.

Praktische Semantik von Programmiersprachen - Cheatsheet

Small-Step- und Big-Step-Semantik

Definition:

Small-Step- und Big-Step-Semantik sind zwei Ansätze zur formalen Beschreibung der Ausführung von Programmen.

Details:

  • Small-Step-Semantik: Definiert die Programmausführung als eine Folge kleiner Berechnungsschritte.
  • Nutzt Übergangsrelationen: \(e \rightarrow e'\) bedeutet Ausdruck \(e\) reduziert sich zu \(e'\).
  • Big-Step-Semantik: Beschreibt die Ausführung eines gesamten Programms in einem großen Schritt.
  • Nutzt Bewertungsrelationen: \(e \Downarrow v\) bedeutet Ausdruck \(e\) wird ausgewertet zu Wert \(v\).
  • Small-Step hat den Vorteil, Zwischenschritte zu zeigen; Big-Step ist oft intuitiver für die Gesamtauswertung.
  • Beide Semantiken werden verwendet, um verschiedene Aspekte der Programmausführung zu analysieren und zu beweisen.

Deterministische vs. nicht-deterministische Semantik

Definition:

Deterministische Semantik: Gibt für jede Eingabe genau ein definiertes Ergebnis zurück. Nicht-deterministische Semantik: Kann für dieselbe Eingabe verschiedene mögliche Ergebnisse haben.

Details:

  • Deterministische Semantik:
    • Eindeutiges Verhalten
    • Vorhersehbare Ausführung
    • Reproduzierbare Ergebnisse
  • Nicht-deterministische Semantik:
    • Mehrere mögliche Verhaltensweisen
    • Unvorhersehbare Ausführung
    • Potentiell verschiedene Ergebnisse bei gleicher Eingabe

    Lambda-Kalkül

    Definition:

    Formales System zur Untersuchung von Funktionen und deren Anwendungen.

    Details:

    • Kernbestandteil der funktionalen Programmierung
    • Abstraktion von Funktionen: \(\lambda x. x+1\)
    • Applikation von Funktionen: \( (\lambda x. x+1)\ 2 = 3 \)
    • Reduktionen: \( \beta \text{-Reduktion}, \eta \text{-Reduktion} \)
    • Freie und gebundene Variablen

    Hoare-Logik

    Definition:

    Hoare-Logik ist ein formales System zur Spezifikation und Überprüfung der Korrektheit von Computerprogrammen basierend auf Vor- und Nachbedingungen.

    Details:

    • Hoare-Dreier: \[ \{P\} \;C\; \{Q\} \] - \(P\): Vorbedingung - \(Q\): Nachbedingung - \(C\): Programm
    • Partielle Korrektheit: Wenn \(P\) wahr und \(C\) terminierend, dann \(Q\) wahr
    • Totale Korrektheit: Partielle Korrektheit und \(C\) terminiert
    • Regeln: Sequenz, Auswahl, Schleifen, etc.

    Typsicherheitsbeweise

    Definition:

    Typsicherheitsbeweise belegen, dass ein Programm zur Laufzeit keine Typfehler erzeugt.

    Details:

    • Wesentliche Eigenschaft: Zeigt Formalitätsgrad einer Programmiersprache.
    • Besteht aus: Typregeln und Beweisführung.
    • Typregeln: Formale Regeln zur Überprüfung der Typkonsistenz.
    • Beweisführung: Formalisierung und Nachweis, dass alle gültigen Programme typensicher sind.
    • Typkonsistenz: Jeder Ausdruck im Programm hat einen korrekten Typ.
    • Führt zu sicherer Programmausführung ohne Typfehlerrisiko.
    • Beweis durch strukturelle Induktion: Oft genutzt, um Typsicherheitsbeweise zu führen.
    • Wichtige Theoreme: Progression und Konservierung.
    • Progression: Ein typisiertes Programm kann entweder einen Wert produzieren oder einen weiteren Berechnungsschritt durchführen.
    • Konservierung: Wenn ein Ausdruck einen weiteren Berechnungsschritt durchführen kann, bleibt der Typ des Ausdrucks erhalten.
    • Formale Darstellung: \[ \text{Wenn } \Gamma \vdash e : \tau \text{ und } e \rightarrow e' \text{ dann } \Gamma \vdash e' : \tau \]

    Typinferenzalgorithmen

    Definition:

    Automatische Ermittlung der Typen von Ausdrücken in Programmiersprachen ohne explizite Typangaben.

    Details:

    • Wichtig für die statische Typprüfung
    • Verwendet Typumgebungen zur Assoziation von Variablen und Typen
    • Algorithmus-Beispiele: Hindley-Milner, Algorithm W
    • Erfordert Unifikation zur Lösung von Typgleichungen
    • Ergebnisse: Typsignaturen für alle Ausdrücke

    Syntaxanalyse und Parsererzeugung

    Definition:

    Syntaxanalyse bezieht sich auf die Analyse der grammatikalischen Struktur von Quellcode, während Parsererzeugung den Prozess der Erstellung eines Parsers zur Analyse dieser Struktur beschreibt.

    Details:

    • Ziel: Überprüfung und Strukturierung des Quellcodes entsprechend einer formalen Grammatik.
    • Parser-Typen: Top-Down (z.B., rekursiver Abstieg) und Bottom-Up (z.B., Shift-Reduce).
    • Werkzeuge: Lex und Yacc (oder Flex und Bison), ANTLR.
    • Kontextfreie Grammatiken (CFG): Häufig verwendet. Ein CFG ist definiert durch \(G = (N, \Sigma, P, S)\), wobei \(N\) Nichtterminale, \(\Sigma\) Terminale, \(P\) Produktionsregeln und \(S\) das Startsymbol sind.
    • Parsebäume: Geeignet zur Darstellung der hierarchischen Struktur eines Programms.
    • Ambiguität: Wenn eine Grammatik mehrere Parsebäume für einen String hat, ist sie mehrdeutig.
    • LL(1) und LR(1) Grammatiken: Spezielle Formen zur Vermeidung von Mehrdeutigkeiten.

    Interpreter- und Compilerbau

    Definition:

    Verständnis und Implementierung der Übersetzungsprozesse von Programmiersprachen in Maschinenbefehle; Fokus auf Unterscheidung zwischen Interpretern und Compilern.

    Details:

    • Interpreter: Führt Quellcode Zeile für Zeile aus; keine Zwischenspeicherung in Maschinencode.
    • Compiler: Übersetzt gesamten Quellcode in Maschinencode vor der Ausführung.
    • Phasen eines Compilers: Lexikalische Analyse (\textit{Tokenisierung}), Syntaxanalyse (\textit{Parsing}), Semantische Analyse, Optimierung, Codegenerierung.
    • Interpreterbau: Implementierung eines Interpreters oft einfacher als bei einem Compiler; nützlich für dynamische Sprachen.
    • JIT-Compiler (Just-In-Time): Kombination aus Compilation und Interpretation; zur Laufzeit kompiliert.
Sign Up

Melde dich kostenlos an, um Zugriff auf das vollständige Dokument zu erhalten

Mit unserer kostenlosen Lernplattform erhältst du Zugang zu Millionen von Dokumenten, Karteikarten und Unterlagen.

Kostenloses Konto erstellen

Du hast bereits ein Konto? Anmelden