¿Es posible diseñar un lenguaje que no tenga errores de sintaxis? [cerrado]

14

En otras palabras, ¿un lenguaje donde cada cadena posible es una sintaxis válida?

EDITAR : Esta es una pregunta teórica.
No tengo interés en usar ese lenguaje; Solo pregunto si es posible.

Editar más

Seguí adelante y diseñé tal lenguaje. Ver ErrorFree

SLaks
fuente
2
Si pudiéramos hacer eso, habríamos creado IA.
Michael K
55
@ Michael: No; No lo creo.
SLaks
77
!!! Perl !!!
8
¡Me opongo firmemente a que se cierre la pregunta! ¡No es subjetivo ni constructivo!
Felix Dombek
1
¿por qué no tomar un lenguaje ensamblador con: exactamente 256 instrucciones, 128 registros y una sintaxis general de instruction operand*, donde un operando puede ser un registro o un número entre 0-127 (y todo lo anterior que se trata como un registro) y si un operando falta para una instrucción multi-arity, se supone '0'.
Felix Dombek

Respuestas:

8

Sí, si observa esto de una manera muy analítica creando una máquina de Turing determinista que siempre se detiene en un buen estado final para cada cadena de un determinado idioma, entonces habrá demostrado que es posible. La demostración es bastante sencilla, debe tener una TM regular con una función de transición con una sola transición, que se ve así:

TF(w,q) -> (w,Qa) 

Considerations:
    L = { w | w is any possible string }
    w e L
    q e Q
    F is a set with all good final states {Qa,Qr}
    Qa e F

Se ha demostrado que una TM tiene la misma potencia informática que cualquier computadora de la vida real, por lo que esto es absolutamente posible.

Guiman
fuente
1
¿Qué significa esto para nosotros, laicos comunes? ¿Qué es 'w', 'e', ​​'L', 'q', 'Q', 'Qa', 'Qr', 'F', 'TF'? Sin ninguno de estos definidos no tengo marco de referencia.
Berin Loritsch
1
Lo sentimos, pero no hay una manera fácil de explicar el enfoque de Turing Machine para esta respuesta. Consulte este enlace para aclarar un poco: en.wikipedia.org/wiki/Turing_machine
guiman
16

Sí, por supuesto que es posible, incluso es trivialmente fácil.

<programm> ::= char | char <program> |

No entiendo cómo alguien puede decir "no". Dicho esto, puede ser bastante difícil definir una semántica significativa para dicho lenguaje, pero eso también es posible. Solo mira el espacio en blanco .

usuario281377
fuente
Entonces, si el idioma lo ignora, ¿es una sintaxis válida? y no es "tabtabspace" una cadena válida?
Michael K
1
La semántica del lenguaje fue mi problema con él, pero realmente no puedo discutirlo sin desviarlo del tema a la filosofía / lingüística propiamente dicha.
StuperUser
2
Michael: exactamente. Todo es sintácticamente válido, pero posiblemente puede ser un NOP (no tiene un significado especial). No hay nada de malo en que un lenguaje ignore muchas cosas. Solo observe todas las cosas que C ignora en este programa de ejemplo: int main () {3 ;;; / * comentario * /}
usuario281377
Muchas personas dicen "no" porque no tienen distinción conceptual entre sintaxis y semántica. "¿No se compila? ¡Entonces debe ser un error de sintaxis!"
fredoverflow
Mucha gente dice "no" porque no hay un significado real en esto. Tan pronto como agregue la estructura (es decir, más que una regla de análisis auto recursiva) tendrá el concepto de sintaxis. La violación de la estructura es un error inducido por la sintaxis. El error inducido por la sintaxis es un error de sintaxis, ya sea que el analizador lo marque como tal o no.
Berin Loritsch
5

Supongo que depende de lo que quieras decir con sintaxis válida.

Puede diseñar un lenguaje que acepte cualquier cadena pero ignore cualquier cosa a la que no se le haya prescrito un significado específico. Esto es básicamente el equivalente a decir "Me libraré de los errores de sintaxis pero decir que no son errores", bastante inútil y muy indeseable por muchas razones.

