Typ-Systeme in Programmiersprachen: Prüfung & Konvertierung

Eingeordnet in Elektronik

Geschrieben am in Deutsch mit einer Größe von 5,03 KB

Grundlagen von Programmiersprachen: Das Typ-System

Die Art einer Sprache könnte als eine Reihe von Bedingungen definiert werden. Sprachen besitzen mehrere gemeinsame Merkmale, die ihnen erlauben, miteinander zu interagieren und Änderungen zu unterliegen. Diese Merkmale werden nur angewandt, weil die Sprachen diese Eigenschaften besitzen.

Das Typ-System

Das Typ-System besteht aus theoretischen Grundlagen, die verknüpft werden, um jeder deklarativen Sprache eine Struktur zu geben.

Komponenten des Typ-Systems

  • Typ-Konstruktoren (Strukturen, Unions/Vereinigungen, Objekte)
  • Zeiger (Typverweise)
  • Funktionen (z. B. a = Summe();)

Implementierung und Prüfung

Jeder Semantikanalysator implementiert ein Typ-System.

Statische und Dynamische Typ-Prüfung

  • Statische Prüfung (zur Kompilierungszeit)
  • Dynamische Prüfung (zur Laufzeit)

Typüberprüfung von Ausdrücken

  • Die Überprüfung von Datentypen erfolgt durch die Zuweisung des Wertes der einzelnen lexikalischen Komponenten.
  • Diese Werte werden verglichen, um sicherzustellen, dass die Datentypen übereinstimmen und konsistent sind. Andernfalls können keine Berechnungen durchgeführt werden.

Typkonvertierung (Type Conversion)

  • Es gibt Situationen, in denen ein Wert eines bestimmten Typs in einer Variablen eines anderen Typs gespeichert werden soll.
  • Einige Typen erlauben die Speicherung des Wertes ohne explizite Konvertierung (sogenannte automatische Konvertierung).

Automatische Konvertierung (Widening/Promotion)

Dies ist nur möglich, wenn der Compiler erkennt, dass die Zielvariable breit genug ist, um den Quellwert aufzunehmen.

  • Beispiel (Java): Ein byte-Wert kann in einer int-Variablen gespeichert werden, da int breiter ist als byte.
  • Dieser Prozess wird als Erweiterung (Widening) oder Promotion bezeichnet, da der kleinere Typ auf den größeren Typ erweitert wird.

Explizite Konvertierung (Narrowing/Coercion)

Wenn Sie versuchen, einen breiteren Typ (z. B. int) einem schmaleren Typ (z. B. byte) zuzuweisen, muss eine Typkonvertierung explizit ausgeführt werden.

  • In einigen Fällen kann bei der Konvertierung ein Datenverlust auftreten (z. B. bei der Übergabe eines float-Wertes an einen Integer).
  • Dieser Prozess wird als Einschränkung (Narrowing) oder Coercion bezeichnet, da der Wert explizit an den Zieltyp angepasst werden muss.
  • Die explizite Typumwandlung erfolgt durch Voranstellen des Typnamens in Klammern, z. B. (Typ) Wert.

Weitere Arten der Semantischen Überprüfung

Die Überprüfung hilft, die meisten Fehler (Bugs) zu verhindern.

Wichtige Prüfroutinen

  • Typprüfung: Stellt fest, ob die Operatoren für die jeweiligen Operanden korrekt sind.
  • Prüfung der Flusskontrolle: Stellt sicher, dass Anweisungen, die den Programmfluss ändern (z. B. break, return), gültig sind.
  • Nachweis der Eindeutigkeit: Stellt sicher, dass Objekte nur einmal definiert werden.
  • Prüfung verbundener Namen: Überprüfung auf doppelte Namen oder auf Variablen, die deklariert, aber nicht verwendet werden.

Die Typprüfung ist oft komplizierter, während andere Prüfungen routinemäßig durchgeführt werden.

Spezifische Prüfregeln und Typ-Hierarchie

  • Der Modulo-Operator (%) erfordert, dass beide Operanden Ganzzahlen sind.
  • Der Operator + kann überladen sein (z. B. als Funktion Summe(a, b)) und verschiedene Datentypen verarbeiten.
  • Regeln zur Typumwandlung (Promotion) erklären, wie Zahlenwerte auf höhere Ebenen oder Zeiger auf den entsprechenden Datentyp umgewandelt werden.
  • Manche Sprachen (wie Java) prüfen die Größe von Arrays statisch, während andere dies dynamisch (zur Laufzeit) tun.
  • Es muss zwischen der Verwendung von + und * für Zahlen und für Zeiger (Pointer-Arithmetik) unterschieden werden.
  • Der Satz von Regeln, der zur Überprüfung der Datentypen definiert ist, wird als Typ-System bezeichnet.
  • Häufig wird die Fehlerbehebung bei Typfehlern vernachlässigt, was dazu führen kann, dass das Programm zwar nicht abstürzt, aber falsche Werte liefert.

Typ-Aggregierung im Parsing-Stadium

  • Meistens werden Typen während des Parsing-Stadiums aggregiert und in der Symboltabelle gespeichert.
  • Anschließend erfolgt eine Überprüfung des Syntaxbaums basierend auf den zugeordneten Typen.
  • Diese Aktionen finden typischerweise in absteigenden Parsern (Top-Down-Parsern) statt.

Verwandte Einträge: