¿Por qué las declaraciones en muchos lenguajes de programación terminan con punto y coma?

130

¿Hay alguna razón por la que se eligió un punto y coma como terminador de línea en lugar de un símbolo diferente?

Quiero saber la historia detrás de esta decisión, y espero que las respuestas conduzcan a ideas que puedan influir en las decisiones futuras.

    
pregunta A Coder 13.03.2012 - 10:37
fuente

14 respuestas

130

En inglés, el punto y coma se utiliza para separar elementos en una lista de declaraciones, por ejemplo

  

Ella vio a tres hombres: Jamie, que vino de Nueva Zelanda; John, el   hijo de lechero y George, un tipo demacrado de hombre.

Al programar, se están separando varias declaraciones y el uso de un punto final se puede confundir fácilmente con un punto decimal. El uso del punto y coma proporciona un método fácil de analizar para separar las declaraciones individuales del programa mientras se mantiene cerca de la puntuación normal en inglés.

Editar para agregar
En los primeros días, cuando la memoria era costosa, el procesamiento era lento y se estaban diseñando los primeros lenguajes de programación, era necesario dividir el programa en declaraciones separadas para su procesamiento. Algunos idiomas requerían que cada declaración se colocara en una línea para que el retorno de carro pudiera actuar como delimitador de la declaración. Otros idiomas permitieron un formato más libre para el diseño del texto y, por lo tanto, requerían un carácter delimitador específico. Este personaje fue elegido como punto y coma, probablemente debido a la similitud con su uso en el idioma inglés (esto tiene que ser una suposición; no estaba allí en ese momento) y como no lo era producir un conflicto con los otros signos de puntuación y símbolos que fueron requeridos para propósitos matemáticos u otros propósitos sintácticos.

Editar de nuevo
La necesidad de algún carácter de terminador vuelve a los requisitos para analizar el texto del idioma. Los primeros compiladores se escribieron en lenguaje ensamblador o, en algunos casos, directamente en las instrucciones de la máquina binaria. Tener un carácter especial que identifica el final de la declaración y delimita la porción de texto que se está procesando hace que el proceso sea mucho más fácil. Como dije anteriormente, otros idiomas han usado el retorno de carro o los soportes. El Algol, Pascal, Ada, BCPL, B, C, PL / M, y otras familias de idiomas usan el punto y coma. En cuanto a cuál fue el primero en usar este personaje en particular, no retrocedo lo suficiente en la historia para recordar. Su elección y adopción tiene perfecto sentido como

  • Su uso refleja el uso en la puntuación normal en inglés.
  • Otros caracteres (por ejemplo, la parada completa) podrían ser confusos ya que ya tienen un uso común (una parada completa también se usa como punto decimal).
  • Un carácter de puntuación visible permite el diseño de código de formato libre.
  • El uso de un carácter delimitador similar en idiomas derivados o posteriores se basa en la familiaridad adquirida por todos los programadores que han utilizado el lenguaje anterior.

Como observación final, creo que se ha dedicado más tiempo a estas respuestas y comentarios que al emplear el punto y coma para finalizar una declaración al diseñar el primer idioma que lo usó de esta manera.

    
respondido por el uɐɪ 13.03.2012 - 10:48
fuente
70

Muchos idiomas usan una sintaxis que se modela después de C (que fue modelada después de B - gracias @Crollster ). Como se puede ver en los comentarios, hay una larga cadena de tales lenguajes ... B se inspiró en PL / I, que fue precedido por ALGOL al usar el ; como separador.

Ya que en C el terminador de la sentencia es ; , estos idiomas siguen su ejemplo.

En cuanto a por qué se seleccionó como terminador de una declaración en C, posiblemente debido a su uso en inglés "para indicar declaraciones interdependientes" .

C también se inventó en el PDP-11 en un momento en que había una cantidad limitada de memoria disponible para los conjuntos de caracteres, por lo que los inventores de los idiomas tenían que trabajar dentro de estas restricciones.

    
respondido por el Oded 13.03.2012 - 10:42
fuente
54

