Wo es akzeptiert wird, dass eine Sprache vollständig sein muss, um etwas Gutes zu sein, ist es tatsächlich möglich, eine 'nützliche' Programmiersprache zu haben, die nicht vollständig ist?
Ich sollte klarstellen, dass es sich hier ganz speziell um Programmiersprachen im herkömmlichen Sinne handelt und nicht um Auszeichnungs- oder Abfragesprachen.
Antworten:
Coq , Agda , HOL und ACL2 sind sehr nützliche und äußerst leistungsfähige Sprachen, obwohl sie nicht vollständig sind.
Ein gemeinsames Merkmal, das sie unvollständig macht, ist die Tatsache, dass es immer möglich ist, eine Kündigung nachzuweisen. Eine sehr einfache Einschränkung reicht aus: Rekursive Aufrufe sind nur zu nachweislich strukturell kleineren Konditionen erlaubt. Obwohl es nicht möglich ist, einen Interpreter für eine Turing-vollständige Sprache oder sogar für die Sprache selbst zu implementieren, sind dennoch viele andere nützliche Dinge möglich, wie beispielsweise ein zertifizierter C-Compiler .
quelle
Ich würde denken, Yegges Begriff "Mini-Sprache" bezieht sich auf die Tatsache, dass es oft nützlich ist, eine Sprache für bestimmte Probleme zu verwenden, bei denen die Sprache keine Vollständigkeit erfordert, um die Aufgabe zu erfüllen -für vollständige Sprachen kann nützlich sein. https://sites.google.com/site/steveyegge2/language-grubbing
Wikipedia antwortet sehr gut, genau in Übereinstimmung mit dem, was ich gesagt habe. Zuerst dachte ich an reine Mathematik, dann erinnerte ich mich an reguläre Ausdrücke, und Wikipedia listet Epigramm auf, von dem ich glaube, dass es in der "reinen Mathematik" -Vene liegt.
http://en.wikipedia.org/wiki/Turing_completeness#Non-Turing-complete_languages
Es wird auch erwähnt, dass Datenstrukturrepräsentationen keine Sprachen sind, aber ich denke, XSLT sollte als Repräsentation der Berechnung gelten. XPath basiert möglicherweise nicht auf dem, was Yannis oben über SQL als Abfragesprache und nicht als Berechnungssprache sagte. Möglicherweise zählen T-SQL oder PL / SQL als Berechnungssprachen, da Sie viele Berechnungen mit ihren Aggregaten durchführen können, bei denen die verallgemeinerte Form von SQL möglicherweise keine Aggregate angibt.
quelle
Ich verstehe, dass SQL bei Geschäftstypen sehr beliebt ist
quelle
Die Vollständigkeit ist erforderlich, damit eine Sprache für den allgemeinen Gebrauch geeignet ist. Aber es ist nicht ausreichend , dh nur weil es vollständig ist, ist es nicht für jede Problemdomäne geeignet:
Umgekehrt ist ein DSL für die Problemdomäne geeignet, für die es entworfen wurde (vorausgesetzt, es wurde tatsächlich anständig entworfen), auch ohne Turing-Vollständigkeit:
* IIRC hat bewiesen, dass HTML mit CSS-Animationen Turing vollständig ist, indem sie Conways Game of Life für eine Reihe von Kontrollkästchen implementieren. Die Nützlichkeit von HTML bleibt jedoch auch in Browsern erhalten, die CSS-Animationen nicht unterstützen.
quelle
Es gibt tatsächlich Programmiersprachen, in denen man nur "effiziente" Programme schreiben kann. Effizient in diesem Sinne bedeutet, dass jedes in einer solchen Sprache geschriebene Programm eine Sprache in
P
. Bellantoni, Niggl und Schwichtenberg beschreiben hier eine solche Sprache .quelle
Der C - Präprozessor ist nicht Turing-complete (mit Absicht), aber es kann immer noch einen Dolmetscher implementieren für eine Sprache , die ist Turing vollständig (Order-the-Sprache, wie in der Dokumentation beschrieben, ist im Grunde nur eine run-of-the Mühle rein funktionale ML / Scheme-Typ Sache, und wäre relativ unauffällig - wahrscheinlich ganz nett zu bedienen - wenn es nicht für die ungewöhnliche Umsetzung wäre).
Der Trick dahinter ähnelt den obigen Argumenten zur Implementierung einer Turing-Maschine in einem endlichen physikalischen Universum: Der C-Präprozessor kann der Sprache nicht unendlich viele Schritte oder Datenzellen bereitstellen , aber er kann:
Geben Sie eine unangemessen große dynamische Zahl an (standardmäßig 2 ^ 64), die groß genug ist, um die realistischsten Probleme mithilfe eines exponentiellen Expansionsprozesses zu lösen ( Murmeln, Murmeln, Lebensdauer des Universums, Murmeln ).
Verwenden Sie eine beliebige statische Begrenzung für die obige Zahl, dh während die Anzahl der Schritte eine endliche Zahl sein muss, können Sie die spezifische Begrenzung zum Zeitpunkt des "Kompilierens" ändern, indem Sie die statischen Einstellungen der Interpreter-Engine ändern. Da es keine (theoretische) Begrenzung für den tatsächlichen Wert dieser Obergrenze gibt, kann sie (theoretisch) erweitert werden, um dem Platzbedarf für ein Abschlussprogramm zu entsprechen.
Um nicht zu argumentieren, dass Order an sich notwendigerweise "nützlich" ist oder dass jede CPP-implementierte Engine dies wäre, aber es ist ein interessanter Proof of Concept. Es ist angeblich auch dynamisch getippt , was für diesen Bereich ungewöhnlich ist.
quelle
Ja, in der Tat ist es möglich, eine nützliche Sprache zu haben, die nicht vollständig ist. Siehe hier: http://tkatchev.bitbucket.org/tab/examples.html
Ein weiteres Beispiel für eine nützliche unvollständige Turing-Sprache ist SQL. (Und noch eine andere ist Tabellenkalkulation wie Gnumeric oder Excel, obwohl sie nicht wirklich Programmiersprachen sind.)
Welche Gründe sprechen für eine Sprache, die nicht vollständig ist? Auf diese Weise können Sie einige starke Garantien für das Laufzeitverhalten abgeben.
Vollständigkeit zu gewährleisten, bedeutet, rekursionsfähig zu sein. Rekursion bedeutet, potenziell unbegrenzte Strukturen im Gedächtnis zu haben. Da in der realen Welt das Gedächtnis nicht unendlich ist, erfordert die Vollständigkeit des Turing eine Speicherverwaltung und / oder eine Speicherbereinigung.
Das Verbot der Rekursion ist eine großartige Möglichkeit, um das wirklich, wirklich schwierige Problem der Ressourcenverwaltung zu vermeiden.
Nota bene! Turing unvollständig zu sein, bedeutet nicht unbedingt, dass ein Programm unbedingt beendet wird. Eine unvollständige Turing-Sprache könnte die Auswertung einer unendlichen Lazy-Liste ermöglichen.
quelle
Eine interessante "Sub-Turing-Programmiersprache" wurde bisher nicht erwähnt, also werde ich sie hinzufügen.
Es heißt "Crema" . Es beschreibt sich als:
Es ist ziemlich minimalistisch und ziemlich niedrig.
C-Entwicklern dürfte das bekannt vorkommen.
Es wurde ursprünglich von der Defense Advanced Research Projects Agency (DARPA) finanziert, sieht aber zum Zeitpunkt des Schreibens noch recht ungepflegt aus. Aber vielleicht interessiert sich doch jemand.
quelle