Na maioria das vezes, em uma linguagem imperativa de uso geral - ponto-e-vírgula como delimitadores de declaração é necessário ou completamente proibido (por exemplo, C e Python).
No entanto, alguns idiomas, como JavaScript, permitem optar por não delimitar suas instruções com ponto e vírgula, em favor de outros delimitadores (como uma nova linha).
Quais são as decisões de design por trás disso? Entendo que ponto-e-vírgula é essencial ao escrever várias instruções na mesma linha, mas existe outro motivo para torná-las obrigatórias (exceto após C)?
programming-languages
syntax
Aber Kled
fonte
fonte
I understand that semicolons are essential when writing multiple statements on the same line
- Depende do idioma. Meu favorito não tem esses delimitadores, a próxima declaração começa quando todos os argumentos de função foram usados.}
ou no final do arquivo).Respostas:
Torná-los obrigatórios (ou proibi-los completamente) reduz o número de casos de canto, elimina uma fonte potencial de erros obscuros e simplifica o design do compilador / intérprete.
Os designers de idiomas que optaram por torná-los opcionais optaram por viver com a ambiguidade em troca de maior flexibilidade sintática.
fonte
JavaScript nos mostrou que esta é uma péssima idéia. Por exemplo:
Em C, isso retorna um valor 0. No JavaScript, isso retorna
undefined
porque um ponto-e-vírgula é inserido após a declaração de retorno, e não é imediatamente óbvio o motivo pelo qual o código está sendo quebrado, a menos que você saiba sobre os detalhes da inserção automática de ponto e vírgula.fonte
return
é um dos poucos casos em que o JavaScript insere um ponto e vírgula, mesmo que o programa seja válido sem ele. (Mas, claro, isso compromete o ponto de Mason Wheeler O problema não é que as vírgulas são opcionais, é que as regras são inconsistentes..)Simplifica um pouco a gramática e o analisador para tornar os pontos e vírgulas obrigatórios. Essencialmente, ele permite ao lexer despejar todo o espaço em branco, incluindo novas linhas, e o analisador não precisa se preocupar com isso.
Por outro lado, quando você começa a querer contar ao analisador sobre espaço em branco de qualquer maneira, não é tão difícil tornar os pontos e vírgulas opcionais. Geralmente, você pode agrupá-los com um
whitespace
token e seu analisador pode lidar com isso muito bem.Por exemplo, tente inserir o ponto-e-vírgula na seguinte série de instruções C.
Embora existam algumas coisas estranhas que você não possa mais fazer, como
while(1);
na maioria das vezes, é relativamente fácil com as técnicas modernas de análise determinar onde as instruções terminam sem um delimitador específico. Mesmo se você ainda deseja permitir coisas estranhas, não é tão difícil criar umnewline_or_semicolon
terminal.fonte
Os pontos e vírgulas são úteis na gramática por 2 razões. Primeiro, ele permite que você divida longas declarações em várias linhas sem ter caracteres de continuação legais (estou falando de você, Fortran e Basic). Segundo, vamos permitir que o analisador "desista" da análise quando a sintaxe fica realmente complicada devido a um erro de digitação. Roubando do exemplo de Karl Bielefeldt,
imagine que você digitou um parêntese extra aberto:
agora onde está o erro? Se você tivesse o ponto e vírgula, é mais fácil para o analisador desistir no primeiro ponto e vírgula. Poderia até continuar analisando após o ponto e vírgula, se quisesse.
Agora é mais fácil no analisador relatar um erro e mais fácil localizar a linha / coluna onde ocorreu.
fonte
Ponto-e-vírgula nem sempre é tudo ou nada como você mencionou na sua pergunta. Por exemplo, a gramática de Lua é cuidadosamente projetada para ser de forma livre (todos os espaços em branco, incluindo novas linhas, podem ser ignorados), mas também sem a necessidade de usar ponto e vírgula. Por exemplo, os seguintes programas são equivalentes:
fonte
Tirando todo o design e construção, acredito que muitos programadores vêm de diferentes origens e alguns aprenderam a usar o ponto-e-vírgula e outros não. Muitos idiomas mais novos que estão surgindo não exigem ponto e vírgula, mas ainda permitem que ele exista. Eu acho que pode ser apenas uma maneira de conseguir que mais programadores aprendam a codificar nessas novas linguagens sem ter que abandonar seus hábitos a partir de quando começaram.
fonte