FORTRAN utilizó el retorno de carro para delinear las declaraciones. COBOL utiliza el período. LISP no usó nada, confiando en paréntesis para todo. ALGOL fue el primer idioma en usar el punto y coma para separar las declaraciones. PASCAL siguió el ejemplo de ALGOL, usando el punto y coma para separar las declaraciones.

PL / I usé el punto y coma para terminar las declaraciones. Hay una diferencia, y se ve fácilmente en PASCAL. Ada siguió el liderazgo de PL / I en este artículo, en lugar de ALGOL.

El punto y coma como separador o terminador de declaraciones fue rápidamente aceptado por la comunidad informática como una notación útil y, que yo sepa, cada lenguaje subsecuente de bloques estructurados siguió el ejemplo de ALGOL y utilizó el punto y coma para separar o terminar las declaraciones.

Hace muchos años me dijeron que el BCPL usaba el punto de coma Y como separadores / terminadores de declaración, pero yo nunca usé el idioma y no puedo verificarlo. En algún momento, el uso del retorno de carro para separar o terminar las declaraciones se eliminó de los descendientes de BCPL. BCPL engendró B, B engendró C, C engendró C ++, Java, D y toda una serie de cosas considerablemente menos bien pensadas que PASCAL y Ada.

    
respondido por el John R. Strohm 13.03.2012 - 15:50
fuente
14
  

¿Por qué no cualquier otro símbolo?

Algunos idiomas han usado otros símbolos; las versiones antiguas de BASIC usaron dos puntos en su lugar, por ejemplo.

Sin embargo, ignorando las pocas excepciones, creo que hay dos razones principales. La primera es que simplemente estás buscando algo inequívoco. En un analizador típico, si se encuentra con un error lo suficientemente grave como para no poder continuar analizando la instrucción actual, normalmente intenta volver a sincronizar el analizador simplemente saltando al terminador de la instrucción y reiniciando el analizador desde el comienzo de la siguiente afirmación. Para eso, quieres algo que normalmente no aparecerá en ninguna otra parte del código, y un punto y coma es un símbolo con poco más significado, por lo que es muy fácil dedicarlo a este propósito.

La segunda razón es algo similar, pero está más dirigida a las personas que leen / usan el código. Nuevamente, vuelve al hecho de que el símbolo real que usa no importa mucho. Hay una ventaja sustancial en la legibilidad que puede obtener al usar el símbolo que su lector está acostumbrado a ver para un propósito en particular, cuando sea posible. Eso no significa que C sea la única sintaxis perfecta y todo lo demás debería seguirla servilmente, pero sí significa que hay suficientes personas familiarizadas con ese estilo de sintaxis que un lenguaje vagamente similar gana mucho (y pierde muy poco) al seguir más o menos la misma sintaxis donde puede.

Observaría que esto es muy parecido a diseñar casi cualquier otro programa. Si escribo un programa que usa ventanas de algún tipo, trataré de usar las características nativas de las plataformas de destino. Muchas de las decisiones que incorpora serán en gran medida arbitrarias, y podrían tomarse de manera diferente sin una gran pérdida de funcionalidad, pero igualmente, cambiarlas sin una ganancia importante en la funcionalidad solo confunde a los usuarios sin lograr nada útil. Los mismos principios básicos se aplican a "¿qué debe terminar (o separar) las declaraciones en un idioma?" como "cómo debería ser una barra de desplazamiento" o "cómo debería funcionar un control de árbol?" En todos estos casos, la decisión es en su mayoría arbitraria, y la uniformidad proporciona un beneficio sustancial en sí mismo.

Agregaría que lo mismo sucede en muchos idiomas, solo de la forma en que la mayoría de nosotros estamos tan acostumbrados antes de programar que pocas personas lo piensan. ¿Por qué todos usan "+" para indicar la suma o "-" para indicar la resta? Porque la forma del símbolo no importa mucho, pero todos los que aceptan aplicar el mismo significado a cada símbolo son muy importantes.

    
respondido por el Jerry Coffin 13.03.2012 - 16:47
fuente
7

El punto y coma se propuso originalmente en Algol 60 como una declaración separador , no un terminador.

