Semantik von Denotational

In der Informatik, denotational Semantik (am Anfang bekannt als mathematische Semantik oder Semantik von Scott-Strachey) ist eine Annäherung an das Formalisieren der Bedeutungen von Programmiersprachen durch das Konstruieren mathematischer Gegenstände (genannt Denotationen), die die Bedeutungen von Ausdrücken aus den Sprachen beschreiben. Andere Annäherungen an die Versorgung einer formellen Semantik von Programmiersprachen schließen axiomatische Semantik und betriebliche Semantik ein.

Ganz allgemein gesprochen, denotational Semantik ist mit Entdeckung mathematischer Gegenstände genannt Gebiete beschäftigt, die vertreten, was Programme tun. Zum Beispiel könnten Programme (oder Programm-Ausdrücke) durch teilweise Funktionen, oder durch Schauspieler-Ereignis-Diagramm-Drehbücher, oder durch Spiele zwischen der Umgebung und dem System vertreten werden: Das sind alle allgemeinen Beispiele von Gebieten.

Eine wichtige Doktrin der denotational Semantik ist, dass Semantik compositional sein sollte: Die Denotation eines Programm-Ausdrucks sollte aus den Denotationen seiner Subausdrücke gebaut werden.

Historische Entwicklung

Semantik von Denotational ist in der Arbeit von Christopher Strachey und Dana Scott gegen Ende der 1960er Jahre entstanden. Wie ursprünglich entwickelt, durch Strachey und Scott, denotational Semantik hat die Denotation (Bedeutung) eines Computerprogramms als eine Funktion zur Verfügung gestellt, die Eingang in die Produktion kartografisch dargestellt hat. Um Denotationen rekursiv definierten Programmen zu geben, hat Scott vorgehabt, mit dauernden Funktionen zwischen Gebieten, spezifisch ganzen teilweisen Ordnungen zu arbeiten. Wie beschrieben, unten hat Arbeit im Nachforschen passender denotational Semantik für Aspekte von Programmiersprachen wie sequentiality, Parallelität, Nichtdeterminismus und lokaler Staat weitergegangen.

Semantik von Denotational ist für moderne Programmiersprachen entwickelt worden, die Fähigkeiten wie Parallelität und Ausnahmen, z.B, Gleichzeitiger ML, CSP und Haskell verwenden. Die Semantik dieser Sprachen ist compositional darin die Denotation eines Ausdrucks hängt von den Denotationen seiner Subausdrücke ab. Zum Beispiel wird die Bedeutung des applicative Ausdrucks f (E1, E2) in Bezug auf die Semantik seiner Subausdrücke f, E1 und E2 definiert. Auf einer modernen Programmiersprache können E1 und E2 gleichzeitig bewertet werden, und die Ausführung von einem von ihnen könnte anderen betreffen, indem sie durch geteilte Gegenstände aufeinander gewirkt worden ist, die ihre Denotationen veranlassen, in Bezug auf einander definiert zu werden. Außerdem könnten E1 oder E2 eine Ausnahme werfen, die die Ausführung der anderen begrenzen konnte. Die Abteilungen beschreiben unten spezielle Fälle der Semantik dieser modernen Programmiersprachen.

Denotationen von rekursiven Programmen

Eine denotational Semantik wird einem Programm-Ausdruck als eine Funktion von einer Umgebung gegeben (der die Werte seiner freien Variablen hat) zu seiner Denotation. Zum Beispiel erzeugt der Ausdruck eine Denotation, wenn versorgt, mit einer Umgebung, die Schwergängigkeit für seine zwei freien Variablen hat: und. Wenn in der Umgebung den Wert 3 hat und den Wert 5 hat, dann ist die Denotation 15.

Eine Funktion kann als Bezeichnung einer Reihe von befohlenen Paaren modelliert werden, wo jedes befohlene Paar im Satz aus zwei Teilen (1) ein Argument für die Funktion und (2) der Wert der Funktion für dieses Argument besteht. Zum Beispiel ist der Satz von Ordnungspaaren {[0 1] [4 3]} die Denotation einer Funktion mit dem Wert 1 für das Argument 0, schätzen Sie 3 für das Argument 4, und ist sonst unbestimmt.

Das Problem, gelöst zu werden, ist, Denotationen für rekursive Programme zur Verfügung zu stellen, die in Bezug auf sich wie die Definition der Factorial-Funktion als definiert werden

