Punto y coma opcionales

10

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)?

Aber Kled
fuente
1
Debe pensar en los terminadores de declaraciones (perl, c) y los delimitadores de declaraciones (javascript, pascal).
55
En Python, los puntos y comas se pueden usar para separar varias declaraciones en la misma línea. Y dado que se permite una declaración "vacía", los puntos y comas pueden usarse al final de la mayoría de las declaraciones.
Greg Hewgill
1
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.
Izkata
1
@MichaelT: No creo que sus clasificaciones sean correctas: posiblemente Perl pertenece a ambos grupos, y JavaScript está realmente en el campo de "terminadores de declaraciones" (ya que las implementaciones son necesarias para inferir un punto y coma antes }o al final del archivo).
ruakh
Sí, absolutamente depende del idioma. Mi suposición personal sería que los puntos y comas son solo una especie de convención comúnmente aceptada, que la mayoría de los diseñadores de idiomas siguen. Al menos tiene sentido desde un punto de vista del lenguaje más natural. Lo mismo ocurre con {y} para los bloques, por cierto: son utilizados por muchos idiomas, sin embargo, no todos y, en realidad, no tiene que hacer esto. No hay una razón universal detrás de esto.
JensG

Respuestas:

24

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.

Robert Harvey
fuente
77
@RobertHarvey Heretic! Debe haber una forma obvia de hacerlo y solo una. Por cierto, solo hay una forma de hacerlo en perl.
1
Por cierto, algunos idiomas tienen una buena cantidad de redundancia en las gramáticas en general, por lo que hacer que el punto y coma sea opcional solo ocasionalmente es ambiguo en la práctica. Dicho esto, creo que el punto y coma es la redundancia equivocada que se debe eliminar; me gusta bastante Haskell, donde se eliminan los paréntesis y las comas para los argumentos. OK, también puedes soltar el punto y coma en Haskell, pero en realidad no es lo mismo que Javascript.
Steve314
2
IIRC el problema es que no se ajustan al modelo formal pero que los generadores de analizadores no producen buenos mensajes de error. Es decir, tienen un conocimiento limitado de errores comunes, mientras que el analizador escrito a mano puede obtener mensajes de error mucho más útiles. Gcc, por ejemplo, solía usar bison para la gramática C. Del mismo modo, el problema es que los 'casos límite' no son casos extremos formales sino blandos, es decir, para el analizador sintáctico, el AST es claro y para los humanos el AST 'es claro', pero no están de acuerdo en cómo es el AST.
Maciej Piechotka
2
@Maciej Piechotka: no quise dar a entender que los padres eran opcionales en Haskell. Estoy hablando de dejar caer algo redundante como una decisión de diseño del lenguaje. El punto es que no usas parens o comas para una llamada de función en Haskell. Usted puede pasar una tupla como argumento, pero que aún así es la sintaxis de una tupla, no para pasar argumentos. Haskell (y ML y otros) "descartaron" los paréntesis y las comas para argumentos de función en el sentido de que existe esta convención común en otros idiomas (¿desde Algol?), Pero Haskell no hace eso.
Steve314
1
@Maciej Piechotka - Por supuesto, nunca fue realmente una convención universal de todos modos, solo porque los idiomas de la familia Algol lo hagan no significa que otros idiomas se definan a sí mismos en relación con eso, por lo que mi afirmación "descartada" es incorrecta en ese sentido, pero con todo los lenguajes de la familia C en estos días se siente un poco así.
Steve314
15

JavaScript nos ha demostrado que esta es una muy mala idea. Por ejemplo:

return
0;

En C, esto devuelve un valor de 0. En JavaScript, esto regresa undefinedporque 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.

Mason Wheeler
fuente
1
@delnan: Python no está diseñado para parecerse a C. Es bien conocido por estar basado en sangría y, por lo tanto, altamente orientado a líneas, y no requiere punto y coma. JavaScript técnicamente hace requerir ellas; inserta uno cuando encuentra que falta uno, lo que transforma lo que parece una declaración sintácticamente válida en dos declaraciones distintas con una semántica completamente diferente.
Mason Wheeler
77
No es una mala idea, es confuso para las personas que intentan usar JavaScript sin molestarse en aprender sobre su inserción automática de punto y coma . Quizás, en lugar de decir "esta es una muy mala idea", podría decir con mayor precisión "hacer que el punto y coma sea opcional introduce dificultades para los programadores que no salen y aprenden todos los detalles".
TehShrike
44
@delnan: La razón por la que es sorprendente es que JavaScript generalmente no inserta un punto y coma al final de una línea, excepto para arreglar un programa que de otra manera no sería válido. Después returnes 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.)
ruakh
66
@TehShrike: Hacer que el punto y coma sea opcional introduce dificultades para todos los programadores, porque interpreta arbitrariamente los errores tipográficos en lugar de preguntarte qué quieres decir. Todo el mundo hace un error tipográfico de vez en cuando.
Jan Hudec
1
javascript ha demostrado que su implementación de puntos y comas opcionales es defectuosa. No muestra que los puntos y comas opcionales sean malos per se.
CodesInChaos
4

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 whitespacetoken y su analizador puede manejarlo bien.

Por ejemplo, intente insertar los punto y coma en la siguiente serie de sentencias en C.

functionCall(3, 4) 9 + (3 / 8) variable++ while(1) { printf("Hello, world\n") }

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 un newline_or_semicolonno terminal.

Karl Bielefeldt
fuente
Cuando C se desarrolló originalmente a principios de la década de 1970, se necesitaban terminadores de declaración para simplificar los compiladores. A mediados de los 90, cuando se desarrolló Javascript, ya no era una preocupación.
Sean McSomething
3

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,

functionCall(3, 4) 9 + (3 / 8) variable++ while(1) { printf("Hello, world\n") }

imagina que escribiste un par abierto adicional:

functionCall((3, 4) 9 + (3 / 8) variable++ while(1) { printf("Hello, world\n") }

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.

functionCall((3, 4);  <- something is wrong here. emit error and keep going.
                      9 + (3 / 8); variable++; while(1) { printf("Hello, world\n"); }

Ahora es más fácil en el analizador informar un error, y más fácil localizar la línea / columna donde ocurrió.

Mark Lakata
fuente
1
Fortran y Basic al menos tienen marcadores de continuación de línea elegidos decentemente (& y _, respectivamente). Por puro ""
Dios mío
2

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:

--One statement per line
x = 1
y = 2

--Multiple statements per line
x = 1 y = 2

--You can add semicolons if you want but its just for clarity:
x = 1; y = 2
hugomg
fuente
0

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.

HeadphoneHaxZ
fuente