Antes de Algol 60, el único lenguaje de programación de alto nivel existente era Fortran, que requería que cada declaración estuviera en una línea separada. Las declaraciones que abarcan varias líneas, como hacer bucles, se consideraron una rareza, y se consideraron como "bloques de instrucciones".

Los diseñadores de Algol 60 se dieron cuenta de que las declaraciones necesitaban una estructura jerárquica (if-then-else, do-loops, declaraciones de casos, etc.) y podrían estar anidadas una dentro de la otra. Por lo tanto, la idea de que cada afirmación se sentara en una línea separada ya no tenía sentido. Composición secuencial de las declaraciones de la forma S1; S2; ...; Sn opcionalmente encerrado en begin - end los corchetes se llamaron sentencias compuestas , y encajan en la estructura jerárquica de las sentencias contempladas por Algol 60. Por lo tanto, aquí , el punto y coma es claramente una declaración separator , no un terminador.

Esto dio lugar a problemas en la práctica. Algol 60 también tenía una "declaración vacía" que se denota al escribir nada. Por lo tanto, uno podría escribir " comenzar S1; terminar " donde el punto y coma aparece como si estuviera terminando S1. Pero el compilador Algol 60 realmente lo trató como un separador entre S1 y una declaración vacía invisible que lo sigue. Estas sutilezas eran demasiado para programadores prácticos. Al haber sido utilizados para lenguajes orientados a líneas como Assembly y Fortran, realmente pensaban en el punto y coma como un terminador de declaraciones. Cuando se escribieron los programas, por lo general, el punto y coma se colocó al final de las declaraciones, de este modo:

    a[i] := 0;
    i := i+1

y el punto y coma realmente parecía un terminador para la primera declaración. Si los programadores trataran el punto y coma como un terminador, entonces una declaración como esta daría un error de sintaxis:

    if i > 0 then
      a[i] := 0;
    else
      a[i] := 1;

porque el punto y coma termina el "if" y, por lo tanto, el "else" se vuelve colgando. Los programadores estaban completamente confundidos.

Entonces, PL / I, que fue el sucesor de IBM para Fortran orientado a la línea, decidió convertir el punto y coma en una declaración terminador en lugar de un separador. Los programadores estaban felices con esa elección. La mayoría de los lenguajes de programación siguieron su ejemplo. (Pascal se resistió a la tendencia, pero su sucesora Ada se dio por vencida).

[Nota agregada: Artículo de Wikipedia sobre comparaciones de lenguaje de programación tiene una buena tabla que resume cómo el punto y coma se trata en varios lenguajes de programación.]

    
respondido por el Uday Reddy 16.03.2012 - 12:54
fuente
6

Esto es un trabajo bastante simple, pero al observar un teclado QWERTY estándar restringido a valores ASCII, los caracteres naturales para la terminación / separación serían.!?,:; y retornos de carro. de esos??: debe ser descalificado inmediatamente para tomar varias claves y la terminación de la declaración va a ser una cosa muy común. Los períodos serían descalificados porque se confunden fácilmente con puntos decimales, lo que los haría innecesariamente complicados para ser un terminador dado el espacio limitado de las computadoras iniciales. los retornos de carro serían descalificados después de que las líneas de código pudieran ser más largas de lo que se puede mostrar en una sola línea en la pantalla, por lo que sería más difícil leer un programa cuando las líneas debían desplazarse horizontalmente o requerir caracteres adicionales cree una continuación en la siguiente línea que nuevamente agrega complejidad. esto deja, y; como opciones, de esas, se usa mucho más a menudo por escrito en comparación con; por lo que se elige el punto y coma porque es más fácil de escribir, menos confuso porque agrega un significado a un personaje con un significado limitado y menos complicado porque realmente no existen casos especiales con su uso.

Se eligió el punto y coma porque era el mejor personaje basado en la pereza y la simplicidad.

    
respondido por el Ryathal 13.03.2012 - 16:15
fuente
6

