¿Es teóricamente posible especificar un lenguaje de programación para el cual no podría existir una implementación? Un lenguaje de programación es una forma de definir funciones. Una implementación significa un método para ejecutar un programa dado en ese lenguaje en una entrada dada a la salida de la función correspondiente al programa en esa entrada.
¿Cuáles son los requisitos mínimos de tal lenguaje?
Respuestas:
Por lo general, implementar un lenguaje de programación es al menos dar un intérprete en un lenguaje (o un compilador de un lenguaje) que no sea más que Turing completo.
Usando esta "definición" podemos especificar un lenguaje de programación como este:
solo hay un programa posible que es
HALT
;especificación de
HALT
: es una función que resuelve el problema de detención .Implementar este lenguaje de programación requiere resolver el problema de detención con la implementación. (Lo cual es imposible ya que nuestra implementación no debería ser más poderosa que una máquina Turing).
La especificación maneja la lógica y, por lo tanto, puede pedir mucho más. Otra especificación que será imposible de implementar es "falsa". (O cualquier oración contradictoria en la especificación) Pero esto no parece una especificación, por eso utilicé el ejemplo del problema de detención.
fuente
1/0
Ω ( ∞ )let loop = loop in loop
Solo una nota al margen curiosa: el motor de plantillas de C ++ está completo de Turing
Teorema 1: en ausencia de límites de instanciación, las plantillas de C ++ son Turing-complete.
Corolario 1: en ausencia de límites de instanciación, no se puede determinar si un compilador de C ++ se detendrá al compilar un programa determinado.
... por lo que el C ++ en sí puede considerarse un lenguaje de programación para el que no podría existir una "implementación" ... :-D
fuente
No está claro qué quiere decir con un "lenguaje de programación" y "una implementación de un lenguaje". Debe proporcionar definiciones rigurosas de estos dos para obtener una respuesta.
Un lenguaje de "programación" para calcular funciones (parciales) sobre cadenas puede considerarse una asignación de a . Mientras una de las funciones no computables esté dentro del rango, el lenguaje no se puede implementar.2 Σ ∗Σ∗ 2Σ∗
Por ejemplo, uno puede tomar aritmética de primer orden. Entonces es fácil definir funciones que no son computables, por ejemplo, la función que da una TM , decidir si devuelve en todas las entradas. Esto se puede expresar fácilmente mediante una fórmula de primer orden en el lenguaje de la aritmética. Por otro lado, es un resultado fácil en la teoría de computabilidad que no es una función computable, por lo que no puede implementarse la función.M 0M M 0
Pero este no es el tipo de lenguaje de especificación que las personas quieren decir cuando usan la frase "lenguaje de programación". Un lenguaje de programación generalmente está destinado a ser un lenguaje para expresar funciones computables (procesos, ...) y para comunicar las instrucciones a una máquina y, por lo tanto, hay una TM que puede simular esos programas y generar sus resultados. Entonces, en cierto sentido, tener un lenguaje de programación que no se puede implementar no tiene sentido.
(Supongo que probablemente esté confundiendo los lenguajes de programación con lenguajes de especificación o con lenguajes formales . En cualquier caso, podemos definir lenguajes que no sean computables).
fuente
Se han especificado muchos idiomas sin una implementación, por ejemplo, se suponía que Algol 60 era un lenguaje para escribir algoritmos, no para ser implementado. Algunos de los muchos lenguajes "solo por diversión" se especificaron mucho antes de que apareciera una implementación, me viene a la mente Intercal.
fuente