JavaScript es absolutamente Turing completo. No es una barra alta para ningún lenguaje moderno (si asumes una cinta finita en la Máquina Turing, pero nadie parece estar discutiendo sobre cintas infinitas, así que lo estoy ignorando).
Para no ser Turing completo, un lenguaje no debe poder hacer algo que una máquina de Turing pueda hacer. Debido a que puede implementar una máquina de Turing en JavaScript, es trivialmente completa.
Editar a continuación He simplificado y condensado el resto de mi respuesta a las partes clave, y he abordado las objeciones presentadas en otra respuesta.
- ¿Existe un algoritmo para resolver el problema de la mochila 0/1 acotada multidimensional en PTIME?
- ¿Qué factores principales distinguen las estructuras de datos avanzadas y elementales?
- Cómo ganar un producto CodeChef o Codeforces (pegatinas especiales)
- ¿Hay algún algoritmo de ordenación que funcione en el orden de n?
- ¿Dónde puedo encontrar un algoritmo de relevancia marginal máxima en Python para la eliminación de redundancia en dos documentos?
No importa si una tarea es más difícil de hacer en JavaScript que en otro idioma. No importa si a JavaScript le falta alguna característica de lenguaje clave que le guste, o agrega una característica (como setTimeout) que una máquina de Turing no puede calcular.
Más convincente, eche un vistazo a la herramienta de compilación a JavaScript Emscripten: puede compilar C y C ++ (y probablemente cualquier otra cosa que LLVM pueda compilar) directamente al código fuente de JavaScript. Por lo tanto, para que JavaScript no sea Turing Complete, C, C ++ y todos los demás lenguajes compilables por LLVM tampoco necesitarían ser Turing Complete. Nuevamente, no se trata de cuán conveniente es un idioma o característica. Se trata de si el lenguaje puede hacer los mismos cálculos.
Finalmente, incluso Java se puede compilar a JavaScript con GWT Project. Entonces, de nuevo, si Java está Turing completo, entonces JavaScript debe serlo.
Abordar reclamos específicos:
- JavaScript es un PDA : No, no lo es. Un PDA está muy restringido en la forma en que puede almacenar datos. Puede tener arreglos arbitrarios, tantos como desee, cada uno equivalente a una cinta TM en su capacidad de acceso aleatorio, en JavaScript.
- JavaScript no admite la recursión de cola: la recursión de cola es una optimización compatible con algunos compiladores. Todo lo que se puede calcular con la recursión de cola se puede calcular con iteración. Además, C tampoco admite la recursividad de cola como una característica del lenguaje. Tampoco Java. Es una optimización común, pero no es un requisito de lenguaje, por lo que cualquier afirmación de que la recursión de cola es un requisito para la integridad de Turing excluiría tanto C como Java. El artículo de Turing donde define una máquina de Turing ni siquiera habla sobre la recursión de la cola, solo menciona que la recursión debería ser posible. Aparentemente, incluso puede convertir código JavaScript recursivo a recursión de cola automáticamente: optimización de llamada de cola sobre la marcha en Javascript sin trampolín
- La traducción de idiomas solo requiere un PDA: claro, por lo que EmScripten o GWT solo deben implementarse como PDA. Esto es ortogonal a la pregunta de si JavaScript mismo se está completando.
- El teorema de k-stack: solo se aplica a PDA. JavaScript no es un PDA, y JavaScript tiene muchas formas de almacenar el estado y no está restringido a “k pilas”.
- Ejemplos de JavaScript rotos: cuando crea algo en “79 bytes” Es probable que no cubra todos los casos de esquina. La existencia de un ejemplo roto no prueba que no se pueda solucionar.
- HALT : El documento original de Turing no habla sobre sistemas operativos, solo que debe haber una instrucción que, cuando se llama, indica que el proceso se ha completado. La integridad de Turing de un idioma no depende de si el idioma puede salir al sistema operativo, o lo que hace la instrucción HALT, aparte de detener el procesamiento del algoritmo. Imprimir HALT en el terminal (console.log) o simplemente salir de un proceso NodeJS debería ser una buena manera de indicar que ha entrado en estado HALT.
- No se ha presentado ningún algoritmo que JavaScript no pueda calcular: este es realmente el punto asesino; La definición central de Turing Complete es que un sistema puede calcular cualquier cosa que una máquina de Turing pueda calcular. Estamos viendo muchas afirmaciones teóricas, pero no hay ningún ejemplo real que demuestre un proceso, cualquier proceso, que no se pueda calcular trivialmente en JavaScript.
Se ha descubierto que las cosas que ni siquiera están destinadas a ser Turing Complete son, como el sistema de plantillas en C ++ y el Juego de la vida de Conway. Es una barra increíblemente baja para que un idioma se encuentre, y la afirmación de que JavaScript no es Turing Complete no es compatible.