¿Hay un lenguaje de programación donde cada cadena es un programa válido?

10

¿Existe un lenguaje de programación completo de Turing tal que para un alfabeto fijo (digamos, ASCII), cada posible permutación de esos caracteres sea un programa semánticamente válido capaz de ejecutarse?

Consideramos que los bucles infinitos también son semánticamente válidos.

Sé que algunos formatos de datos, como Markdown, poseen validez semántica universal (cada entrada es válida), pero no puedo pensar en un lenguaje de programación con esta propiedad.

mp-
fuente
@PhilipKendall Esa es una respuesta válida (si degenerada). Por supuesto, casi todos los programas enviarán JMP inmediatamente a un espacio desconocido y se bloquearán. Pero eso no significa que no tengan sentido. Me recuerda a la superoptimación .
mp-
Suponga que tiene un lenguaje trivial cuando le da una letra ascii, la imprime y pasa al siguiente carácter. Eso técnicamente satisface tu definición. Cualquier entrada es válida. Sería un lenguaje bastante tonto ya que no puedes hacer nada productivo con él, pero por supuesto no estamos hablando de practicidad.
Neil
@Neil: ese no es un lenguaje completo de Turing.
Doc Brown

Respuestas:

10

Cada secuencia de octeto puede interpretarse como un código Z80 válido ya que no hay códigos de operación o argumentos inválidos; Me imagino que lo mismo se aplicaría a varios otros procesadores, solo conozco personalmente Z80.

Para cosas de bajo nivel como esta, posiblemente empieces a tener preguntas sobre lo que significa "ejecutar un programa":

  • ¿Qué pasa si salta fuera del espacio inicializado?
  • ¿Cómo termina el "programa" de todos modos?
Philip Kendall
fuente
1
"qué sucede si salta fuera del espacio inicializado" - simplemente agregando una regla "salta a la dirección 0 en este caso", debería ser bastante simple de manejar. No debería ser demasiado difícil definir alguna semántica adicional para tratar con esos casos extremos.
Doc Brown
1
los saltos fuera del espacio inicializado son sintácticamente válidos, y posiblemente incluso semánticamente válidos también (por ejemplo, su semántica bien definida es producir un defecto de seguridad).
Lie Ryan
9

Tales preguntas sobre lenguajes de programación se responden casi universalmente con un sí. Si actualmente no hay un idioma que tenga la propiedad solicitada, puede apostar a que alguien lo verá como un desafío para crear un lenguaje (de juguete) que sí tenga la propiedad.

Como ejemplo de un idioma en el que cada permutación de los caracteres del alfabeto es sintácticamente válida es el lenguaje de espacios en blanco , donde el alfabeto del idioma en sí consiste en espacio, tabulación y salto de línea.

Bart van Ingen Schenau
fuente
44
Además, dado que cualquier carácter que no sea un espacio en blanco se ignora como un comentario, no solo cada permutación de espacios en blanco, sino que de hecho, cada permutación de caracteres ASCII también es sintácticamente válida.
Jörg W Mittag
1
Para ser minucioso: si echamos un vistazo al tutorial de espacios en blanco , parece que una manipulación de pila [Espacio] no debe ir seguida de un carácter [Tabulador]. Pero supongo que será simple extender el lenguaje para estos casos especiales (por ejemplo, dándoles semántica sin operación).
Doc Brown
@docbrown, en los ejemplos veo secuencias de [Espacio] [Tabulador], así que no estoy seguro de dónde sacaste tu conclusión.
Bart van Ingen Schenau
@BartvanIngenSchenau: mire el tutorial: se introduce una manipulación de pila mediante un [Espacio] seguido de uno de los cuatro comandos posibles, que comienzan con otro [Espacio] o [LF]. La secuencia [Espacio] [Tab] puede ocurrir como parte de un número, o como parte de un comando diferente, por supuesto, pero un [Tab] no es un carácter válido después de un comando de pila introducido por [Espacio].
Doc Brown
0

¿Por qué conformarse con cadenas (de caracteres)? Debería reformular esa pregunta a "cualquier serie de tokens". No bits, los bits son tan informáticos del siglo XX.

Entonces, los bucles infinitos están bien, dices. ¿Qué pasa con la división por cero? Si eres lo suficientemente indulgente con tu definición de válido, puedes obtener un sí, pero la mayoría de las combinaciones aún no tendrían sentido. Entonces, diría que siempre puede obtener un programa técnicamente válido pero casi nunca un programa semánticamente válido.

Martin Maat
fuente
"Los bits son tan informáticos del siglo XX": ¿Qué quieres decir con esto?
Giorgio
Quiero decir que las cadenas, los caracteres y los bits son un detalle técnico, esencialmente estás hablando de instrucciones y operantes. La forma en que se implementan es irrelevante para la pregunta.
Martin Maat
Sí, pero esta observación era cierta incluso hace 50 años (los idiomas formales son aún más antiguos), por lo que todavía no estoy seguro de entender lo que quieres decir.
Giorgio
Solo quería llevar la pregunta a su esencia lógica. No se trata de cadenas o bytes, se trata de instrucciones y argumentos. ¿Puede mezclarlos de manera arbitraria y asegurarse de obtener un programa válido?
Martin Maat