Es en gran parte una elección arbitraria. Algunos idiomas han hecho otras elecciones. COBOL termina las declaraciones con el carácter . . FORTRAN, BASIC y Python generalmente terminan las declaraciones con nuevas líneas (con una sintaxis especial para las declaraciones de varias líneas). Y Lisp pone entre paréntesis sus declaraciones entre paréntesis.

La razón principal por la que ; es tan popular como separador / terminador de declaraciones es que la mayoría de los idiomas populares de hoy en día se basan en ALGOL , que utilizó esa convención.

  

en lugar de un símbolo diferente?

¿Qué otro símbolo podrías elegir?

Los caracteres ASCII # $ @ [] ^ _ '{|} ~ no siempre estuvieron presentes en las primeras codificaciones de caracteres como ISO 646 .

Los caracteres ()*+-/<=> se usan normalmente como operadores matemáticos y crearían ambigüedades de análisis si se usan como terminadores de sentencias.

product = a * b *  // If '*' were a statement terminator,
c * d *            // Are there two factors, or four?

Problemas similares se aplicarían a ' y " , que normalmente se usan como delimitadores de cadena; , , que normalmente se usa para separar argumentos de función, y . , que generalmente se usa como un punto decimal (o como un delimitador en construcciones como some_struct.some_field ).

Eso deja a !%&:;? .

Elegir ! o ? probablemente no causaría problemas técnicos, pero su significado en inglés daría un estado de ánimo incorrecto al programa.

print(x)?  # Yes, you should.
           # It's an IMPERATIVE language; stop questioning my commands.
print(x)!  # OK!  You don't have to shout!

El & sería una opción más sensata como separador de declaración (no terminador), porque

do_thing_a() &
do_thing_b()

puede leerse como un comando para hacer la cosa A y luego hacer la cosa B. Pero la mayoría de los idiomas con un operador & lo usan como lógico o bitwise AND en su lugar.

El signo % puede causar confusión en declaraciones como interest_rate = 2.99% (lo que establecería la variable en 2.99 en lugar del 0.0299 esperado). Por supuesto, el conocido significado matemático de % no impidió que C lo utilizara como operador restante.

Eso deja a : y ; .

: es una opción sensata, y de hecho se usa como el separador de instrucciones dentro de la línea en la mayoría de los dialectos de BASIC.

Pero ; tiene la gramática inglesa en su lado; se puede utilizar para separar cláusulas dentro de una oración.

    
respondido por el dan04 29.03.2012 - 04:55
fuente
3

En lugar de intentar responder a tu pregunta del titular, creo que es mejor centrarse en tu pregunta implícita:

  

Quiero conocer la historia detrás de esta decisión, y espero que las respuestas conduzcan a ideas que puedan influir en las decisiones futuras en el diseño e implementación de lenguajes de programación.

Si desea obtener más información sobre el diseño del lenguaje de programación y el historial de implementación, y obtener más información sobre el proceso, consulte las instrucciones de Historia de las conferencias de lenguajes de programación es un muy buen lugar para comenzar. (Aunque creo que necesitará una membresía de ACM para poder acceder a los procedimientos).

  

¿Por qué las declaraciones en muchos lenguajes de programación terminan con punto y coma?   ¿Hay alguna razón por la que se eligió un punto y coma como terminador de línea en lugar de un símbolo diferente?

Tomando su pregunta del titular como una pregunta de ejemplo que tal vez quiera tratar de responder leyendo los procedimientos de HOPL, me gustaría ofrecer el siguiente punto: las personas que diseñan un nuevo lenguaje de programación usualmente lo hacen porque consideran los que Saber estar roto / deficiente de alguna manera. Su nuevo lenguaje está, por un lado, diseñado para corregir esta deficiencia. Por otro lado, los diseñadores de lenguajes también copiarán elementos de diseño de otros lenguajes que crean que son buenos, o simplemente no cambian aquellos elementos con los que no tuvieron problemas.

