Là où il est accepté qu'un langage doit être complet pour être réussi, est-il réellement possible d'avoir un langage de programmation «utile» qui n'est pas complet?
Je devrais préciser qu'il s'agit tout particulièrement de la "programmation" des langages au sens traditionnel, et non des langages de balisage ou de requête.
Réponses:
Coq , Agda , HOL et ACL2 sont des langages très utiles et extrêmement puissants, bien qu'ils ne soient pas complets.
Une caractéristique commune qui les rend non-Turing-complete est le fait qu'il est toujours possible de prouver la résiliation. Une limitation très simple suffit: les appels récursifs ne sont autorisés que selon des conditions plus simples et plus structurelles. Par conséquent, bien qu’il ne soit pas possible de mettre en œuvre un interprète pour un langage complet de Turing ou même pour le langage lui-même, de nombreuses autres choses utiles sont toujours possibles, comme un compilateur C certifié .
la source
Je pense que le terme "mini-langage" de Yegge fait référence au fait qu'il est souvent utile d'utiliser un langage pour des problèmes spécifiques où le langage n'exige pas une complétude pour accomplir la tâche, ce qui va au coeur de la non-complétude. -turing langues complètes peuvent être utiles. https://sites.google.com/site/steveyegge2/language-grubbing
Wikipedia y répond très bien, en ligne avec ce que mon instinct a dit. Je pensais d’abord aux mathématiques pures, puis je me suis souvenu de l’expression rationnelle, et Wikipedia répertorie Epigram qui, je pense, serait dans la veine des «mathématiques pures».
http://en.wikipedia.org/wiki/Turing_completeness#Non-Turing-complete_languages
Il mentionne également que les représentations de structure de données ne sont pas des langages, mais je pense que XSLT devrait être considéré comme une représentation du calcul, XPath n'étant peut-être pas basé sur ce que Yannis a dit plus haut, SQL est un langage de requête et non un langage de calcul. Peut-être que T-SQL ou PL / SQL sont considérés comme des langages de calcul, car vous pouvez effectuer beaucoup de calculs en utilisant leurs agrégats, où la forme généralisée de SQL ne spécifie peut-être pas d'agrégats.
la source
Je comprends que le langage SQL est très populaire parmi les entreprises
la source
La complétude est essentielle pour qu’une langue soit apte à être utilisée comme langage à usage général. Mais cela ne suffit pas , c’est-à-dire que Turing est complet, il ne convient pas à tous les problèmes:
Inversement, un DSL est adapté au domaine de problèmes pour lequel il a été conçu (à supposer qu'il ait été conçu de manière décente), même sans la complétude de Turing:
* IIRC a prouvé que HTML avec les animations CSS était complet en utilisant celles-ci pour implémenter Game of Life de Conway sur un éventail de cases à cocher. Mais l'utilité du HTML est valable même dans les navigateurs qui ne supportent pas les animations CSS.
la source
Il existe en réalité des langages de programmation, où vous ne pouvez écrire que des programmes "efficaces". Efficace dans ce sens signifie que chaque programme écrit dans une telle langue représente une langue en
P
. Bellantoni, Niggl et Schwichtenberg décrivent un tel langage ici .la source
Le préprocesseur C est pas Turing-complet (par la conception), mais il peut encore mettre en œuvre un interprète pour une langue qui est Turing complet (commande de la langue, comme décrit dans la documentation, est fondamentalement juste une course-of-the moulin purement fonctionnel type ML / Scheme chose, et serait relativement banal - probablement assez agréable à utiliser - si ce n'était pour la mise en œuvre inhabituelle).
L'astuce qui se cache derrière est similaire aux arguments ci-dessus concernant la mise en œuvre d'une machine Turing dans un univers physique fini: le préprocesseur C ne peut pas fournir un nombre infini d'étapes ou de cellules de données au langage, mais il peut:
fournir un déraisonnablement grand nombre de dynamiques (2 ^ 64 ou si par défaut), assez grand pour résoudre la plupart des problèmes réalistes à l' aide d' un processus d'expansion exponentielle ( mumble mumble à vie de l'univers Mumble ).
utilisez une limite statique arbitraire pour le nombre ci-dessus, c'est-à-dire que, si le nombre d'étapes doit être un nombre fini, vous pouvez modifier la limite spécifique à la "compilation" en modifiant les paramètres statiques du moteur d'interprétation. Puisqu'il n'y a pas de limite (théorique) à la valeur réelle de ce plafond, il peut (théoriquement) être étendu pour s'adapter à l'espace requis pour tout programme de terminaison.
Sans vouloir prétendre que Order est nécessairement "utile" en soi, ou qu'un moteur implémenté par le RPC le serait, mais c'est une preuve de concept intéressante. Il est également censé être dynamiquement typé , ce qui est inhabituel pour cette région.
la source
Oui, en effet, il est possible d’avoir un langage utile qui n’est pas complet. Voir ici: http://tkatchev.bitbucket.org/tab/examples.html
SQL est un autre exemple de langage incomplet utile à Turing. (Et un autre exemple est celui des feuilles de calcul comme Gnumeric ou Excel, bien qu'elles ne soient pas vraiment des langages de programmation.)
Pour ce qui est de la raison pour laquelle vous voudriez un langage qui ne soit pas complet à Turing: parce que cela vous permet de donner de fortes garanties quant au comportement à l'exécution.
Bien entendu, être complet signifie avoir une capacité de récursion. Avoir une récursion signifie avoir des structures potentiellement illimitées en mémoire. Étant donné que dans le monde réel, la mémoire n’est pas infinie, la complétude de Turing nécessite une gestion de la mémoire et / ou un garbage collection.
Interdire la récursion est un excellent moyen d’éviter le problème très complexe de la gestion des ressources.
Nota bene! Être incomplet ne signifie pas nécessairement que tout programme se terminera nécessairement. Un langage incomplet de Turing pourrait permettre d’évaluer une liste infinie de paresseux.
la source
Un "langage de programmation sous-Turing" intéressant n'a pas été mentionné jusqu'à présent, je vais donc l'ajouter.
Ça s'appelle "Crema" . Il se décrit comme:
C'est assez minimaliste et plutôt bas.
Cela devrait sembler familier aux développeurs C.
Il a été initialement financé par la DARPA (Defense Advanced Research Projects Agency), mais il semble ne pas être maintenu au moment d'écrire ces lignes. Mais peut-être que quelqu'un est intéressé quand même.
la source