Kontextsensitive Grammatiken und Typen

25

1) In welcher Beziehung stehen statische Typisierung und formale Grammatik?

2) Wäre es insbesondere für einen linear begrenzten Automaten möglich, zu überprüfen, ob beispielsweise ein C ++ - oder SML-Programm gut typisiert war? Ein verschachtelter Stapelautomat?

3) Gibt es eine natürliche Möglichkeit, statische Schreibregeln in formalen Grammatikbegriffen auszudrücken?

Andrew Cone
quelle

Antworten:

20

Es ist nicht möglich, dass linear begrenzte Automaten prüfen, ob C ++ - Programme vorhanden sind, und es ist unwahrscheinlich, dass LBA prüfen kann, ob SML-Programme korrekt geschrieben sind. C ++ verfügt über ein Turing-complete-Typensystem, da Sie beliebige Programme als Template-Metaprogramme codieren können.

SML ist interessanter. Es gibt eine entscheidende Typprüfung, aber das Problem ist EXPTIME-vollständig. Daher ist es unwahrscheinlich, dass ein LBA dies überprüfen kann, es sei denn, die Komplexitätshierarchie ist sehr überraschend zusammengebrochen. Der Grund dafür ist, dass SML eine Typinferenz erfordert und es Programmfamilien gibt, deren Typ viel schneller wächst als die Größe des Programms. Betrachten Sie als Beispiel das folgende Programm:

fun delta x = (x, x)        (* this has type 'a -> ('a * 'a), so its return value
                               has a type double the size of its argument *)

fun f1 x = delta (delta x)  (* Now we use functions to iterate this process *)
fun f2 x = f1 (f1 x)        
fun f3 x = f2 (f2 x)        (* This function has a HUGE type *)

Für einfachere Typsysteme wie C oder Pascal glaube ich, dass es einem LBA möglich ist, dies zu überprüfen.

In den Anfängen der Programmiersprachenforschung verwendeten die Leute manchmal Van-Wingaarden-Grammatiken (auch bekannt als zweistufige Grammatiken), um Typsysteme für Programmiersprachen zu spezifizieren. Ich glaube, Algol 68 wurde auf diese Weise spezifiziert. Mir wurde jedoch gesagt, dass diese Technik aus im Wesentlichen pragmatischen Gründen aufgegeben wurde: Es stellte sich heraus, dass es für die Leute ziemlich schwierig war, Grammatiken zu schreiben, die genau angaben, was sie für spezifiziert hielten! (In der Regel haben die Grammatiken, die die Leute geschrieben haben, größere Sprachen erzeugt, als sie beabsichtigt hatten.)

Heutzutage verwenden die Leute schematische Inferenzregeln, um Typsysteme zu spezifizieren. Dies ist im Wesentlichen eine Möglichkeit, Prädikate als den am wenigsten festgelegten Punkt einer Sammlung von Horn-Klauseln zu spezifizieren. Die Befriedigung von Horn-Theorien erster Ordnung ist im Allgemeinen unentscheidbar. Wenn Sie also alles erfassen möchten, was Typentheoretiker tun, ist der von Ihnen gewählte grammatikalische Formalismus strenger als wirklich zweckmäßig.

Ich weiß, dass einige Arbeiten an der Verwendung von Attributgrammatiken zur Implementierung von Typsystemen durchgeführt wurden. Sie behaupten, dass diese Wahl einige Vorteile für das Software-Engineering mit sich bringt: Attributgrammatiken kontrollieren den Informationsfluss sehr genau, und mir wird gesagt, dass dies das Programmverständnis erleichtert.

Neel Krishnaswami
quelle
4

Soweit ich weiß, ist die Korrektheit von Schriften in interessanten Fällen eher unentscheidbar, so dass formale Grammatiken nicht jedes erdenkliche Schriftsystem erfassen können.

Ich weiß, dass große Compiler-Generatoren beliebige Prädikate für Regeln zulassen, die die Ausführung einer Regel verhindern, wenn das Prädikat nicht ausgewertet wird true, z { type(e1) == type(e2) } (expression e1) '+' (expression e2). Dieses Konzept kann leicht formalisiert werden. Angemessene Einschränkungen der zulässigen Prädikate können dann zu einer Entscheidbarkeit durch LBAs führen.

kk+1

Raphael
quelle