::.

Eine Lösung ist, die Denotation durch die Annäherung aufzubauen, die mit dem leeren Satz von Ordnungspaaren anfängt (der in der Mengenlehre als {} geschrieben würde). Wenn {} in die obengenannte Definition von factorial dann zugestopft wird, ist die Denotation {[0 1]}, der eine bessere Annäherung von factorial ist. Das Wiederholen: Wenn {[0 1]} in die Definition dann eingesteckt wird, ist die Denotation {[0 1] [1 1]}. So ist es günstig, an eine Annäherung an als ein Eingang folgendermaßen zu denken:

::.

Es ist aufschlussreich, um an eine Kette dessen zu denken, "wiederholt", wo F i-many Anwendungen von F anzeigt.

  • F ({}) ist die völlig unbestimmte teilweise Funktion {}\
  • F ({}) ist die Funktion {[0 1]}, der an 0 definiert wird, um 1, und unbestimmt anderswohin zu sein;
  • F ({}) ist die Funktion {[0 1] [1 1] [2 2] [3 6] [4 24] }\

Das dieser Kette gebundene am wenigsten obere ist die volle Funktion, die wie folgt ausgedrückt werden kann, wo das Symbol "" "am wenigsten ober gebunden" bedeutet:

::

Semantik von Denotational von nichtdeterministischen Programmen

Das Konzept von Macht-Gebieten ist entwickelt worden, um eine denotational Semantik nichtdeterministischen folgenden Programmen zu geben. P für einen Macht-Bereichskonstrukteur schreibend, ist das Gebiet P (D) das Gebiet der nichtdeterministischen Berechnung des durch D angezeigten Typs.

Es gibt Schwierigkeiten mit der Schönheit und Unbegrenztkeit in bereichstheoretischen Modellen des Nichtdeterminismus. Sieh Macht-Gebiete für den Nichtdeterminismus.

Semantik von Denotational der Parallelität

Viele Forscher haben behauptet, dass das Gebiet theoretische Modelle, die oben gegeben sind, für den allgemeineren Fall der gleichzeitigen Berechnung nicht genügt. Aus diesem Grund sind verschiedene neue Modelle eingeführt worden. Am Anfang der 1980er Jahre haben Leute begonnen, den Stil der denotational Semantik zu verwenden, Semantik für gleichzeitige Sprachen zu geben. Beispiele schließen die Arbeit von Will Clinger mit dem Schauspieler-Modell ein; die Arbeit von Glynn Winskel mit Ereignis-Strukturen und petri Netzen; und die Arbeit von Francez, Hoare, Lehmann und de Roever (1979) auf der Spur-Semantik für CSP. Alle diese Linien der Untersuchung bleiben unter der Untersuchung (sieh z.B die verschiedenen denotational Modelle für CSP).

Kürzlich haben Winskel und andere die Kategorie von profunctors als eine Bereichstheorie für die Parallelität vorgeschlagen.

Semantik von Denotational des Staates

Staat (wie ein Haufen) und einfache befehlende Eigenschaften kann in der denotational Semantik aufrichtig modelliert werden, die oben beschrieben ist. Alle Lehrbücher haben unten die Details. Die Schlüsselidee ist, einen Befehl als eine teilweise Funktion auf einem Gebiet von Staaten zu betrachten. Die Denotation "" ist dann die Funktion, die einen Staat in den Staat mit dem zugeteilten dem bringt. Der sequencing Maschinenbediener "" wird durch die Zusammensetzung von Funktionen angezeigt. Aufbauten des festen Punkts werden dann verwendet, um eine Semantik dem Schlingen von Konstruktionen, solcher als "" zu geben.

Dinge werden schwieriger im Modellieren von Programmen mit lokalen Variablen. Eine Annäherung soll mit Gebieten nicht mehr arbeiten, aber stattdessen Typen als functors von einer Kategorie von Welten zu einer Kategorie von Gebieten zu interpretieren. Programme werden dann durch natürliche dauernde Funktionen zwischen diesen functors angezeigt.

Denotationen von Datentypen

Viele Programmiersprachen erlauben Benutzern, rekursive Datentypen zu definieren. Zum Beispiel kann der Typ von Listen von Zahlen durch angegeben werden

::

