Toutes les langues complètes sont-elles interchangeables

26

Notez, bien que je sache programmer, je suis tout à fait un débutant en théorie CS.

Selon cette réponse

La complétude de Turing est un concept abstrait de calculabilité. Si un langage est Turing complet, il est capable de faire n'importe quel calcul que n'importe quel autre langage complet de Turing peut faire.

Et tout programme écrit dans n'importe quelle langue complète de Turing peut être réécrit dans une autre .

D'accord. C'est logique. Je peux traduire (compiler) C en Assembly (et je le fais tous les jours!), Et je peux traduire Assembly en C (Vous pouvez écrire une machine virtuelle en C). Et la même chose s'applique à n'importe quelle autre langue - vous pouvez compiler n'importe quelle langue dans Assembly, puis l'exécuter dans une machine virtuelle écrite dans une autre autre langue.

Mais n'importe quel programme écrit dans une langue complète de Turing peut-il être réécrit dans une autre?

Que faire si mon assemblage a un opcode LIGHTBUTTON? Je ne peux physiquement pas émuler cette langue sur un système (langue) sans ampoule.

D'accord. Donc, vous direz que puisque nous traitons de la théorie informatique , nous ne discutons pas des limitations des appareils physiques.

Mais qu'en est-il d'un appareil qui n'a pas de multiplication? division? À ma connaissance (bien que ce soit plus une question pour math.SE), on ne peut pas émuler la multiplication (et certainement pas la division) avec addition et soustraction [1].

Alors, comment un "langage complet turing" (qui peut ajouter, soustraire et sauter) émulerait-il une autre langue qui peut ajouter, soustraire, multiplier et sauter?

MODIFIER

[1]. Sur des nombres réels arbitraires.

