En la mayoría de los casos, en un lenguaje imperativo de propósito general, los puntos y comas como delimitadores de declaraciones son obligatorios o no se permiten por completo (por ejemplo, C y Python).
Sin embargo, algunos idiomas, como JavaScript, le permiten optar por no delimitar sus declaraciones con punto y coma, a favor de otros delimitadores (como una nueva línea).
¿Cuáles son las decisiones de diseño detrás de esto? Entiendo que los puntos y comas son esenciales al escribir varias declaraciones en la misma línea, pero ¿hay alguna otra razón para hacerlas obligatorias (excepto después de C)?
programming-languages
syntax
Aber Kled
fuente
fuente
I understand that semicolons are essential when writing multiple statements on the same line
- Depende del idioma. Mi favorito no tiene tales delimitadores en absoluto, la siguiente declaración comienza cuando todos los argumentos de función se han agotado.}
o al final del archivo).Respuestas:
Hacerlos obligatorios (o rechazarlos por completo) reduce el número de casos de esquina, elimina una fuente potencial de errores oscuros y simplifica el diseño del compilador / intérprete.
Los diseñadores de idiomas que han optado por hacerlos opcionales han elegido vivir con la ambigüedad a cambio de una mayor flexibilidad sintáctica.
fuente
JavaScript nos ha demostrado que esta es una muy mala idea. Por ejemplo:
En C, esto devuelve un valor de 0. En JavaScript, esto regresa
undefined
porque se inserta un punto y coma después de la declaración de devolución, y no es inmediatamente obvio por qué su código se está rompiendo a menos que conozca los detalles de la inserción automática de punto y coma.fuente
return
es uno de los pocos casos en los que JavaScript insertará un punto y coma, incluso si el programa fuera válido sin él. (Pero, por supuesto, esto socava el punto de Mason Wheeler. El problema no es que los puntos y comas sean opcionales, es que las reglas son inconsistentes.)Simplifica un poco la gramática y el analizador para que los puntos y comas sean obligatorios. Básicamente, le permite al lexer volcar todo el espacio en blanco, incluidas las nuevas líneas, y el analizador no tiene que preocuparse en absoluto.
Por otro lado, una vez que comience a querer decirle al analizador sobre espacios en blanco de todos modos, no es tan difícil hacer que los puntos y comas sean opcionales. A menudo puede agruparlos con un
whitespace
token y su analizador puede manejarlo bien.Por ejemplo, intente insertar los punto y coma en la siguiente serie de sentencias en C.
Si bien hay algunas cosas raras que ya no puede hacer, como
while(1);
, en su mayor parte, es relativamente fácil con las técnicas modernas de análisis para determinar dónde terminan las declaraciones sin un delimitador específico. Incluso si todavía quieres permitir cosas extrañas, no es tan difícil hacer unnewline_or_semicolon
no terminal.fuente
Los punto y coma son útiles en una gramática por 2 razones. Primero, le permite dividir declaraciones largas en varias líneas sin tener caracteres de continuación graciosos (estoy hablando de usted, Fortran y Basic). En segundo lugar, permite que el analizador tenga una forma de "abandonar" el análisis cuando la sintaxis se vuelve realmente complicada debido a un error tipográfico. Robando del ejemplo de Karl Bielefeldt,
imagina que escribiste un par abierto adicional:
ahora donde esta el error? Si tenía los puntos y comas, es más fácil para el analizador darse por vencido en el primer punto y coma. Incluso podría continuar analizando después del punto y coma si quisiera.
Ahora es más fácil en el analizador informar un error, y más fácil localizar la línea / columna donde ocurrió.
fuente
Los punto y coma no siempre son todo o nada como usted menciona en su pregunta. Por ejemplo, la gramática de Lua está cuidadosamente diseñada para ser de forma libre (se pueden ignorar todos los espacios en blanco, incluidas las nuevas líneas), pero también sin necesidad de utilizar punto y coma. Por ejemplo, los siguientes programas son equivalentes:
fuente
Dejando de lado todo diseño y construcción, creo que muchos programadores provienen de diferentes entornos y algunos aprendieron a usar el punto y coma y otros no. Muchos idiomas más nuevos que están surgiendo no requieren un punto y coma, pero aún así permiten que exista. Creo que podría ser una forma de hacer que más programadores aprendan a codificar en estos nuevos idiomas sin tener que abandonar sus hábitos desde el principio.
fuente