É possível criar uma linguagem que não tenha erros de sintaxe? [fechadas]

14

Em outras palavras, um idioma em que todas as sequências possíveis são sintaxe válida?

EDIT : Esta é uma questão teórica.
Não tenho interesse em usar esse idioma; Só estou perguntando se é possível.

Edição adicional

Fui adiante com um design dessa linguagem. Veja ErrorFree

SLaks
fonte
2
Se pudéssemos fazer isso, teríamos criado a IA.
Michael K
5
@ Michael: Não; Acho que não.
SLaks
7
!!! Perl !!!
8
Eu me oponho fortemente à questão de ser encerrada! Não é subjetivo nem construtivo !!!
Felix Dombek
1
por que não usar uma linguagem assembly com: exatamente 256 instruções, 128 registros e uma sintaxe geral de instruction operand*, onde um operando pode ser um registro ou um número entre 0-127 (e tudo acima que é tratado como um registro) e se um operando está faltando para uma instrução de várias regiões, '0' é assumido.
Felix Dombek

Respostas:

8

Sim, se você olhar para isso de uma maneira muito analítica, criando uma máquina de Turing determinística que sempre para em um bom estado final para cada sequência de caracteres de um determinado idioma, demonstrará que isso é possível. A demonstração é bem simples, você deve ter uma TM regular com uma função de transição com apenas uma transição, que se parece com isso:

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

Demonstrou-se que uma TM possui o mesmo poder de computação que qualquer computador da vida real, então isso é absolutamente possível

guiman
fonte
1
O que diabos isso significa para nós, leigos comuns? O que é 'w', 'e', ​​'L', 'q', 'Q', 'Qa', 'Qr', 'F', 'TF'. Sem nenhum desses definidos, não tenho um quadro de referência.
Berin Loritsch
1
Desculpe, mas não há uma maneira fácil de explicar a abordagem da Máquina de Turing para esta resposta. Verifique este link para esclarecer um pouco: en.wikipedia.org/wiki/Turing_machine
guiman
16

Sim, é claro que é possível, é até trivialmente fácil.

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

Eu não entendo como alguém pode dizer "não". Dito isso, pode ser um pouco difícil definir uma semântica significativa para esse idioma, mas isso também é possível. Basta olhar para o espaço em branco .

user281377
fonte
Então, se o idioma o ignora, é um systax válido? e "tabtabspace" não é uma string válida?
Michael K
1
A semântica da língua era o meu problema, mas não posso discuti-la sem que ela se desvie da filosofia / lingüística adequada.
StuperUser
2
Michael: Exatamente. Tudo é sintaticamente válido, mas pode ser um NOP (não tem significado especial). Nada de errado com uma linguagem que ignora muitas coisas. Veja todas as coisas que C ignora neste programa de exemplo: int main () {3 ;;; / * comment * /}
user281377 19/01/11
Muitas pessoas dizem "não" porque não têm distinção conceitual entre sintaxe e semântica. "Não compila? Deve haver um erro de sintaxe, então!"
fredoverflow
Muitas pessoas dizem "não" porque não há um significado real nisso. Assim que você adiciona estrutura (ou seja, mais do que uma regra de análise auto recursiva), você tem o conceito de sintaxe. A violação da estrutura é um erro induzido pela sintaxe. O erro induzido pela sintaxe é um erro de sintaxe, independentemente de o analisador sinalizar como tal ou não.
Berin Loritsch
5

Eu acho que depende do que você quer dizer com sintaxe válida.

Você pode criar um idioma que aceite qualquer string, mas ignore qualquer coisa que não tenha sido prescrita com significado específico. Isso é basicamente o equivalente a dizer "Eu vou me livrar dos erros de sintaxe, mas dizendo que eles não são erros" - bastante inútil e extremamente indesejável por vários motivos.

