Wie viel Rechenleistung kann eine C-Implementierung haben, wenn wir uns an das Buch halten (oder an eine andere Version der Sprachspezifikation, wenn Sie dies vorziehen)?
Beachten Sie, dass „C-Implementierung“ eine technische Bedeutung hat: Es handelt sich um eine bestimmte Instanz der C-Programmiersprachenspezifikation, in der das implementierungsdefinierte Verhalten dokumentiert ist. Die AC-Implementierung muss nicht auf einem tatsächlichen Computer ausgeführt werden können. Es muss die gesamte Sprache implementieren, einschließlich aller Objekte mit einer Bit-String-Darstellung und Typen mit einer implementierungsdefinierten Größe.
Im Sinne dieser Frage gibt es keinen externen Speicher. Die einzige Eingabe / Ausgabe, die Sie ausführen können, ist getchar
(um die Programmeingabe zu lesen) und putchar
(um die Programmausgabe zu schreiben). Auch jedes Programm, das undefiniertes Verhalten aufruft, ist ungültig: Für ein gültiges Programm muss das Verhalten durch die C-Spezifikation sowie die Beschreibung des implementierungsdefinierten Verhaltens in Anhang J (für C99) definiert werden. Beachten Sie, dass das Aufrufen von Bibliotheksfunktionen, die im Standard nicht erwähnt werden, undefiniertes Verhalten ist.
Meine anfängliche Reaktion war, dass eine C-Implementierung nichts anderes als ein endlicher Automat ist, da die Größe des adressierbaren Speichers begrenzt ist (Sie können nicht mehr als sizeof(char*) * CHAR_BIT
Speicherbits adressieren, da unterschiedliche Speicheradressen beim Speichern unterschiedliche Bitmuster aufweisen müssen in einem Bytezeiger).
Ich denke jedoch, eine Implementierung kann mehr als das. Soweit ich das beurteilen kann, gibt der Standard der Rekursionstiefe keine Grenzen. Damit Sie beliebig viele rekursive Funktionsaufrufe durchführen können, müssen bis auf eine begrenzte Anzahl von Aufrufen nur nicht adressierbare ( register
) Argumente verwendet werden. Somit kann eine C-Implementierung, die eine willkürliche Rekursion ermöglicht und die Anzahl der register
Objekte nicht begrenzt, deterministische Pushdown-Automaten codieren.
Ist das richtig? Können Sie eine leistungsfähigere C-Implementierung finden? Existiert eine Turing-complete C-Implementierung?