tournée
la source
33
Les nombres réels appartiennent au domaine de l'Hyper-Turing-Computation. Une machine de Turing ne peut pas gérer des nombres réels, ergo, ils ne sont pas pertinents pour l'intégralité de Turing.
Jörg W Mittag
3
Connexes: un ensemble d'instructions en langage assembleur avec une seule instruction est encore assez puissant pour construire un ordinateur universel: en.wikipedia.org/wiki/One_instruction_set_computer . Par exemple, "Soustrayez et branchez si inférieur ou égal à zéro" avec des opérandes de mémoire. Il sera lent par rapport à un x86 moderne, mais le rapport de performances est limité pour tout programme.
Peter Cordes
1
Aucune machine physique (réellement existante) n'est ou ne peut jamais être complète de Turing, car l'exhaustivité de Turing nécessite un stockage infini et l'univers n'est pas infini. Il en résulte que la réponse affirmative à la question de savoir si deux machines abstraites sont équivalentes ne vous aide pas à répondre à la question de savoir si deux approximations physiques de ces machines sont équivalentes.
Ben
2
@PeterCordes: Je suppose que lorsque vous dites que le rapport est fini, vous voulez simplement dire que toute tâche qui se termine en temps fini sur l'un ou l'autre le fera en temps fini sur les deux - pas que pour une machine particulière (sans inclure l'entrée) il y aurait toute limite finie à la hauteur du ratio pour certaines entrées. Je pense que l'on pourrait construire des machines complètes de Turing pour lesquelles on pourrait sélectionner des entrées qui rendraient le rapport arbitrairement élevé - peut-être même pas une fonction calculable de la taille d'entrée.
supercat
6
Je ne sais pas d'où vous vient l'idée que "on ne peut pas émuler la multiplication (et certainement pas la division) avec l'addition et la soustraction". Il a été enseigné à l'école primaire lorsque nous apprenons à nous multiplier
phuclv

Réponses:

55

Turing-completeeness dit une chose et une seule chose: un modèle de calcul est Turing-complete, si tout calcul qui peut être modélisé par une machine de Turing peut également être modélisé par ce modèle.

Alors, quels sont les calculs qu'une machine de Turing peut modéliser? Eh bien, d'abord et avant tout, Alan Turing et tous ses collègues n'étaient intéressés que par les fonctions sur les nombres naturels. Ainsi, la machine de Turing (et le λ-calcul, le calcul combinateur SK, les fonctions μ-récursives,…) ne parlent que de la calculabilité des fonctions sur les nombres naturels. Si vous ne parlez pas d'une fonction sur des nombres naturels, alors le concept de Turing-complétude n'a même pas de sens, il n'est tout simplement pas applicable.

Notez, cependant, que nous pouvons encoder beaucoup de choses intéressantes en tant que nombres naturels. Nous pouvons encoder des chaînes en nombres naturels, nous pouvons encoder des graphiques en nombres naturels, nous pouvons encoder des booléens en nombres naturels. Nous pouvons encoder les machines de Turing en nombres naturels, ce qui nous permet de créer des machines de Turing qui parlent de machines de Turing!

Et, bien sûr, toutes les fonctions sur les nombres naturels ne sont pas calculables. Une machine de Turing ne peut calculer que certaines fonctions sur des nombres naturels, le λ-calcul ne peut calculer que certaines fonctions sur des nombres naturels, le calculateur SK combinateur ne peut calculer que certaines fonctions sur des nombres naturels,…. Étonnamment (ou non), il s'avère que chaque modèle de calcul (qui est réellement réalisable dans notre univers physique) peut calculer les mêmes fonctions sur des nombres naturels (au moins pour tous les modèles que nous avons trouvés jusqu'à présent). [Note: évidemment, il existe des modèles de calcul plus faibles , mais nous n'en avons pas encore trouvé un qui soit plus fort, sauf certains qui sont manifestement incompatibles avec notre univers physique, comme les modèles utilisant des nombres réels ou les voyages dans le temps.]

Ce fait, qu'après une longue période de recherche de nombreux modèles différents, nous trouvons, à chaque fois, qu'ils peuvent calculer exactement les mêmes fonctions, est la base de la thèse de Church-Turing, qui dit (grosso modo) que tous les modèles de calcul sont tout aussi puissants et que tous capturent la notion «idéale» de ce que signifie être «calculable». (Il y a aussi un deuxième aspect plus philosophique du CTT, à savoir qu'un humain suivant un algorithme peut également calculer exactement les mêmes fonctions qu'un MT peut calculer et pas plus.)

Cependant , rien de tout cela ne dit rien

  • l'efficacité des différents modèles
  • à quel point ils sont pratiques à utiliser
  • quoi d' autre ils peuvent faire en plus des fonctions de calcul sur les nombres naturels

Et c'est précisément là que les différences entre les différents modèles de calcul (et les langages de programmation) entrent en jeu.

O(sizearray)O(sizearray2)sizearraysizearray

Par exemple, pour plus de commodité, vous pouvez simplement comparer le code écrit dans un langage de très haut niveau, le code écrit en assembleur et la description d'une MT pour résoudre le même problème.

Et votre interrupteur d'éclairage est un exemple du troisième type de différence, des choses que certains modèles peuvent faire qui ne sont pas des fonctions sur les nombres naturels et n'ont donc rien à voir avec l'exhaustivité de Turing.

Pour répondre à vos questions spécifiques:

Mais n'importe quel programme écrit dans une langue complète de Turing peut-il être réécrit dans une autre?

Non. Seulement si le programme calcule une fonction calculable de Turing sur des nombres naturels. Et même alors, il pourrait avoir besoin d'un encodage complexe. Par exemple, le λ-calcul n'a même pas de nombres naturels, ils doivent être codés à l'aide de fonctions (car les fonctions sont la seule chose que le λ-calcul possède).

Ce codage de l'entrée et de la sortie peut être très complexe, tout comme l'expression de l'algorithme. Ainsi, s'il est vrai que n'importe quel programme peut être réécrit, le programme réécrit peut être beaucoup plus complexe, beaucoup plus volumineux, utiliser beaucoup plus de mémoire et être beaucoup plus lent.

Que faire si mon assemblage a un opcode LIGHTBUTTON? Je ne peux physiquement pas émuler cette langue sur un système (langue) sans ampoule.

Une ampoule n'est pas une fonction calculable de Turing sur les nombres naturels. En réalité, une ampoule n'est ni une fonction ni un calcul. Allumer et éteindre une ampoule est un effet secondaire d'E / S. Les machines de Turing ne modélisent pas les effets secondaires d'E / S et la complétude de Turing ne les concerne pas.

Sur des nombres réels arbitraires.

La complétude de Turing ne concerne que les fonctions calculables sur les nombres naturels, elle ne concerne pas les nombres réels.

Turing-exhausteness n'est tout simplement pas très intéressant quand il s'agit de questions comme la vôtre pour deux raisons:

  1. Ce n'est pas un obstacle très élevé. Tout ce que vous avez besoin est IF, GOTO, WHILEet une seule variable entier ( en supposant que la variable peut contenir arbitrairement grands nombres entiers). Ou, récursivité. Beaucoup, beaucoup et beaucoup de choses est Turing-complet. Le jeu de cartes Magic: The Gathering est Turing-complete. CSS3 est Turing-complet. Le sendmailfichier de configuration est Turing-complete. L'Intel x86 MMU est Turing-complete. L' MOVinstruction Intel x86 est Turing-complete. Les animations PowerPoint sont complètes de Turing. Excel (sans script, utilisant uniquement des formules) est Turing-complete. Le protocole de routage BGP est Turing-complete. sedest Turing-complet. Les mod_rewriterègles Apache sont Turing-complete. Google pour " (accidentellement OU étonnamment) turing terminé"pour trouver d'autres exemples intéressants. Si presque tout est Turing-complete, être Turing-complete cesse d'être une propriété intéressante.
  2. Il n'est pas vraiment nécessaire d'être utile. Beaucoup de choses utiles ne sont pas complètes. CSS avant la version 3 n'est pas complet de Turing (et le fait que CSS3 n'est réellement utilisé par personne). SQL avant 1999 n'était pas Turing-complet, pourtant, il était extrêmement utile même alors. Le langage de programmation C sans bibliothèques supplémentaires ne semble pas être complet de Turing . Les langages typiquement dépendants ne sont pas, par définition, plus ou moins complets pour Turing, mais vous pouvez y écrire des systèmes d'exploitation, des serveurs Web et des jeux.