Diese Abteilung befasst sich nur mit funktionellen Datenstrukturen, die sich nicht ändern können. Herkömmliche befehlende Programmiersprachen würden normalerweise den Elementen solch einer rekursiven Liste erlauben, geändert zu werden.

Für ein anderes Beispiel: Der Typ von Denotationen der ungetippten Lambda-Rechnung ist

::

Das Problem, Bereichsgleichungen zu lösen, ist mit Entdeckung von Gebieten beschäftigt, die diese Arten von datatypes modellieren. Eine Annäherung, grob das Sprechen, soll die Sammlung aller Gebiete als ein Gebiet selbst denken, und dann die rekursive Definition dort lösen. Die Lehrbücher geben unten mehr Details.

Polymorphe Datentypen sind Datentypen, die mit einem Parameter definiert werden. Zum Beispiel wird der Typ von α s durch definiert

::

Listen von Zahlen sind dann vom Typ, während Listen von Schnuren davon sind.

Einige Forscher haben Gebiet theoretische Modelle von polymorphism entwickelt. Andere Forscher haben auch parametrischen polymorphism innerhalb von konstruktiven Mengenlehren modelliert. Details werden in den Lehrbüchern gefunden, die unten verzeichnet sind.

Ein neues Forschungsgebiet hat denotational Semantik für den Gegenstand eingeschlossen, und Klasse hat Programmiersprachen gestützt.

Semantik von Denotational für Programme der eingeschränkten Kompliziertheit

Im Anschluss an die Entwicklung von Programmiersprachen, die auf der geradlinigen Logik, denotational Semantik gestützt sind, sind Sprachen für den geradlinigen Gebrauch gegeben worden (sieh z.B Probenetze, Kohärenz-Räume), und auch polynomische Zeitkompliziertheit.

Semantik von Denotational von sequentiality

Das Problem der vollen Abstraktion für die folgende Programmiersprache PCF, war seit langem, eine große geöffnete Frage in der denotational Semantik. Die Schwierigkeit mit PCF besteht darin, dass es eine sehr folgende Sprache ist. Zum Beispiel gibt es keine Weise, die Parallele - oder Funktion in PCF zu definieren. Es ist aus diesem Grund, dass die Annäherung mit Gebieten, wie eingeführt, oben, eine denotational Semantik nachgibt, die nicht völlig abstrakt ist.

Diese geöffnete Frage wurde größtenteils in den 1990er Jahren mit der Entwicklung der Spielsemantik und auch mit Techniken aufgelöst, die mit logischen Beziehungen verbunden sind. Für mehr Details, sieh die Seite auf PCF.

Semantik von Denotational als Quelle-zu-Quelle-Übersetzung

Es ist häufig nützlich, eine Programmiersprache in einen anderen zu übersetzen. Zum Beispiel könnte eine gleichzeitige Programmiersprache in eine Prozess-Rechnung übersetzt werden; eine Programmiersprache auf höchster Ebene könnte in den Byte-Code übersetzt werden. (Tatsächlich kann herkömmliche denotational Semantik als die Interpretation von Programmiersprachen in die innere Sprache der Kategorie von Gebieten gesehen werden.)

In diesem Zusammenhang helfen Begriffe von der denotational Semantik, wie volle Abstraktion, Sicherheitssorgen zu befriedigen.

Abstraktion

Es wird häufig wichtig betrachtet, denotational Semantik mit der betrieblichen Semantik zu verbinden. Das ist besonders wichtig, wenn die denotational Semantik ziemlich mathematisch und abstrakt ist, und die betriebliche Semantik konkreter oder an den rechenbetonten Intuitionen näher ist. Die folgenden Eigenschaften einer denotational Semantik sind häufig von Interesse.

  1. Syntax-Unabhängigkeit: Die Denotationen von Programmen sollten die Syntax der Quellsprache nicht einschließen.
  2. Stichhaltigkeit: Alle erkennbar verschiedenen Programme haben verschiedene Denotationen;
  3. Volle Abstraktion: Zwei Programme haben dieselben Denotationen genau, wenn sie Beobachtungs-gleichwertig sind. Für die Semantik im traditionellen Stil kann volle Abstraktion grob als die Voraussetzung verstanden werden, dass "betriebliche Gleichwertigkeit mit der denotational Gleichheit zusammenfällt". Für die denotational Semantik in mehr intensional Modellen, wie das Schauspieler-Modell und die Prozess-Rechnungen, gibt es verschiedene Begriffe der Gleichwertigkeit innerhalb jedes Modells, und so ist das Konzept der vollen Abstraktion eine Sache der Debatte, und härter, unten zu befestigen. Auch die mathematische Struktur der betrieblichen Semantik und denotational Semantik kann sehr nahe werden.

