Si vous y réfléchissez, les architectures sont des machines abstraites. Ils décrivent comment un morceau de silicium soigneusement fabriqué «devrait» se comporter. La différence entre les architectures et les machines de Turing est plus une question d'échelle qu'un changement fondamental d'approche.
L'avantage des machines de Turing est qu'il existe un ensemble de preuves utiles qui sont très faciles à faire avec une machine de Turing. Il est simple de prouver que toute machine suffisamment puissante pour simuler une machine de Turing peut résoudre tout problème qu'une machine de Turing peut (duh). Cependant, cela devient plus intéressant lorsque vous définissez une fonction calculable . Il s'avère qu'il existe de nombreuses définitions compatibles d'une fonction calculable. Si vous pouvez définir tous vos comportements comme des fonctions calculables, vous pouvez être simulé dans une machine de Turing.
Disons donc que vous avez une architecture qui prend directement en charge les programmes de style LISP, et une autre comme le x86 qui est plus procédurale. Votre ami affirme que "LISP est plus expressif, vous pouvez donc écrire des programmes sur cette machine que vous ne pourriez jamais écrire sur votre x86." C'est brutal à contrer (d'autant plus que vous ne connaissez probablement pas assez LISP). Cependant, vous pouvez abuser de plusieurs machines abstraites comme la machine de Turing:
- Votre machine LISP peut être sophistiquée, mais tout ce qu'elle peut faire est réductible au calcul lambda. Votre ami hoche la tête avec impatience. Le calcul lambda est un peu culte pour les programmeurs fonctionnels.
- Mon x86 peut être sophistiqué, mais tout ce qu'il peut faire est réductible à une machine d'enregistrement. Encore une fois, aucune question de votre ami. Les registres sont tellement conformes à la théorie informatique moderne!
- Toute machine à registre peut être modélisée comme une machine de Turing simulant cette machine à registre. Maintenant, votre ami se demande pourquoi vous revenez à l'ère du ruban perforé.
- Et votre machine à calculer lambda peut également être réduite à une machine de Turing. * Votre ami s'oppose, mais vous les dirigez vers la thèse de Church-Turing, et ils penchent la tête de honte.
- Ainsi, ma boîte x86 peut faire tout ce que votre machine basée sur LISP peut faire!
Il existe bien sûr de nombreux autres exemples. Le jeu de la vie de Conway s'est avéré être Turing complet, ce qui signifie qu'il pourrait théoriquement faire tout ce que votre ordinateur peut faire. La façon la plus simple de le faire était de construire une machine Turing dans la vie . J'en parle parce que ce serait un cas de ce que vous appelez une machine abstraite traitée comme une architecture littérale! Vous pouvez imaginer à quel point la revendication de calculabilité dans la vie serait difficile sans l'aide de modèles abstraits (je suis sûr que je ne modélise pas un x64, avec un cache furtif, juste pour prouver que la vie est calculable!)
Au final, la grande différence entre les architectures et les machines abstraites est que les architectures se préoccupent généralement des performances. Les architectures veulent savoir à quelle vitesse vous pouvez faire quelque chose. Les machines abstraites se contentent de savoir si vous le pouvez. Prenons l'exemple du constructeur universel développé pour les machines d'état von Neuman. Il suffisait de prouver que l'UC pouvait fonctionner, même si les auteurs n'avaient jamais assez de puissance de calcul pour le voir.
Le prix que les architectures paient pour démontrer à quelle vitesse elles peuvent fonctionner est qu'il est souvent terriblement difficile de prouver qu'elles peuvent tout calculer . Pour cela, les architectures font demi-tour et commencent à utiliser des machines abstraites.