web-dev-qa-db-fra.com

Est-il réellement possible d'avoir un langage de programmation «utile» qui n'est pas terminé?

Où il est admis qu'une langue doit être complète pour être une bonne qualité, est-elle réellement possible d'avoir un langage de programmation "utile" qui ne tire pas complète?

Je devrais préciser que cela concerne également spécifiquement les langages "programmation" dans le sens traditionnel, et non sur les langues de balisage ou de requête.

38
PhonicUK

COQ , AGDA , [~ # ~ # ~ ~ ~] et ACL2 sont très utiles et extrêmement langues puissantes, bien qu'ils ne soient pas tirées.

Une caractéristique commune qui les rend sans danger - complète est le fait qu'il est toujours possible de prouver la résiliation. Une limitation très simple est suffisante: les appels récursifs ne sont autorisés que sur des termes de manière proprablement structurellement structurellement. Par conséquent, s'il n'est pas possible de mettre en œuvre un interprète pour une langue de turing-complete ou même pour la langue elle-même Beaucoup d'autres utiles Les choses sont toujours possibles, comme A Compiler C certifié .

49
SK-logic

Je pense que le terme "mini-language" de YEGGE fait référence au fait qu'il est souvent utile d'utiliser une langue pour des problèmes spécifiques dans lesquels la langue ne nécessite pas la totalité de l'exhaustivité pour accomplir la tâche, et cela va au cœur de la façon dont -Turture Les langues complètes peuvent être utiles. https://sites.google.com/site/steveveegge2/language-grubbing

Wikipedia répond très bien, juste en ligne avec ce que mon gut a dit. D'abord, je pensais que Pure Math, puis je me suis souvenu de Regexp et Wikipedia énumère l'épigramme que je crois que dans la veine "pure mathématiques".

http://fr.wikipedia.org/wiki/tuturing_compleeness#non-Turturing-compte_languages

Non-Turing-Langues complètes

De nombreuses langues de calcul existent qui ne sont pas complètes. Un tel exemple est l'ensemble des langues ordinaires, les expressions les plus couramment régulières, générées par des automates finis. Une extension plus puissante mais toujours sans tuy-complète des automates finis est la catégorie des automates pushdown et des grammaires sans contexte, qui sont couramment utilisés pour générer des arbres d'analyse dans une étape initiale de la compilation de programme. D'autres exemples incluent certaines des versions précoces des langues de shader pixels intégrées aux extensions Direct3D et OpenGL, ou une série de formules mathématiques dans une feuille de calcul sans cycles. [Citation requise] Dans les langages de programmation fonctionnelle totale, toutes les fonctions sont totales et doivent Terminez, comme la charité et l'épigramme. La charité utilise un système de type et des constructions de contrôle basées sur la théorie des catégories, tandis que Epigram utilise des types dépendants.

Langues de données

La notion de complétude de Turing ne s'applique pas aux langues telles que XML, JSON, YAML et S-Expressions, car elles sont généralement utilisées pour représenter des données structurées, et non décrire le calcul. Celles-ci sont parfois appelées langues de balisage, ou plus correctement en tant que "langues de description de données".

Il mentionne également que les représentations de la structure de données ne sont pas des langues, mais je pense que XSLT devrait compter comme une représentation du calcul, XPathe peut-être non basé sur ce que Yannis a déclaré ci-dessus sur SQL une langue de requête et non une langue de calcul. Peut-être que T-SQL ou PL/SQL comptent comme des langages de calcul, car vous pouvez effectuer beaucoup de calculs à l'aide de leurs agrégats, où la forme généralisée de SQL ne spécifie peut-être peut-être peut-être.

12
Jimmy Hoffa

Je comprends que SQL est assez populaire parmi les types d'entreprise

9
Martin Beckett

Turning Complexess est nécessaire pour une langue d'aptitude à être utilisée comme langue à usage général. Mais ce n'est pas suffisant suffisant , c'est-à-dire parce que c'est Turing complet, il n'est pas adapté à chaque domaine de problème:

  • WhitSpace est prouvé que Turing Turing Turing Turing mais est évidemment inadapté à un domaine problématique en dehors du divertissement des programmeurs.
  • Les modèles C++ ont été prouvés Turing complètes, vous n'auriez toujours jamais rédiger des programmes entiers avec eux.

Inversement A [~ # ~ # ~] DSL [~ # ~ ~] convient au domaine du domaine qu'il a été conçu (en supposant que c'était en fait conçu décemment), même sans que l'exhaustivité:

  • Html* Fournit une manière concise de décrire un arbre DOM. Tandis que JavaScript Turing est terminé et peut être utilisé pour faire de même, il est beaucoup plus bruyant et peu clair
  • XPath et autres langages de requête, PCRE sans code intégré et tels sont tous des outils puissants pour le travail unique qu'ils ont été conçus pour

* IIRC il a été prouvé que HTML avec des animations CSS Turing est terminé en les utilisant pour mettre en œuvre le jeu de la vie de Conway sur une gamme de cases. Mais l'utilité de HTML tient même dans les navigateurs qui ne prennent pas en charge les animations CSS.

5
back2dos

Il existe actuellement 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 dans P. Bellantoni, Niggl et Schwichtenberg décrivez une telle langue ici .

3
SpaceTrucker

Le préprocesseur C n'est pas Turing-complet (par conception), mais elle peut toujours mettre en œuvre un interpréteur pour une langue qui est Turing complet (commande-la langue, Comme décrit dans la documentation, est essentiellement juste un type de type ml/schéma purement fonctionnel purement fonctionnel et serait relativement peu mémorable - probablement assez agréable à utiliser - s'il n'y avait pas pour la mise en œuvre inhabituelle).

Le truc de celui-ci est similaire aux arguments ci-dessus sur la mise en œuvre de toute machine de Turing dans un univers physique fini: le prétraiteur C ne peut pas fournir de infini Nombre d'étapes ou de cellules de données, à la langue. , mais ça peut:

  1. fournissez un de manière déraisonnable Numéro dynamique (2 ^ 64 ou par défaut), suffisamment grand pour résoudre le plus de problèmes réalistes à l'aide d'un processus d'expansion exponentielle ( Mumble Mumble Lifetime de l'univers Mumble).

  2. utilisez un arbitraire Capuchon statique pour le numéro ci-dessus, c'est-à-dire que lorsque le nombre d'étapes doit être un nombre fini, vous pouvez modifier ce que le capuchon spécifique est à "compiler" en modifiant les paramètres statiques. du moteur d'interprétation. Puisqu'il n'y a pas de limite (théorique) sur la valeur réelle de ce casquette, elle peut (théoriquement) être étendue à la condition de l'espace requise pour tout Programme de terminaison.

Ne pas discuter que cet ordre est nécessairement "utile" en soi, ou que tout moteur mis en œuvre par le RPC serait, mais c'est une preuve de concept intéressante. Il est également censé dynamiquement dactylographié , qui est inhabituel pour cette zone.

1
Leushenko