Zusätzliche wünschenswerte Eigenschaften, die wir zwischen der betrieblichen und denotational Semantik könnten halten mögen, sind:

  1. Constructivism: Constructivism wird damit betroffen, ob, wie man zeigen kann, Bereichselemente durch konstruktive Methoden bestehen.
  2. Unabhängigkeit von denotational und betrieblicher Semantik: Die denotational Semantik sollte mit mathematischen Strukturen formalisiert werden, die der betrieblichen Semantik einer Programmiersprache unabhängig sind; jedoch können die zu Grunde liegenden Konzepte nah verbunden sein. Sieh die Abteilung auf Compositionality unten.
  3. Volle Vollständigkeit oder definability: Jeder morphism des semantischen Modells sollte die Denotation eines Programms sein.

Compositionality

Ein wichtiger Aspekt der denotational Semantik von Programmiersprachen ist compositionality, durch den die Denotation eines Programms von Denotationen seiner Teile gebaut wird. Denken Sie zum Beispiel den Ausdruck "7 + 4". Compositionality soll in diesem Fall eine Bedeutung für "7 + 4" in Bezug auf die Bedeutungen "7", "4" und "+" zur Verfügung stellen.

Eine grundlegende denotational Semantik in der Bereichstheorie ist compositional, weil es wie folgt gegeben wird. Wir fangen an, indem wir Programm-Bruchstücke, d. h. Programme mit freien Variablen denken. Ein tippender Zusammenhang teilt einen Typ jeder freien Variable zu. Zum Beispiel, im Ausdruck (x + y) könnte in einem tippenden Zusammenhang betrachtet werden (x: y:). Wir geben jetzt eine denotational Semantik, um Bruchstücke mit dem folgenden Schema zu programmieren.

  1. Wir beginnen, indem wir die Bedeutung der Typen unserer Sprache beschreiben: Die Bedeutung jedes Typs muss ein Gebiet sein. Wir schreiben  τ  für das Gebiet, das den Typ τ anzeigt. Zum Beispiel sollte die Bedeutung des Typs das Gebiet von natürlichen Zahlen sein:  = .
  2. Von der Bedeutung von Typen leiten wir eine Bedeutung ab, um Zusammenhänge zu tippen. Wir setzen  x:τ..., x:τ  =  τ  ×... × τ . Zum Beispiel, x: y:  = × . Als ein spezieller Fall ist die Bedeutung des leeren tippenden Zusammenhangs, ohne Variablen, das Gebiet mit einem Element, angezeigt 1.
  3. Schließlich müssen wir eine Bedeutung jedem Programm-Bruchstück im tippenden Zusammenhang geben. Nehmen Sie an, dass P ein Programm-Bruchstück des Typs σ, im tippenden Zusammenhang Γ, häufig schriftlicher Γ  P:σ ist. Dann muss die Bedeutung dieses Programms im tippenden Zusammenhang eine dauernde Funktion  Γ  P:σ  sein: Γ σ . Zum Beispiel,  7: :1  sind ständig "7" Funktion, während x: y:  x+y: :  × ist  die Funktion, die zwei Zahlen hinzufügt.

Jetzt wird die Bedeutung des zusammengesetzten Ausdrucks (7+4) durch das Bestehen der drei Funktionen  7 bestimmt: :1 ,  4: :1  und x: y:  x+y: :  × .

Tatsächlich ist das ein allgemeines Schema für compositional denotational Semantik. Es gibt nichts Spezifisches über Gebiete und dauernde Funktionen hier. Man kann mit einer verschiedenen Kategorie stattdessen arbeiten. Zum Beispiel, in der Spielsemantik, hat die Kategorie von Spielen Spiele als Gegenstände und Strategien als morphisms: Wir können Typen als Spiele und Programme als Strategien interpretieren. Für eine einfache Sprache ohne allgemeinen recursion können wir machen tun mit der Kategorie von Sätzen und Funktionen. Für eine Sprache mit Nebenwirkungen können wir in der Kategorie von Kleisli für einen monad arbeiten. Für eine Sprache mit dem Staat können wir in einer functor Kategorie arbeiten. Milner hat empfohlen, Position und Wechselwirkung durch das Arbeiten in einer Kategorie mit Schnittstellen als Gegenstände und bigraphs als morphisms zu modellieren.