Além disso, a única maneira de você ter uma linguagem que não possui erros de sintaxe seria fazer com que todas as sequências possíveis tivessem uma instrução / uso válido associado a ela. A única maneira de ver isso seria ter todas as operações como caracteres únicos e garantir que cada caractere tivesse uma operação atribuída a ele.

Há um milhão de coisas erradas nisso - obviamente não há palavras reservadas, é tudo sobre o local em que é usado no contexto e, como resultado, seria basicamente ilegível e, embora imune a erros de sintaxe, seria muito mais provável que você experimentasse qualquer outro tipo de erro.

Teoricamente possível (a AmmoQ coloca muito mais claramente do que eu), mas totalmente indesejável.

Jon Hopkins
fonte
Eu li que o TECO era assim, cada personagem sendo atribuído a um significado.
David Thornley
3
O código da máquina funciona dessa maneira. Toda combinação possível de bytes pode ser vista como um programa que faz alguma coisa , mesmo que tudo isso esteja causando uma interrupção.
precisa saber é o seguinte
David, era isso que eu estava pensando, muito TECO. Embora a entrada do IIRC TECO possa conter erros de sintaxe. Mas demonstra a dificuldade de uma linguagem tão densa - muito difícil de ler e propensa a erros difíceis de entender.
Omega Centauri
@ user281377: No 6502, existem algumas instruções sem significados definidos. Alguns têm comportamentos consistentes, úteis e não estão disponíveis com nenhuma instrução documentada (o meu favorito é apelidado de "DCP" - diminui um endereço de memória e compara o resultado com o acumulador, configurando sinalizadores adequadamente), mas alguns têm comportamentos que dependem de tempos de barramento de maneiras estranhas e bizarras, e alguns travarão o processador com força suficiente para exigir uma redefinição (mesmo uma interrupção "não mascarável" não ajudará). Eu acho que as últimas instruções podem ser consideradas "erros de sintaxe".
Supercat
5

O código em uma linguagem de programação não baseada em texto pode não ter erros de sintaxe.

Estou pensando em uma linguagem visual como BYOB . Você não pode digitar acidentalmente "se x ten else foo" porque a "sintaxe" é definida por blocos gráficos.

LennyProgrammers
fonte
3

O próprio objetivo da sintaxe é diferenciar entre válido e não válido de uma maneira que seja mais rápida e eficaz do que executar o código. Sintaxe é apenas uma otimização, o que entra e o que entra na semântica é arbitrário.

Geralmente, você quer o oposto: para estender a sintaxe o máximo possível para economizar mais tempo, mas é claro que você também pode omitir completamente a sintaxe e declarar todos os erros semânticos: você terminará com um intérprete não-tokenizador.

biziclop
fonte
0

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

Então, o que isso significa?

Desde que a linguagem tenha estrutura e gramática, sempre haverá o conceito de erro de sintaxe. A questão é se você aplica ou não. As pessoas cometem erros, e os erros de sintaxe são o que a maioria dos designers de linguagem busca para ajudar os programadores a evitar erros estúpidos.

Um erro de sintaxe é um erro introduzido por programadores que escrevem código que não tem significado para o idioma.

É impossível se livrar dos erros de sintaxe com base na definição acima. Todos nós identificamos erros de ortografia, todos nós escrevemos erros de nomes de métodos. Ter a linguagem silenciosamente aceitando o erro de ortografia e felizmente não fazer nada não é minha ideia de uma experiência agradável.

É possível criar um idioma que possa usar qualquer caractere unicode válido (ou sequência de caracteres) como identificadores. Existem desafios, como normalizar caracteres equivalentes / seqüências de caracteres para que sejam reconhecidos como a mesma coisa - mas é possível. NOTA: existem quatro tipos padrão de normalização unicode .

Berin Loritsch
fonte
1
A necessidade de estrutura não requer uma gramática. Considere Piet onde a estrutura está na posição do personagem (ou cor) em uma grade, e não sua relação com outros caracteres em um morfema.
Mike Samuel
1
Violar a estrutura e o que acontece?
Berin Loritsch 19/01