Especialmente la última parte es importante: en lugar de tratar de averiguar qué lenguaje de programación fue el primero en utilizar los puntos y coma como terminadores y por qué muchos otros lenguajes de programación lo copiaron, probablemente aprenderá más mirando los idiomas que no lo copió. Por ejemplo, mientras Smalltalk se inspiró mucho en Simula, no copió su sintaxis y, en particular, su uso de puntos y coma como terminadores de declaraciones. Cambió los terminadores (separadores en realidad) hasta el punto final, y usa el punto y coma para otra cosa. A la inversa, el primer idioma que alguna vez utilizó un punto y coma como terminador de una declaración puede haber tenido una razón para cambiar esto de lo que se usó en los idiomas anteriores. También es posible que haya sido el primer idioma que introdujo el concepto completo de terminador de una declaración (o lo hizo independientemente de otros idiomas) y que el punto y coma se usó por alguna razón que ahora se pierde en el tiempo. (Sospecho que este último es el caso aquí, ya que ninguno de los otros respondedores ha sido capaz de desenterrar una cita de la persona que introdujo el punto y coma en lugar de ofrecer suposiciones modificadas acerca de por qué el punto y coma fue una buena elección). punto, creo que aprenderá más observando por qué los diseñadores de idiomas cambiaron las cosas en lugar de por qué las copiaron / mantuvieron. Cuando las personas cambian las cosas, normalmente quieren o tienen que explicar el cambio, mientras que no lo hacen cuando copian o mantienen las cosas igual porque "¿por qué lo cambiaríamos? ¡así es como se hace! "

    
respondido por el Rinzwind 26.03.2012 - 14:38
fuente
2

Es sobre la visibilidad.

Los separadores de declaración temprana eran los '.' como en COBOL y nueva línea, retorno de carro en FORTRAN.

El CR demostró ser limitante porque dificulta el flujo de una declaración en varias líneas.

La parada completa causó un problema más interesante. Cuando lees el texto en inglés, tu cerebro procesa las paradas completas en un nivel subliminal, estás consciente de que una oración ha terminado y puedes hacer una pausa para respirar, pero realmente no te das cuenta de eso. Eso lo señaló. También en muchas fuentes el '.' es el carácter más pequeño posible a veces representado como un solo píxel. Los períodos extra o faltantes se convirtieron en la causa más común de errores en los programas COBOL.

Así que aprendiendo de los primeros errores, ALGOL elige un terminador específico que permita que una declaración fluya a lo largo de varias líneas y, elija uno que sea visible y que los lectores humanos puedan notar fácilmente. El punto y coma es lo suficientemente grande e inusual en inglés común para no ser procesado inconscientemente.

    
respondido por el James Anderson 28.03.2012 - 12:27
fuente
1

Entendí que se eligió porque era necesario un terminador de declaración explícito que no fuera un retorno de carro / nueva línea. En los días de las pantallas de 80 columnas, en realidad, tener una sola línea de código enrollado en varias líneas era lo suficientemente común como para que \ r o \ n no funcionara el terminador de la declaración.

Los puntos y coma eran simplemente convenientes porque no se usan en declaraciones de lógica / matemáticas. Como tales, no entran en conflicto con el contenido real de las declaraciones en una medida significativa.

Personalmente, creo que el uso continuado del punto y coma, junto con los requisitos de estilo para mantener las líneas de menos de 80 caracteres, es francamente estúpido y anacrónico. Los lenguajes como Python han demostrado ampliamente que puede escribir código fácil de entender y conciso más fácilmente sin ellos. Además, si tiene problemas con las líneas que tienen más de 80 caracteres, necesita un monitor más grande.

    
respondido por el Fake Name 13.03.2012 - 20:30
fuente
0

Aquí hay dos preguntas: por qué ALGOL obtuvo el punto y coma y por qué otros idiomas lo persiguieron.

La primera pregunta ya está respondida de muchas maneras aquí.

Como segundo, ALGOL se usó ampliamente como lenguaje pseudocódigo para la escritura de algoritmos. Entonces, los puntos y comas pronto se convirtieron en algo natural para los usuarios de diferentes idiomas. Y, naturalmente, fueron tomadas para los idiomas más jóvenes.

    
respondido por el Gangnus 09.01.2016 - 11:14
fuente
0