Edwin Brady, l'auteur d'Idris, utilise le terme "Tetris-complete" pour parler de certains de ces aspects. Être complet avec Tetris n'est pas défini de manière rigoureuse (à part ce qui est évident "peut être utilisé pour implémenter Tetris"), mais cela englobe des choses comme être assez haut niveau et suffisamment expressif pour pouvoir écrire un jeu sans devenir fou, pouvoir interagir avec le monde extérieur (entrée et sortie), être capable d'exprimer des effets secondaires, être capable d'écrire une boucle d'événement, être capable d'exprimer une programmation réactive, asynchrone et simultanée, être capable d'interagir avec le système d'exploitation, être capable pour interagir avec des bibliothèques étrangères (en d'autres termes: pouvoir appeler et être appelé par du code C) et ainsi de suite. Ce sont des caractéristiques beaucoup plus intéressantes d'un langage de programmation à usage général que Turing-completeeness.


Vous pouvez trouver ma réponse à la question que vous avez liée intéressante, qui touche à certains des mêmes points même si elle répond à une question différente.

Jörg W Mittag
la source
7
J'aime vraiment cette réponse, mais je pense qu'il vaut la peine de noter que nous pouvons représenter toutes sortes de choses intéressantes par des nombres naturels. Par exemple, nous pouvons représenter des chaînes par des nombres naturels, nous pouvons représenter des graphiques par des nombres naturels, nous pouvons représenter l'état entier de la mémoire d'un ordinateur par un nombre naturel. Les nombres réels peuvent être codés comme des fonctions sur des nombres naturels et (de nombreuses) fonctions sur des nombres naturels peuvent être codées par des nombres naturels. Donc, limiter les fonctions des nombres naturels aux nombres naturels n'est pas une grande limitation - à moins qu'il fasse sombre et que vous vouliez que votre ordinateur allume la lumière.
Theodore Norvell
3
Belle réponse, mais celle-ci: "être Turing-complet cesse d'être une propriété intéressante" est tout simplement faux. Si quelque chose est Turing-complet, son problème d'arrêt est Turing-complete par réduction calculable au problème d'arrêt pour les machines Turing. Par exemple, le jeu de cartes Magic: The Gathering est Turing-complete. Cela signifie que ses règles sont indécidables , c'est-à-dire que dans le cas général, il est impossible de déduire de manière calculable quel sera l'état de jeu suivant, ce qui est une propriété très intéressante. Plus sérieusement, nous utilisons l'exhaustivité de Turing et les réductions pour prouver des problèmes indécidables.
quicksort
Turing et ses collègues s'intéressaient aux fonctions sur les nombres naturels, mais les machines de Turing ne s'occupent pas vraiment des nombres, elles traitent des chaînes de symboles. De toute évidence, vous pouvez interpréter trivialement des strigns finis de symboles dans un alphabet fini connu comme des nombres naturels, mais les MT ne font pas directement des choses "numérotées" avec leur entrée, ils manipulent simplement les "chiffres". Il faut en fait un peu de logique pour passer des descriptions standard des MT aux "fonctions sur les nombres naturels"; lorsque vous travaillez avec des MT, vous encodez des nombres naturels sous forme de chaînes, et non des chaînes sous forme de nombres.
Ben
C'est évidemment une excellente réponse, mais je crains qu'elle ne dépasse la compréhension d'OP. OP est déjà confus quant à l'implémentation de la multiplication sur (sous-ensembles finis de) nombres réels. Compte tenu de cela, votre réponse semble impliquer que les langages de programmation complets de Turing ne sont pas, en fait, échangeables à des fins de calcul pur, alors qu'en réalité ils le sont (car tout ce que les processeurs modernes font - pas seulement certaines choses - peut être encodé comme naturel Nombres).
Konrad Rudolph
9
@TheodoreNorvell Au sujet de l'encodage des nombres réels avec des nombres naturels. En fait, presque tous les nombres réels ne peuvent pas être codés par des nombres naturels. L'ensemble des nombres réels qui peuvent être encodés par des nombres naturels, du fait qu'ils sont encodés par des nombres naturels, est tout au plus dénombrable. Et parce qu'il n'est que infiniment infini, l'ensemble a la mesure zéro. Il est un peu fallacieux de dire que nous pouvons représenter des nombres réels en général avec des nombres naturels car nous ne pouvons en représenter qu'une fraction infinitésimale, ou pour être plus précis: 0%.
Shufflepants
9

