¿Se puede especificar un lenguaje de programación sin implementación?

11

¿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?

Kaveh
fuente
3
¿Qué es una "implementación" de un lenguaje?
Raphael
@Raphael: Fue usted quien cambió "lenguaje de programación" a "lenguaje". Antes de su edición, estaba claro qué significaba la implementación de un lenguaje.
Tsuyoshi Ito
@ TsuyoshiIto: No del todo; Solo adapté el título para que coincida con la pregunta, que se modificó en cstheory.SE. Lo cambié de nuevo, pero aún no está claro qué significa eso. Un compilador? ¿Un interprete? De todos modos, migrar una pregunta aquí que tiene casi un año y por un usuario que aparentemente nunca revisó la pregunta allí fue, en el mejor de los casos, desaconsejado.
Raphael
@Raphael: Preguntando "¿qué es una implementación de un lenguaje?" después de eliminar todas las pistas fue simplemente más allá de mi comprensión. Pero estoy de acuerdo en que la pregunta no estaba clara desde el principio.
Tsuyoshi Ito
Creo que su supuesta definición de "lenguaje de programación" está mal concebida. Al menos debería modificarse reemplazando "funciones" por "funciones computables". De lo contrario, no está claro por qué elegiría llamar al idioma "Lenguaje de programación". Una vez que lo modifica, la pregunta deja de tener sentido, porque no existen tales "lenguajes de programación para los cuales no podría existir una implementación".
Uday Reddy

Respuestas:

7

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.

jmad
fuente
1
Generalizado: no se puede implementar cualquier lenguaje que especifique una función que resuelva un problema indecidible.
edA-qa mort-ora-y
@ edA-qamort-ora-y Técnicamente podría implementarse. No puede decidir el problema de detención, pero un TM puede simular otra máquina y aceptar si esa máquina se detiene; el lenguaje aceptado por tal TM es exactamente el lenguaje de (codificaciones de) máquinas que se detienen. ¡Pero para fines prácticos, normalmente nos gusta que las operaciones primitivas de los lenguajes de programación tengan la garantía de terminar! (al menos en la entrada "sensible")
Ben
1
Sí, las funciones de un lenguaje deben tener una complejidad de tiempo menor que :)O()
edA-qa mort-ora-y
@ edA-qamort-ora-y esto no siempre es cierto. Por ejemplo, en la semántica denotacional de Haskell y, por lo tanto, es en el modelo de costo obvio. En la práctica, todas las implementaciones de Haskell diferencian entre excepción y divergencia, y GHC tiene una semántica de operación específica que explica cómo se supone que funcionan las excepciones. ¡Pero, sería posible tener una implementación conforme que girara para siempre en dividir por cero! 1/0 Ω ( ) let loop = loop in loopΩ()
Philip JF
3

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

Vor
fuente
Entonces, ¿podría usarse un "compilador" de C como intérprete si a uno no le importara el código que se generó sino simplemente el diagnóstico producido?
supercat
Sí, como se muestra en el documento, el compilador se detiene con una lista de errores que coinciden con el historial de cómputo de la máquina Turing (y su configuración de cinta final). Obviamente, la entrada no puede ser interactiva (debe estar codificada en el código fuente antes de ejecutar el compilador).
Vor
2

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 0MM0

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).

Kaveh
fuente
Estoy bastante seguro de que "lenguaje de programación" significa un lenguaje de programación de la forma en que normalmente hablaríamos de él, y "una implementación de un lenguaje" significa un entorno para ejecutar programas en ese lenguaje en computadoras reales. La pregunta no está formalizada , pero seguramente no está clara. Puedo escribir fácilmente una especificación para un nuevo lenguaje de programación sin molestarme en implementarlo; la pregunta es simplemente preguntar si es posible hacerlo de tal manera que el lenguaje no se pueda implementar.
Ben
@Ben, si miras la pregunta original en teoría, verás que no hay programación de palabras en la pregunta solo en el título. La pregunta publicada por OP es definitivamente clara. PD: Me interesaría una definición rigurosa (no necesariamente formal) de lo que es un lenguaje de programación. No podemos probar resultados negativos sobre lenguajes de programación basados ​​únicamente en la intuición y ejemplos. Si tiene referencia para una definición, publíquela como una edición o comentario a la pregunta.
Kaveh
Es justo, aunque SE afirma que lo respondiste hace 9 horas, mucho después de que se migró y editó. Todavía haría la misma interpretación basada en la pregunta original de todos modos. En cuanto a la definición de un lenguaje de programación, diría que uno obvio es una gramática formal más una reducción a algún otro modelo computacional bien entendido (cálculo lambda, máquina de turing, etc.) o una semántica rigurosa operacional. El modelo de reducción haría que la respuesta a esta pregunta sea un "no" trivial, obviamente.
Ben
1

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.

vonbrand
fuente