Semantik gegen die Durchführung

Gemäß Dana Scott [1980]:

:It ist für die Semantik nicht notwendig, um eine Durchführung zu bestimmen, aber es sollte Kriterien zur Verfügung stellen, um zu zeigen, dass eine Durchführung richtig ist.

Gemäß Clinger (1981):

:Usually, jedoch, kann die formelle Semantik einer herkömmlichen folgenden Programmiersprache selbst interpretiert werden, um eine (ineffiziente) Durchführung der Sprache zur Verfügung zu stellen. Eine formelle Semantik braucht solch eine Durchführung aber nicht immer zur Verfügung zu stellen und zu glauben, dass Semantik eine Durchführung zur Verfügung stellen muss, führt zu Verwirrung über die formelle Semantik von gleichzeitigen Sprachen. Solche Verwirrung ist schmerzlich offensichtlich, wenn, wie man sagt, die Anwesenheit des unbegrenzten Nichtdeterminismus in einer Semantik einer Programmiersprache andeutet, dass die Programmiersprache nicht durchgeführt werden kann.

Verbindungen zu anderen Gebieten der Informatik

Etwas Arbeit in der denotational Semantik hat Typen als Gebiete im Sinne der Bereichstheorie interpretiert, die als ein Zweig der Mustertheorie gesehen werden kann, zu Verbindungen mit der Typ-Theorie und Kategorie-Theorie führend. Innerhalb der Informatik gibt es Verbindungen mit der abstrakten Interpretation, Programm-Überprüfung und Musterüberprüfung.

Monads wurden in die denotational Semantik als eine Weise eingeführt, Semantik zu organisieren, und diese Ideen haben einen großen Einfluss in der funktionellen Programmierung gehabt (sieh monads in der funktionellen Programmierung).

Weiterführende Literatur

Lehrbücher

  • Joseph E. Stoy, Denotational Semantik: Die Annäherung von Scott-Strachey an die Programmiersprache-Semantik. MIT Presse, Cambridge, Massachusetts, 1977. (Ein Klassiker wenn veraltetes Lehrbuch.)
  • Carl Gunter, "Semantik von Programmiersprachen: Strukturen und Techniken". MIT Presse, Cambridge, Massachusetts, 1992. (Internationale Standardbuchnummer 978-0262071437)
  • Glynn Winskel, Formelle Semantik von Programmiersprachen. MIT Presse, Cambridge, Massachusetts, 1993. (Internationale Standardbuchnummer 978-0262731034)
  • R. D. Tennent, Semantik von Denotational. Handbuch der Logik in der Informatik, vol. 3 Seiten 169-322. Presse der Universität Oxford, 1994. (Internationale Standardbuchnummer 0 19 853762 X)
  • S. Abramsky und A. Jung: Bereichstheorie. In S. Abramsky, D. M. Gabbay, T. S. E. Maibaum, Redakteuren, Handbuch der Logik in der Informatik, vol. III. Presse der Universität Oxford, 1994. (Internationale Standardbuchnummer 0 19 853762 X)
  • David A. Schmidt, Semantik von Denotational: eine Methodik für die Sprachentwicklung, Allyn und Bacon, 1986, internationale Standardbuchnummer 0-205-10450-9 (oder Druck jetzt; freie elektronische Version verfügbar)

Vortrag bemerkt