Bien sûr, vous pouvez implémenter la multiplication avec addition et soustraction:

/* Assume b is positive for simplicity */
int multiply(int a, int b) {
  int res = 0;
  while (b > 0) { res += a; b -= 1; }
  return res;
}

Le fait que vous ne feriez probablement pas cela ne le rend pas moins possible.

La division n'est guère plus difficile:

/* Assume a and b are positive for simplicity */
int divide(int a, int b) {
  int res = 0;
  while (a >= b) { res += 1; a -= b; }
  return res;
}

Et comment pensez-vous que la multiplication et la division sont réellement effectuées par les circuits du CPU? Astuce: ce n'est pas une énorme table de recherche. Il est plus efficace que ci-dessus, car le décalage de bits est également utilisé, mais il est fondamentalement mis en œuvre en termes d'addition et de soustraction.

rici
la source
4
2precision
7
@touring: Vous savez, l'arithmétique à virgule flottante était disponible avant qu'il n'y ait des coprocesseurs à virgule flottante.
rici
6

Aucune machine physique (réellement existante) n'est ou ne peut jamais être complète de Turing, car l'exhaustivité de Turing nécessite un stockage infini et l'univers n'est pas infini.

Il en résulte que la réponse affirmative à la question de savoir si deux machines abstraites sont équivalentes ne vous aide pas à répondre à la question de savoir si deux approximations physiques de ces machines sont équivalentes.

Par conséquent, l'équivalence de Turing des modèles abstraits de (par exemple) deux langues ne signifie pas que chacun peut calculer tout ce que l'autre peut calculer dans la pratique. L'un peut se heurter à des limitations physiques avant l'autre.

Ben
la source
Mais la question portait sur les langues. Il mentionne des machines particulières, mais uniquement parce qu'il ne se rend pas compte que pratiquement aucune machine réelle ne fonctionne sur des nombres réels.
Shufflepants
3

nm=n+n(m1)m/n=1+(mn)/n

En fait, les opérations «ajouter 1», «soustraire 1» et «saut conditionnel si un registre spécifié est nul» sont suffisantes pour rendre un modèle de calcul Turing-complet (voir la machine à 2 compteurs comme référence pour un modèle de calcul de Turing très complet).

22n=n+n2m×2n=2m×nm×(2n+1)=m+2m×n

tri rapide
la source
3

tl; dr - Les machines de Turing ne sont qu'une description logique de base pour le fonctionnement d'un système logique général. Ils peuvent faire la plupart des choses que nous pouvons décrire, y compris appeler des opcodes spécialisés et des opérations mathématiques construites.


