Existe uma razão para que um ponto-e-vírgula tenha sido escolhido como terminador de linha em vez de um símbolo diferente?
Quero conhecer a história por trás dessa decisão e espero que as respostas levem a insights que possam influenciar decisões futuras.
programming-languages
syntax
Um codificador
fonte
fonte
Respostas:
Em inglês, o ponto-e-vírgula é usado para separar itens em uma lista de instruções, por exemplo
Ao programar, você está separando várias instruções e usando um ponto final, pode ser facilmente confundido com um ponto decimal. O uso do ponto-e-vírgula fornece um método fácil de analisar para separar as instruções individuais do programa, mantendo-se próximo da pontuação normal em inglês.
Editar para adicionar
Nos primeiros dias em que a memória era cara, o processamento era lento e as primeiras linguagens de programação eram criadas, era necessário dividir o programa em instruções separadas para processamento. Alguns idiomas exigiam que cada instrução fosse colocada em uma linha para que o retorno de carro pudesse atuar como delimitador de instrução. Outros idiomas permitiram um formato mais livre ao layout do texto e, portanto, exigiram um caractere delimitador específico. Esse personagem foi escolhido para ser o ponto-e-vírgula, provavelmente devido à semelhança com o uso no idioma inglês (isso deve ser uma suposição; eu não estava lá na época) e porque não produziu um conflito com a outra pontuação marcas e símbolos necessários para fins matemáticos ou outros fins sintáticos.
Editar novamente
A necessidade de algum caractere terminador remonta aos requisitos para analisar o texto do idioma. Os primeiros compiladores foram escritos em linguagem assembly ou, em alguns casos, diretamente nas instruções de máquina binária criadas manualmente. Ter um caractere especial que identifique o final da instrução e delimite a parte do texto que está sendo processada facilita muito o processamento. Como eu disse acima, outros idiomas usaram o retorno de carro ou os colchetes. Algol, Pascal, Ada, BCPL, B, C, PL / M e outras famílias de idiomas usam o ponto e vírgula. Quanto a quem foi o primeiro a usar esse personagem em particular, não volto na história o suficiente para lembrar. Sua escolha e adoção faz todo sentido, pois
Como observação final, acho que houve mais tempo gasto nessas respostas e comentários do que na decisão de usar o ponto-e-vírgula para encerrar uma declaração ao projetar o primeiro idioma que o usava dessa maneira.
fonte
Muitos idiomas usam sintaxe modelada após C (que foi modelada após B - obrigado @Crollster). Como pode ser visto nos comentários, há uma longa cadeia de tais idiomas ... B foi inspirado no PL / I, que foi precedido pela ALGOL ao usar o
;
como separador.Como em C o terminador da declaração é
;
, esses idiomas seguem o exemplo.Quanto ao motivo pelo qual foi selecionado como terminador de declaração em C - possivelmente por causa de seu uso em inglês "para indicar declarações interdependentes" .
C também foi inventado no PDP-11 em um momento em que havia uma quantidade limitada de memória disponível para conjuntos de caracteres; portanto, os inventores das línguas tiveram que trabalhar dentro dessas restrições.
fonte
FORTRAN usou o retorno de carro para delinear instruções. Período utilizado COBOL. O LISP não usou nada, contando com parênteses para tudo. ALGOL foi o primeiro idioma a usar ponto e vírgula para separar as declarações. O PASCAL seguiu o exemplo da ALGOL, usando ponto e vírgula para separar as declarações.
PL / I usou ponto-e-vírgula para finalizar instruções. Há uma diferença, e isso é facilmente visto no PASCAL. Ada seguiu a liderança de PL / I nesse item, em vez da ALGOL.
O ponto e vírgula como separador ou terminador de declarações foi rapidamente aceito pela comunidade de ciência da computação como uma notação útil e, tanto quanto eu sei, toda linguagem subsequente estruturada em bloco seguiu o exemplo da ALGOL e usou ponto e vírgula para separar ou encerrar declarações.
Foi-me dito há muitos anos que o BCPL usava o ponto- e- vírgula E o retorno de carro como separadores / terminadores de instruções, mas eu nunca usei o idioma sozinho e não consigo verificar isso. Em algum momento, o uso de retorno de carro para separar ou encerrar instruções foi descartado dos descendentes da BCPL. BCPL gerou B, B gerou C, C gerou C ++, Java, D e uma série de coisas consideravelmente menos bem pensadas que PASCAL e Ada.
fonte
Alguns idiomas usaram outros símbolos - versões antigas do BASIC usavam dois pontos, por exemplo.
Ignorando as poucas exceções, no entanto, acho que há duas razões principais. A primeira é que você está simplesmente procurando por algo inequívoco. Em um analisador típico, se você encontrar um erro grave o suficiente para não poder continuar analisando a instrução atual, normalmente tenta recuperar o analisador em sincronia apenas passando adiante para o terminador de instruções e reiniciando o analisador a partir do início da próxima declaração. Para isso, você deseja algo que normalmente não ocorrerá em nenhum outro lugar do código, e um ponto-e-vírgula passa a ser um símbolo com pouco outro significado anexado, por isso é muito fácil dedicar esse objetivo.
A segunda razão é um pouco semelhante, mas direcionada mais para as pessoas que leem / usam o código. Novamente, ele volta ao fato de que o símbolo real que você usa não importa muito. Há uma vantagem substancial na legibilidade de obter ao usar o símbolo que seu leitor está acostumado a ver para um fim específico, quando e se possível. Isso não significa que C é a sintaxe perfeita e todo o resto deve segui-la de maneira servil, mas significa que pessoas suficientes estão familiarizadas com esse estilo de sintaxe que uma linguagem vagamente semelhante ganha muito (e perde muito pouco) seguindo aproximadamente a mesma sintaxe onde puder.
Eu observaria que isso é como projetar quase qualquer outro programa. Se eu escrever um programa que usa janelas de algum tipo, tentarei usar apenas os recursos nativos da (s) plataforma (s) de destino. Muitas das decisões incorporadas serão amplamente arbitrárias e podem ser tomadas de maneira diferente sem grandes perdas de funcionalidade - mas igualmente, alterá-las sem um ganho substancial de funcionalidade apenas confunde os usuários sem realizar nada útil. Os mesmos princípios básicos se aplicam a "o que deve terminar (ou separar) as declarações em um idioma?" como "como deve ser uma barra de rolagem" ou "como um controle de árvore deve funcionar?" Em todos esses casos, a decisão é quase sempre arbitrária e a uniformidade fornece um benefício substancial em si mesma.
Eu acrescentaria que o mesmo acontece em muitas linguagens, da maneira que a maioria de nós está tão acostumada antes da programação que poucas pessoas pensam nisso. Por que todo mundo usa "+" para indicar adição ou "-" para indicar subtração? Como a forma do símbolo não importa muito, mas todo mundo que concorda em aplicar o mesmo significado a cada símbolo é muito importante.
fonte
O ponto-e-vírgula foi originalmente proposto no Algol 60 como um separador de instruções , não um terminador.
Antes do Algol 60, a única linguagem de programação de alto nível existente era o Fortran, que exigia que cada declaração estivesse em uma linha separada. As declarações que abrangem várias linhas, como do-loops, foram consideradas uma singularidade e consideradas como 'blocos de declaração'.
Os projetistas do Algol 60 perceberam que as instruções precisavam de uma estrutura hierárquica (if-then-else, do-loops, declarações de caso etc.) e elas poderiam ser aninhadas umas nas outras. Portanto, a ideia de cada afirmação em uma linha separada não fazia mais sentido. Composição seqüencial de declarações no formato S1; S2; ...; Sn opcionalmente entre colchetes de início e fim foi chamado de instruções compostas e se encaixam na estrutura hierárquica de instruções prevista pelo Algol 60. Portanto, aqui, o ponto-e-vírgula é claramente um separador de instruções , não um terminador.
Isso deu origem a problemas na prática. Algol 60 também tinha uma "declaração vazia" que foi denotada por não escrever nada. Assim, pode-se escrever " begin S1; end " onde o ponto-e-vírgula aparece como se estivesse terminando S1. Mas o compilador Algol 60 realmente o tratou como um separador entre S1 e uma declaração vazia invisível a seguir. Essas sutilezas eram um pouco demais para programadores práticos. Tendo sido acostumados a linguagens orientadas a linhas como Assembly e Fortran, eles realmente pensavam no ponto e vírgula como um terminador de declarações. Quando os programas eram gravados, normalmente ponto-e-vírgula era colocado no final das instruções, da seguinte forma:
e o ponto e vírgula realmente parecia um terminador para a primeira declaração. Se os programadores tratassem o ponto-e-vírgula como um terminador, uma declaração como esta daria um erro de sintaxe:
porque o ponto-e-vírgula termina o "se" e, portanto, o "mais" fica pendente. Os programadores estavam completamente confusos.
Assim, o PL / I, que foi o sucessor da IBM para o Fortran orientado a linhas, decidiu tornar o ponto-e-vírgula um terminador de declaração em vez de um separador. Os programadores ficaram felizes com essa escolha. A maioria das linguagens de programação seguiu o exemplo. (Pascal resistiu à tendência, mas seu sucessor Ada desistiu.)
[Nota adicionada: o artigo da Wikipedia sobre comparações de linguagens de programação possui uma boa tabela resumindo como o ponto-e-vírgula é tratado em várias linguagens de programação.]
fonte
Este é um trabalho de suposição, mas olhando para um teclado QWERTY padrão restrito aos valores ASCII, os caracteres naturais para terminação / separação seriam.!?,:; e retornos de carro. desses!?: deve ser imediatamente desqualificado por receber várias chaves e o encerramento de instruções será uma coisa muito comum. Os períodos seriam desqualificados porque são facilmente confundidos com pontos decimais, o que os tornaria desnecessariamente complicados para serem um terminador, devido ao espaço limitado dos computadores iniciais. os retornos de carro seriam desqualificados depois que as linhas de código tivessem potencial para ser mais longas do que o que pode ser mostrado em uma única linha na tela; portanto, seria mais difícil ler um programa quando as linhas precisassem ser roladas horizontalmente, ou exigir caracteres adicionais para criar uma continuação na próxima linha, que novamente adiciona complexidade. isso sai e; como opções, dentre essas, é usada com muito mais frequência por escrito em comparação com; portanto, o ponto-e-vírgula é escolhido porque é mais fácil de digitar, menos confuso porque adiciona significado a um personagem com significado limitado e menos complicado porque casos especiais realmente não existem com seu uso.
O ponto-e-vírgula foi escolhido porque era o melhor personagem baseado na preguiça e na simplicidade.
fonte
É em grande parte uma escolha arbitrária. Alguns idiomas fizeram outras escolhas. COBOL finaliza instruções com o
.
caractere. FORTRAN, BASIC e Python geralmente encerram instruções com novas linhas (com sintaxe especial para instruções com várias linhas). E o Lisp coloca suas declarações entre parênteses.O principal motivo
;
é tão popular como separador / terminador de instruções é que a maioria dos idiomas populares de hoje se baseia no ALGOL , que usou essa convenção.Que outro símbolo você poderia escolher?
Os caracteres ASCII # $ @ [] ^ _ `{|} ~ nem sempre estavam presentes nas primeiras codificações de caracteres como ISO 646 .
Os caracteres
()*+-/<=>
são normalmente usados como operadores matemáticos e criariam ambiguidades de análise se usados como terminadores de instrução.Problemas semelhantes se aplicam a
'
e"
, que são normalmente utilizados como delimitadores de cordas;,
, que normalmente é usado para separar argumentos de função e.
, que geralmente é usado como um ponto decimal (ou como um delimitador em construções comosome_struct.some_field
).Isso sai
!%&:;?
.Escolher
!
ou?
provavelmente não causaria dificuldades técnicas, mas o significado em inglês daria o humor errado ao programa.A
&
seria uma escolha mais sensata como um separador de instrução (não terminator), porquepode ser lido como um comando para fazer a coisa A e depois a coisa B. Mas a maioria das linguagens com um
&
operador a usa como AND lógico ou bit a bit .O
%
sinal pode causar confusão em declarações comointerest_rate = 2.99%
(que definiria a variável como em2.99
vez do esperado0.0299
). Obviamente, o conhecido significado matemático de%
não impediu C de usá-lo como operador restante.Então isso sai
:
e;
.:
é uma escolha sensata e, de fato, é usada como o separador de instrução intra-linha na maioria dos dialetos do BASIC.Mas
;
tem a gramática inglesa do seu lado; pode ser usado para separar cláusulas dentro de uma frase.fonte
Em vez de tentar responder à sua pergunta principal, acho melhor focar na sua pergunta implícita:
Se você quiser aprender sobre o design da linguagem de programação e o histórico de implementação e obter mais informações sobre o processo, os procedimentos das Conferências de História das Linguagens de Programação são um bom ponto de partida. (Acho que você precisará de uma associação à ACM para poder acessar os procedimentos.)
Tomando sua pergunta principal como uma pergunta de exemplo que você pode tentar responder lendo o processo HOPL, gostaria de oferecer o seguinte ponto: as pessoas que projetam uma nova linguagem de programação geralmente o fazem porque consideram as que sabem ser quebrado / deficiente de alguma forma. Seu novo idioma é, por um lado, projetado para corrigir essa deficiência. Por outro lado, os designers de idiomas também copiarão elementos de design de outros idiomas que eles consideram bons ou simplesmente não alteram os elementos com os quais não tiveram problemas.
Especialmente essa última parte é importante: em vez de tentar descobrir qual linguagem de programação já foi o primeiro a usar ponto e vírgula como terminadores e por que um monte de outras linguagens de programação copiados que, provavelmente você vai aprender mais, olhando para as línguas que se não copiar isto. Por exemplo, embora o Smalltalk tenha se inspirado muito em Simula, ele nãocopie sua sintaxe e, em particular, seu uso de ponto e vírgula como terminadores de instruções. Ele mudou os terminadores (realmente separadores) para um ponto final e usa o ponto e vírgula para outra coisa. Por outro lado, o primeiro idioma que já usou um ponto-e-vírgula como terminador de declaração pode ter tido um motivo para mudar isso do que foi usado nos idiomas que vieram antes dele. Também é possível que tenha sido o primeiro idioma a introduzir todo o conceito de um terminador de declaração (ou o fez independentemente de outros idiomas) e que o ponto-e-vírgula tenha sido usado por algum motivo que agora está perdido no tempo. (Suspeito que o último seja o caso aqui, pois nenhum dos outros respondentes conseguiu desenterrar uma citação da pessoa que introduziu o ponto-e-vírgula em vez de oferecer suposições atualizadas sobre por que o ponto-e-vírgula era uma boa escolha.) ponto, Eu acho que você aprenderá mais examinando por que os designers de idiomas mudaram as coisas, e não por que eles os copiaram / mantiveram. Quando as pessoas mudam as coisas, geralmente querem ou precisam explicar a mudança, enquanto não fazem isso ao copiar ou manter as mesmas coisas porque “por que mudaríamos? é assim que é feito! ”
fonte
É sobre visibilidade.
Os primeiros separadores de declarações eram o '.' como em COBOL e nova linha, retorno de carro em FORTRAN.
O CR provou ser limitado, pois dificulta o fluxo de uma declaração por várias linhas.
Ponto final causou um problema mais interessante. Quando você lê texto em inglês, seu cérebro processa as paradas completas em um nível subliminar, você está consciente de que uma frase terminou e pode fazer uma pausa para respirar, mas na verdade não percebe. isso sinalizou. Também em muitas fontes, o '.' é o menor caractere possível, às vezes renderizado como um único pixel. Períodos ausentes ou extras se tornaram a causa mais comum de erros nos programas COBOL.
Assim, aprendendo com os erros iniciais, a ALGOL escolhe um terminador específico que permite que uma declaração flua por várias linhas e escolhe um que seja visível e facilmente percebido pelos leitores humanos. O ponto e vírgula é grande e incomum o suficiente no inglês comum para não ser processado subconscientemente.
fonte
Entendi que foi escolhido porque havia a necessidade de um terminador de instrução explícito que não fosse um retorno de carro / nova linha. Nos dias de telas de 80 colunas, na verdade, ter uma única linha de quebra de código em várias linhas era comum o suficiente para que usar \ r ou \ n para o terminador de instrução não funcionasse.
Os pontos e vírgulas eram apenas convenientes porque não são usados em declarações de lógica / matemática. Como tal, eles não entram em conflito com o conteúdo real das declarações de forma significativa.
Pessoalmente, acho que o uso contínuo do ponto e vírgula, juntamente com os requisitos de estilo para manter as linhas com menos de 80 caracteres, é francamente estúpido e anacrônico. Idiomas como python demonstraram extensivamente que você pode escrever códigos concisos e fáceis de entender mais facilmente sem eles. Além disso, se você tiver problemas com linhas com mais de 80 caracteres, precisará de um monitor maior.
fonte
Aqui estão duas perguntas: Por que o ALGOL obteve ponto e vírgula e por que outros idiomas foram atrás dele.
A primeira pergunta já está respondida de várias maneiras aqui.
Como o segundo, o ALGOL foi amplamente utilizado como uma linguagem de pseudocódigo para a escrita de algoritmos. Portanto, ponto e vírgula logo se tornou natural para usuários de diferentes idiomas. E naturalmente eles foram levados para os idiomas mais jovens.
fonte
Posso estar errado, mas acho que isso tem algo a ver com o fato de que em muitos montadores um ponto-e-vírgula foi usado para iniciar um comentário, geralmente colocado após uma instrução. Tudo depois de a
;
era um comentário e não fazia mais parte da própria instrução.Depois, é necessário encerrar as instruções quando você as digitar em um intérprete. Instruções breves (por exemplo, expressões matemáticas) podem ser encerradas simplesmente pressionando a tecla Enter, informando ao intérprete que a expressão está pronta para ser calculada e produziu um resultado. Mas, às vezes, alguém queria inserir várias linhas de código para a instrução, portanto, uma maneira de conseguir isso era usar algum caractere especial como terminador da instrução, em vez de depender apenas da tecla Enter. Dessa forma, o usuário pode inserir mais linhas de código de uma só vez, porque a Enter ainda não a enviou ao intérprete. Somente quando o intérprete encontrasse o caractere final em uma linha inserida com Enter, ele finalmente o executaria e calcularia seu resultado.
Agora, combine essas duas coisas e o ponto-e-vírgula parece ser uma escolha óbvia para o caractere final: indica onde a parte da instrução termina e a parte do comentário começa; assim, quando o intérprete a encontra em uma linha, sabe que pode liberar todas as linhas da expressão foram armazenadas em buffer até agora e executadas, porque a instrução acabou de terminar, agora estamos em um comentário (bem, pelo menos até o final desta linha, porque a próxima linha começará no código novamente, iniciando uma nova expressão / instrução).
Isso pressupõe, é claro, que foi realmente o ponto-e-vírgula que foi usado para comentários pela pessoa que teve essa ideia de reutilizá-lo como terminadores de instruções. Se houvesse outro caractere, poderíamos ter terminado com um terminador de instruções diferente.
Inb4: Não, este não é um relato histórico. Não tenho nenhuma evidência de que esse seja o modo como os pontos e vírgulas ganharam vida. É exatamente como eu imagino que isso possa ter acontecido.
fonte
A maioria das línguas adotou o ponto-e-vírgula porque já era amplamente usada para esse fim e as mudanças não faziam sentido.
E considerando os primeiros idiomas para fazer essa escolha, você terá que considerar quais são as alternativas. Ao projetar um idioma, você deseja que os caracteres necessários estejam disponíveis, e os conjuntos de caracteres no momento foram codificados em 6 bits, geralmente com alguns padrões reservados, geralmente com alguns caracteres não definidos com firmeza (para uma ocorrência posterior disso, pense no variantes nacionais da ISO-646 - a variante dos EUA é bem conhecida sob o nome ASCII - que reutiliza os códigos para caracteres "comuns", como
[
,#
ou$
, e vê o efeito em um contexto em que há apenas metade do número de posições de código disponíveis e letras e dígitos que reservam mais da metade).Provavelmente, não havia outro caractere que pudesse ser usado como separador de instruções de maneira intuitiva (
.
provavelmente já é o único candidato sério a esse critério) e sem introduzir dificuldades de expressão ou análise em um momento em que a teoria de análise e expressão ainda estava em elaboração (.
é agora fora de questão devido ao seu uso em números reais).fonte
Outro motivo para usar ponto-e-vírgula é porque esse é um dos caracteres que não exigimos ou usamos com mais frequência.
Suponha que o usemos com mais frequência como nome de variável ou algo assim e se ponto-e-vírgula tivesse sido usado como uma palavra-chave ou como um operador, teria sido um conflito de símbolo para o compilador; portanto, era importante usar um símbolo que não seja frequentemente usado na codificação.
Acredito que as linguagens de programação no estilo C a tornaram popular e, em seguida, os autores de novas linguagens de programação não queriam reinventar a roda e continuaram usando-a até agora.
fonte