Podría estar equivocado, pero creo que esto tiene algo que ver con el hecho de que en muchos ensambladores se utilizó un punto y coma para iniciar un comentario, generalmente después de una instrucción. Todo después de un ; fue un comentario, y ya no forma parte de la instrucción en sí.

Luego es necesario terminar las instrucciones cuando las estás escribiendo en un intérprete. Las instrucciones breves (por ejemplo, expresiones matemáticas) podrían terminarse simplemente presionando la tecla Intro, indicando al intérprete que la expresión está lista para ser calculada y produjo un resultado. Pero a veces uno quería ingresar varias líneas de código para la instrucción, por lo que una forma de lograrlo era usar algún carácter especial como terminador de la instrucción en lugar de depender solo de la tecla Intro. De esta manera, el usuario podría ingresar más líneas de código a la vez, porque Intro todavía no lo envió al intérprete. Solo cuando el intérprete encontró el carácter de terminación en una línea ingresada con Enter, finalmente lo ejecutaría y calcularía su resultado.

Ahora combine estas dos cosas juntas, y el punto y coma parece ser una opción obvia para el carácter de terminación: indica dónde termina la parte de instrucción y comienza la parte de comentario, de modo que cuando el intérprete se encuentra en una línea, sabe que puede vaciar todas las líneas de la expresión que almacenó hasta ahora y ejecutarla, porque la instrucción acaba de terminar, ahora estamos en un comentario (bueno, al menos hasta el final de esta línea, porque la siguiente línea comenzará en el modo de código nuevamente, iniciando una nueva expresión / instrucción).

Esto supone, por supuesto, que fue realmente el punto y coma que se usó para los comentarios de la persona que propuso esta idea de reutilizarlo como terminadores de instrucciones. Habiendo sido cualquier otro personaje, podríamos haber terminado con un terminador de instrucción diferente.

Inb4: No, esta no es una cuenta histórica. No tengo ninguna evidencia de que esta sea la forma real en que los puntos y coma cobraron vida. Es justo como me imagino que posiblemente haya ocurrido.

    
respondido por el BarbaraKwarc 01.07.2018 - 07:12
fuente
-1

La mayoría de los idiomas tomaron el punto y coma porque ya estaba ampliamente en uso para ese propósito y el cambio no tiene sentido.

Y considerando los primeros idiomas para tomar esa decisión, tendrás que considerar cuáles son las alternativas. Al diseñar un idioma, desea que los caracteres necesarios estén disponibles, y los conjuntos de caracteres en este momento se codificaron en 6 bits, a menudo con algunos patrones reservados, a menudo con algunos caracteres no bien definidos (para una ocurrencia posterior, piense en el variantes nacionales de ISO-646: la variante de EE. UU. es bien conocida con el nombre ASCII, que reutiliza los códigos de los caracteres "comunes", como [ , # o $ , y observa el efecto en un contexto donde solo hay la mitad de las posiciones de código disponibles y las letras y los dígitos que reservan más de la mitad de ellos).

Probablemente no haya otro carácter que pueda usarse como separador de sentencias de forma intuitiva ( . probablemente ya sea el único contendiente serio para ese criterio) y sin introducir dificultades de análisis o análisis en un momento en el que la teoría del análisis y el análisis fue aún en proceso de elaboración ( . ahora está fuera de cuestión debido a su uso en números reales).

    
respondido por el AProgrammer 15.03.2012 - 15:55
fuente
-1

Otra razón por la que usar el punto y coma es porque es uno de los caracteres que no requerimos o usamos con más frecuencia.

Supongamos que lo usamos más a menudo como nombre de variable o algo así y si el punto y coma se hubiera usado como palabra clave o como operador, habría sido un conflicto de símbolos para el compilador, por lo tanto, era importante usar un símbolo que no se utiliza a menudo en la codificación.

Creo que los lenguajes de programación de estilo C lo hicieron popular y luego los autores de los nuevos lenguajes de programación no querían reinventar la rueda y continuaron usándola, hasta ahora.

    
respondido por el Basav 16.03.2012 - 14:34
fuente

Lea otras preguntas en las etiquetas