Que faire si mon assemblage a un opcode LIGHTBUTTON? Je ne peux physiquement pas émuler cette langue sur un système (langue) sans ampoule.

Dans un modèle Turing, les symboles comme un LIGHTBUTTONopcode ne sont que des chaînes dans l'alphabet utilisé par l'ordinateur Turing.

Ainsi, la machine de Turing serait responsable de la production de la chaîne "LIGHTBUTTON", ou d'une valeur entière qui correspond à cet opcode; Qu'une entité externe agisse ou non n'est pas l'affaire de l'ordinateur Turing.

Les programmes C ont la même limitation. C'est-à-dire qu'un programme C ne peut appeler l'opcode que pour LIGHTBUTTON, que le CPU exécute ou non une opération associée à cet opcode dépend du CPU.


Mais qu'en est-il d'un appareil qui n'a pas de multiplication? division? À ma connaissance (bien que ce soit plus une question pour math.SE), on ne peut pas émuler la multiplication (et certainement pas la division) avec addition et soustraction [sur des nombres réels arbitraires].

Oui, une machine de Turing pourrait faire ces choses, même sur des nombres réels, dans la mesure où n'importe quelle logique humaine pourrait le décrire. La machine Turing pourrait être aussi simple qu'une automatisation cellulaire Rule 110 .

L'astuce consiste à construire un système logique à partir de la physique de la machine. Par exemple, les CPU traditionnels peuvent faire de la multiplication et de la division car ils ont une unité logique arithmétique (ALU) . Mais les ALU ne sont pas magiques; ce ne sont que de simples portes logiques . Et ces portes logiques sont constituées de transistors . Et ces transistors sont faits de sable dopé .

Donc, pour obtenir un appareil complet de Turing pour faire des mathématiques, il suffit de le programmer de cette façon.

ππ=0ππππ=0

Nat
la source
3

Mais n'importe quel programme écrit dans une langue complète de Turing peut-il être réécrit dans une autre?

Si l'entrée du programme est une séquence de bits arbitrairement longue, et la sortie est également une séquence de bits arbitrairement longue, alors OUI. En supposant que vous avez le temps et l'énergie pour le réécrire, que vous ne vous souciez pas des performances et que vous disposez de suffisamment de mémoire physique pour les deux implémentations.

Les considérations pratiques qui signifient que deux langues complètes de Turing ne sont pas interchangeables comprennent:

  • ils prennent en charge différents types d'entrée et de sortie (par exemple, l'accès à la base de données SQL)

  • ils ont différentes bibliothèques de types de données (par exemple, prise en charge des chaînes Unicode)

  • ils fournissent différents paradigmes de programmation optimisés pour différentes tâches (par exemple, objets, threads, coroutines, fonctions de première classe)

  • ils fournissent différentes bibliothèques de fonctions (par exemple, analyse XML et sérialisation)

Michael Kay
la source
1

Non. La complétude de Turing n'a rien à voir avec les programmes , elle concerne les fonctions mathématiques (ou algorithmes ). N'importe quel algorithme - n'importe quel calcul - vous pouvez le faire en C, vous pouvez le faire dans n'importe quel autre langage Turing-complet (cela devrait être évident). Mais Turing-exhausteness ne signifie pas que vous pouvez faire des E / S - du tout. Il ne parle pas du tout du matériel. Juste les calculs.

Vous pouvez étendre un langage Turing-complete avec n'importe quelle opération matérielle que vous souhaitez (techniquement, c'est ainsi fputcque vous fgetctravaillez en C). Si vous prenez deux langues complètes de Turing et les étendez avec des opérations spécifiques au matériel identiques , elles restent interchangeables. Ainsi, votre langage d'assemblage avec LIGHTBULBopération est plus puissant que Turing-complete; on pourrait dire que Turing est terminéLIGHTBULB . Pour que tout autre langage lui soit identique, il doit également être complet sur Turing LIGHTBULB; la façon la plus simple de le faire est d'y ajouter une LIGHTBULBprimitive / instruction / fonction / etc.

C'est pourquoi les implémentations C prennent généralement en charge l'assembleur en ligne, ou documentent un moyen d'appeler des fonctions écrites en assembleur, et pourquoi les implémentations d'autres langages fournissent généralement un moyen d'appeler des fonctions écrites en C.

Jonathan Cast
la source