Si lo piensas bien, las arquitecturas son máquinas abstractas. Describen cómo se comporta una masa de silicio cuidadosamente fabricado. La diferencia entre las arquitecturas y las máquinas de Turing es más una cuestión de escala que un cambio fundamental en el enfoque.
La ventaja de las máquinas Turing es que hay un conjunto de pruebas útiles que son muy fáciles de hacer con una máquina Turing. Es simple demostrar que cualquier máquina lo suficientemente potente como para simular una máquina de Turing puede resolver cualquier problema que una máquina de Turing pueda (duh). Sin embargo, se vuelve más interesante cuando define una función Computable . Resulta que hay muchas definiciones compatibles de una función computable. Si puede definir todo su comportamiento como funciones computables, puede simularlo en una máquina de Turing.
Digamos que tiene una arquitectura que admite directamente los programas de estilo LISP, y otra como la x86, que es más procesal. Su amigo afirma que "LISP es más expresivo, por lo que puede escribir programas en esta máquina que nunca podría escribir en su x86". Esto es brutal para contrarrestar (especialmente porque probablemente no conozcas suficiente LISP). Sin embargo, puede abusar de varias máquinas abstractas como la máquina de Turing:
- Su máquina LISP puede ser elegante, pero todo lo que puede hacer es reducible a cálculo lambda. Tu amigo asiente con entusiasmo. El cálculo de Lambda es una especie de culto para los programadores funcionales.
- Mi x86 puede ser elegante, pero todo lo que puede hacer es reducible a una máquina de registro. Una vez más, ninguna pregunta de tu amigo. ¡Los registros son TAN buenos en la teoría moderna de la computadora!
- Cualquier máquina de registro puede modelarse como una máquina de Turing que simula esa máquina de registro. Ahora su amigo se pregunta por qué se remonta a la era de la cinta perforada.
- Y su máquina de cálculo lambda también puede reducirse a una máquina de Turing. * Tu amigo se opone, pero tú los señalas en la tesis de Church-Turing, y agachan la cabeza avergonzados.
- ¡Así, mi caja x86 puede hacer cualquier cosa que pueda hacer su elegante máquina basada en LISP!
Hay, por supuesto, muchos otros ejemplos. Se demostró que el Juego de la vida de Conway estaba completo, lo que significa que en teoría podría hacer cualquier cosa que tu computadora pueda hacer. La forma más fácil de hacer esto era construir una máquina de Turing en Life . ¡Traigo esto a colación porque este sería un caso de lo que usted llamó una máquina abstracta siendo tratada como una arquitectura literal! Puedes imaginar lo difícil que sería la afirmación de computabilidad en Life sin la ayuda de modelos abstractos (¡estoy seguro de que no estoy modelando un x64, completo con un vistazo de caché, solo para demostrar que Life es computable!)
Al final, la gran diferencia entre arquitecturas y máquinas abstractas es que las arquitecturas generalmente se preocupan por el rendimiento. Las arquitecturas quieren saber qué tan rápido puedes hacer algo. Las máquinas abstractas tienden a contentarse con solo saber si puedes. Considere el Universal Constructor desarrollado para las máquinas de estado von Neuman. Fue suficiente para demostrar que la UC podía funcionar, sin importar que los autores nunca tuvieran suficiente poder de cómputo para llevarlo a cabo.
El precio que pagan las arquitecturas por demostrar cuán rápido pueden funcionar es que a menudo es terriblemente difícil demostrar que pueden calcular todo . Para eso, las arquitecturas se vuelven y comienzan a usar máquinas abstractas.