Andere Verweisungen

  • Irene Greif. Semantik von Kommunizierenden Parallelen Prozessen MIT EECS Doktorarbeit. August 1975.
  • Gordon Plotkin. Ein powerdomain Aufbau SIAM Zeitschrift auf dem Rechnenden September 1976.
  • Edsger Dijkstra. Eine Disziplin, Prentice Hall Zu programmieren. 1976.
  • Krzysztof R. Apt, J. W. de Bakker. Übungen in der Denotational Semantik MFCS 1976: 1-11
  • J. W. de Bakker. Kleinste Feste Punkte Wieder besuchte Theoretische Informatik 2 (2): 155-181 (1976)
  • Carl Hewitt und Henry Baker Actors und das Dauernde Functionals-Verfahren von IFIP Arbeitskonferenz für die Formelle Beschreibung, Konzepte Zu programmieren. Am 1-5 August 1977.
  • Henry Baker. Schauspieler-Systeme für die Echtzeitberechnung MIT EECS Doktorarbeit. Januar 1978.
  • Michael Smyth. Macht-Bereichszeitschrift von Computer- und Systemwissenschaften. 1978.
  • George Milne und Robin Milner. Gleichzeitige Prozesse und ihre Syntax JACM. April 1979.
  • Nissim Francez, C.A.R. Hoare, Daniel Lehmann und Willem-Paul de Roever. Semantik des Nichtdeterminismus, der Parallelität und der Nachrichtenzeitschrift von Computer- und Systemwissenschaften. Dezember 1979.
  • Nancy Lynch und Michael J. Fischer. Das Verhalten von verteilten Systemen in der Semantik der Gleichzeitigen Berechnung beschreibend. Springer-Verlag. 1979.
  • Semantik von Jerald Schwartz Denotational des Parallelismus in der Semantik der Gleichzeitigen Berechnung. Springer-Verlag. 1979.
  • William Wadge. Eine Verlängerungsbehandlung von dataflow fährt Semantik der Gleichzeitigen Berechnung fest. Springer-Verlag. 1979.
  • Ralph-Johan Back. Semantik des Unbegrenzten Nichtdeterminismus ICALP 1980.
  • Der David Park. Auf der Semantik von schönen Parallelismus-Verhandlungen der Winterschule auf der Formellen Softwarespezifizierung. Springer-Verlag. 1980.
  • Will Clinger, der Schauspieler-Semantik]. MIT Mathematik-Doktorarbeit, Juni 1981.
  • Lloyd Allison, Eine Praktische Einführung in die Denotational Semantik Universität von Cambridge Presse. 1987.
  • P. Amerika, J. de Bakker, J. N. Kok und J. Rutten. Semantik von Denotational einer parallelen objektorientierten Sprachinformation und Berechnung, 83 (2):152-205 (1989)
  • David A. Schmidt, Die Struktur von Getippten Programmiersprachen. MIT Presse, Cambridge, Massachusetts, 1994. Internationale Standardbuchnummer 0 262 69171 X.
  • Parallelitätssemantik von M. Korff True für einzelne pushout Graph-Transformationen mit Anwendungen auf Schauspieler-Systemarbeitspapiere der Int Werkstatt auf Informationssystemen - Genauigkeit und Wiederverwendbarkeit. Wissenschaftliche Welt. 1995.
  • M. Korff und L. Ribeiro Gleichzeitige Abstammungen als einzelne pushout Graph-Grammatik bearbeiten Verhandlungen der COMPUGRAPH/SEMAGRAPH Gemeinsamen Werkstatt auf dem Graph-Neuschreiben und der Berechnung. ENTCS Vol 2, Elsevier. 1995.
  • Thati, Prasanna, Carolyn Talcott und Gul Agha. Techniken, um Über Spezifizierungsdiagramme Internationale Konferenz für die Algebraische Methodik Und Softwaretechnologie (AMAST), 2004 Durchzuführen und Zu schließen.
  • J.C.M. Baeten, T. Basten und M.A. Reniers. Algebra, Prozessen Universität von Cambridge Presse Mitzuteilen. 2005.
  • He Jifeng und C.A.R. Hoare. Die Verbindung von Theorien der Parallelität Universität der Vereinten Nationen Internationales Institut für die Softwaretechnologie UNU-IIST Bericht Nr. 328. Juli 2005.
  • Luca Aceto und Andrew D. Gordon (Redakteure). Algebraische Prozess-Rechnungen: Die Ersten Fünfundzwanzig Jahre und Außer der Prozess-Algebra. Bertinoro, Forlì, Italien, am 1-5 August 2005.
  • A. W. Roscoe. Die Theorie und Praxis der Parallelität, Prentice Halls, internationalen Standardbuchnummer 0-13-674409-5. Revidierter 2005.

Links


Manchukuo / Die Warp Drive (Sterntreck)
Impressum & Datenschutz