Más allá de eso, la única forma en que podría tener un lenguaje que no tuviera errores de sintaxis sería hacer que cada cadena posible tenga una instrucción / uso válido asociado. La única forma en que puedo hacer eso es tener todas las operaciones como caracteres individuales y asegurarme de que cada personaje tenga una operación asignada.

Hay un millón de cosas mal con esto: obviamente no hay palabras reservadas, se trata de dónde se usa en contexto y, como resultado, sería básicamente ilegible y, mientras que los inmunes a los errores de sintaxis serían mucho más propensos a experimentar cualquier otro tipo de error

Tan teóricamente posible (AmmoQ lo pone mucho más ordenadamente que yo) pero completamente indeseable.

Jon Hopkins
fuente
He leído que TECO era así, a cada personaje se le asigna un significado.
David Thornley
3
El código de máquina funciona más o menos de esa manera. Cada combinación posible de bytes puede verse como un programa que hace algo , incluso si todo lo que hace es causar una interrupción.
user281377
David, eso es lo que estaba pensando, muy TECO. Aunque la entrada IIRC TECO podría contener errores de sintaxis. Pero demuestra la dificultad de un lenguaje tan denso, muy difícil de leer y propenso a errores difíciles de entender.
Omega Centauri
@ user281377: En el 6502, hay bastantes instrucciones sin significados definidos. Algunos tienen comportamientos que son consistentes, útiles y no están disponibles con ninguna instrucción documentada (mi favorito es apodado "DCP" - disminuir una dirección de memoria y comparar el resultado con el acumulador, estableciendo los indicadores adecuadamente), pero algunos tienen un comportamiento que depende de tiempos de bus de formas extrañas y extrañas, y algunos bloquearán el procesador lo suficientemente fuerte como para requerir un reinicio (incluso una interrupción "no enmascarable" no ayudará). Creo que las últimas instrucciones podrían considerarse "errores de sintaxis".
supercat
5

El código en un lenguaje de programación no basado en texto puede no tener errores de sintaxis.

Estoy pensando en un lenguaje visual como BYOB . No puede escribir accidentalmente "if x ten else foo" porque la "sintaxis" está definida por bloques gráficos.

LennyProgrammers
fuente
3

El propósito mismo de la sintaxis es diferenciar entre válido y no válido de una manera más rápida y efectiva que ejecutar el código. La sintaxis es solo una optimización, lo que entra y lo que entra en la semántica es arbitrario.

Por lo general, desea todo lo contrario: hacer que la sintaxis se extienda lo más posible para ahorrar más tiempo, pero, por supuesto, también puede omitir la sintaxis por completo y declarar que cada error es semántico: terminará con un intérprete no tokenizador.

biziclop
fuente
0

Ahbefiasdlk aslerhsofa; f jwi [asdfasdf] aew / & Q! @ # $} {;-P

¿Entonces que significa eso?

Mientras el lenguaje tenga estructura y gramática, siempre existirá el concepto de un error de sintaxis. La pregunta es si lo haces cumplir o no. La gente cometerá errores, y los errores de sintaxis son lo que buscan la mayoría de los diseñadores de idiomas para ayudar a los programadores a evitar errores estúpidos.

Un error de sintaxis es un error introducido por los programadores que escriben código que no tiene significado para el lenguaje.

Es imposible deshacerse de los errores de sintaxis basados ​​en la definición anterior. Todos hemos identificado incorrectamente los identificadores, todos hemos escrito incorrectamente los nombres de los métodos. Que el lenguaje acepte silenciosamente la falta de ortografía y no haga nada felizmente no es mi idea de una experiencia agradable.

Es posible diseñar un lenguaje que pueda usar cualquier carácter Unicode válido (o secuencia de caracteres) como identificadores. Existen desafíos, como la normalización de caracteres equivalentes / secuencias de caracteres para que sean reconocidos como lo mismo, pero es posible. NOTA: hay cuatro tipos estándar de normalización unicode .

Berin Loritsch
fuente
1
La necesidad de estructura no requiere una gramática. Considere Piet donde la estructura está en la posición del personaje (o color) en una cuadrícula, no su relación con otros personajes en un morfema.
Mike Samuel
1
Violar la estructura y ¿qué pasa?
Berin Loritsch