Por que as instruções em muitas linguagens de programação são terminadas por ponto e vírgula?

130

Existe uma razão para que um ponto-e-vírgula tenha sido escolhido como um terminador de linha em vez de um símbolo diferente?

Eu quero saber a história por trás dessa decisão e espero que as respostas levem a insights que possam influenciar decisões futuras.

    
por A Coder 13.03.2012 / 10:37
fonte

14 respostas

130

Em inglês, o ponto-e-vírgula é usado para separar itens em uma lista de instruções, por exemplo

She saw three men: Jamie, who came from New Zealand; John, the milkman's son; and George, a gaunt kind of man.

Quando estiver programando, você está separando um número de instruções e usando um ponto final pode ser facilmente confundido com um ponto decimal. Usar o ponto-e-vírgula fornece um método de análise fácil de separar as instruções individuais do programa, permanecendo próximo à pontuação normal em inglês.

Editar para adicionar um anúncio Nos primórdios, quando a memória era cara, o processamento era lento e as primeiras linguagens de programação estavam sendo 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 do carro pudesse atuar como o delimitador da instrução. Outros idiomas permitiam um formato mais livre para o layout do texto e, portanto, exigiam um caractere delimitador específico. Este personagem foi escolhido para ser o ponto e vírgula, provavelmente por causa da semelhança com o seu uso na língua inglesa (isso tem que ser uma suposição; eu não estava lá na época) e como não produzir um conflito com os outros sinais de pontuação e símbolos necessários para fins matemáticos ou outros fins sintáticos.

Editar novamente
A necessidade de algum caractere terminador retorna aos requisitos para analisar o texto do idioma. Os primeiros compiladores foram escritos em linguagem assembly ou, em alguns casos, diretamente em instruções binárias de máquina. 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, outras línguas usaram o retorno de carro ou suportes. Algol, Pascal, Ada, BCPL, B, C, PL / M e outras famílias de línguas usam o ponto e vírgula. Quanto a qual foi o primeiro a usar esse personagem em particular, não volto longe o suficiente na história para lembrar. Sua escolha e adoção faz todo o sentido como

  • Seu uso espelha o uso na pontuação normal em inglês.
  • Outros caracteres (por exemplo, ponto final) podem ser confusos, pois já têm um uso comum (um ponto final também é usado como um ponto decimal).
  • Um caractere de pontuação visível permite o layout do código de formato livre.
  • O uso de um caractere delimitador semelhante em idiomas derivados ou posteriores baseia-se na familiaridade obtida por todos os programadores que usaram a linguagem anterior.

Como observação final, acho que houve mais tempo gasto com essas respostas e comentários do que gasto na decisão de usar o ponto-e-vírgula para encerrar uma declaração ao projetar a primeira linguagem que a usou dessa maneira.

    
por 13.03.2012 / 10:48
fonte
70

Muitas linguagens usam a 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 por PL / I, que foi precedido por ALGOL ao usar o ; como separador.

Como em C o terminador de instrução é ; , esses idiomas seguem o mesmo caminho.

Quanto ao motivo pelo qual ele foi selecionado como um terminador de instrução em C - possivelmente devido ao seu uso em inglês "para indicar declarações interdependentes" .

O

C também foi inventado no PDP-11 em uma época em que havia pouca memória disponível para conjuntos de caracteres, então os inventores das línguas tinham que trabalhar dentro dessas restrições.

    
por 13.03.2012 / 10:42
fonte
54

FORTRAN usou o retorno de carro para delinear as instruções. Período usado COBOL. O LISP não usou nada, contando com parênteses para tudo. ALGOL foi o primeiro idioma a usar o ponto-e-vírgula para separar as declarações. PASCAL seguiu o exemplo da ALGOL, usando ponto-e-vírgula para separar declarações.

O PL / I usou o ponto-e-vírgula para terminar as declarações. Há uma diferença, e é facilmente visto em PASCAL. Ada seguiu a liderança do PL / I neste item, ao invés do ALGOL.

O ponto-e-vírgula como separador ou terminador de instrução foi rapidamente aceito pela comunidade da ciência da computação como uma notação útil e, até onde eu sei, cada linguagem subsequente estruturada em bloco seguiu o ponto-e-vírgula usado pela ALGOL para separar ou terminar declarações.

Foi-me dito há muitos anos que a BCPL usava o retorno de carro do ponto-e-vírgula AND como separadores / terminadores de instrução, mas eu nunca usei a linguagem e não posso verificar isso. Em algum momento, o uso de retorno de carro para separar ou terminar instruções foi descartado dos descendentes de BCPL. BCPL gerou B, B gerou C, C gerou C ++, Java, D e todo um conjunto de coisas consideravelmente menos bem pensadas que PASCAL e Ada.

    
por 13.03.2012 / 15:50
fonte
14

Why not any other symbol?

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á dois motivos principais. A primeira é que você está simplesmente procurando por algo sem ambigüidade. Em um analisador típico, se você encontrar um erro grave o suficiente para não continuar analisando a instrução atual, normalmente tentará sincronizá-lo novamente apenas com o terminador de instrução e reiniciar o analisador a partir da instrução atual. início da próxima declaração. Para isso, você quer algo que normalmente não ocorrerá em nenhum outro lugar do código, e um ponto-e-vírgula é um símbolo com pouco significado, então é muito fácil dedicar isso a esse propósito.

A segunda razão é um pouco semelhante, mas voltada mais para pessoas que leem / usam o código. Mais uma vez, volta-se ao fato de que o símbolo real que você usa não importa muito. Há uma vantagem substancial na legibilidade para se obter o símbolo que seu leitor está acostumado a ver para um propósito específico, quando e se possível. Isso não significa que C é a única sintaxe perfeita e tudo o mais deve seguir isso servilmente, mas significa que pessoas suficientes estão familiarizadas com esse estilo de sintaxe que uma linguagem vagamente similar ganha muito (e perde muito pouco) seguindo aproximadamente a mesma sintaxe onde pode.

Eu notaria que isso é muito parecido com a criação de praticamente 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 que incorporam serão em grande parte arbitrárias, e poderiam ser feitas de forma diferente sem qualquer grande perda de funcionalidade - mas, igualmente, alterá-las sem um ganho substancial na 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) 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 é em grande parte arbitrária, e a uniformidade fornece um benefício substancial por si mesmo.

Eu acrescentaria que o mesmo acontece em muitos idiomas, da maneira que a maioria de nós está tão acostumada antes de programar que poucas pessoas pensam sobre isso. Por que todo mundo usa "+" para indicar adição ou "-" para indicar subtração? Porque a forma do símbolo não importa muito, mas todo mundo concordando em aplicar o mesmo significado a cada símbolo tem muita importância.

    
por 13.03.2012 / 16:47
fonte
7

O ponto-e-vírgula foi originalmente proposto em Algol 60 como uma declaração separador , 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. Declarações abrangendo várias linhas, como do-loops, eram consideradas uma esquisitice, e elas eram consideradas "blocos de instruções".

Os projetistas do Algol 60 perceberam que as instruções precisavam de uma estrutura hierárquica (if-then-else, do-loops, instruções case etc.) e poderiam ser aninhadas umas nas outras. Então, a ideia de cada declaração sentada em uma linha separada não fazia mais sentido. Composição sequencial de declarações do formulário S1; S2; ...; Sn opcionalmente entre parênteses begin - end foram chamados de instruções compostas , e se encaixam na estrutura hierárquica de enunciados prevista por Algol 60. Então, aqui , o ponto-e-vírgula é claramente uma declaração separador , não um terminador.

Isso deu origem a problemas na prática. Algol 60 também teve uma "declaração vazia" que foi denotada escrevendo nada. Assim, pode-se escrever " begin S1; end " onde o ponto-e-vírgula aparece como se estivesse finalizando S1. Mas o compilador Algol 60 realmente tratou-o como um separador entre S1 e uma instrução vazia invisível após ele. Essas sutilezas eram um pouco demais para programadores práticos. Tendo sido usado em linguagens orientadas a linhas, como Assembly e Fortran, eles realmente pensavam em ponto-e-vírgula como um terminador para instruções. Quando os programas foram escritos, geralmente o ponto e vírgula foi colocado no final das instruções, da seguinte forma:

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

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, instruções como essa dariam um erro de sintaxe:

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

porque o ponto e vírgula termina o "if" e, portanto, o "else" fica pendente. Os programadores estavam totalmente confusos.

Assim, o PL / I, que era o sucessor da IBM para o Fortran orientado por linhas, decidiu tornar o ponto-e-vírgula uma instrução terminator 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 disso.)

[Nota adicionada: Artigo da Wikipédia sobre comparações de linguagens de programação tem uma boa tabela resumindo como ponto-e-vírgula é tratado em várias linguagens de programação.]

    
por 16.03.2012 / 12:54
fonte
6

Isso é praticamente um trabalho de adivinhação pura, mas ao olhar para um teclado QWERTY padrão restrito a valores ASCII, os caracteres naturais para terminação / separação seriam.!?,:; e retornos de carro. Destes !?: deve ser imediatamente desclassificado por ter várias chaves e o término da instrução será algo muito comum. Períodos seriam desqualificados porque são facilmente confundidos com pontos decimais, o que os tornaria desnecessariamente complicados para ser um terminador, dado o espaço limitado dos computadores iniciais. retornos de carro seriam desqualificados depois que as linhas de código tivessem potencial para ser maiores 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 crie uma continuação na próxima linha, o que adiciona complexidade novamente. isso sai e; como opções, desses, é usado com muito mais frequência por escrito em comparação com; então o ponto-e-vírgula é escolhido porque é mais fácil de digitar, menos confuso porque adiciona significado a um caractere com significado limitado e é menos complicado porque casos especiais realmente não existem com seu uso.

O ponto-e-vírgula foi escolhido porque foi o melhor personagem baseado em preguiça e simplicidade.

    
por 13.03.2012 / 16:15
fonte
6

É basicamente uma escolha arbitrária. Algumas línguas fizeram outras escolhas. COBOL finaliza instruções com o caractere . . FORTRAN, BASIC e Python geralmente terminam instruções com novas linhas (com sintaxe especial para instruções de várias linhas). E o Lisp colore suas declarações com parênteses.

A razão principal ; é tão popular como um separador / terminador de instrução é que a maioria das linguagens populares de hoje são baseadas em ALGOL , que usou essa convenção.

instead of a different symbol?

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 ambigüidades de análise se usados como terminadores de instruções.

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

Problemas semelhantes se aplicariam a ' e " , que são normalmente usados como delimitadores de cadeia de caracteres; , , que é normalmente usado para separar argumentos da função, e . , que é normalmente usado como um ponto decimal (ou como um delimitador em construções como some_struct.some_field ).

Isso deixa !%&:;? .

Escolher ! ou ? provavelmente não causaria dificuldades técnicas, mas seus significados em inglês dariam o clima errado ao programa.

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

O & seria uma escolha mais sensata como separador de instruções (não terminador), porque

do_thing_a() &
do_thing_b()

pode ser lido como um comando para fazer a coisa A e fazer a coisa B. Mas a maioria das linguagens com um operador & usa-a como lógica ou bit a bit AND em vez disso.

O sinal % pode causar confusão em instruções como interest_rate = 2.99% (que definiria a variável como 2.99 em vez do esperado 0.0299 ). É claro que o significado matemático bem conhecido de % não impediu C de usá-lo como o operador restante.

Isso deixa : e ; .

: é uma escolha sensata e, de fato, é usada como o separador de instruções 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 sentença.

    
por 29.03.2012 / 04:55
fonte
3

Em vez de tentar responder à sua pergunta, acho melhor focar na sua pergunta implícita:

I want to know the history behind this decision, and hope the answers will lead to insights that may influence future decisions in the design and implementation of programming languages.

Se você quiser aprender sobre o design de linguagem de programação e histórico de implementação, e obter mais informações sobre o processo, então os procedimentos do História das Conferências de Linguagens de Programação é um bom lugar para começar. (Eu acho que você vai precisar de uma associação ACM para poder acessar os procedimentos embora.)

Why are statements in many programming languages terminated by semicolons? Is there a reason that a semi-colon was chosen as a line terminator instead of a different symbol?

Tomando sua pergunta de título como uma pergunta exemplificativa que você pode tentar responder lendo o procedimento HOPL, eu gostaria de oferecer o seguinte ponto: as pessoas que projetam uma nova linguagem de programação geralmente o fazem porque consideram sabe ser quebrado / deficiente de alguma forma. Sua nova linguagem é, de um lado, projetada para corrigir essa deficiência. Por outro lado, os designers de linguagem também copiam elementos de design de outras linguagens que eles acham que são bons, ou simplesmente não alteram os elementos com os quais não tiveram problemas.

Especialmente, a última parte é importante: em vez de tentar descobrir qual linguagem de programação já foi a primeira a usar ponto e vírgula como terminadores e por que muitas outras linguagens de programação copiaram isso, você provavelmente aprenderá mais olhando linguagens que fez não copiá-lo. Por exemplo, embora o Smalltalk tenha se inspirado bastante no Simula, ele não copiou sua sintaxe e, em particular, o uso de ponto-e-vírgula como terminador de instruções. Ele mudou terminadores (separadores realmente) para um ponto final e usa o ponto-e-vírgula para outra coisa. Por outro lado, a primeira linguagem que já usou um ponto-e-vírgula como terminador de instrução pode ter tido uma razão para mudar isso do que foi usado em idiomas anteriores. Também é possível que tenha sido o primeiro idioma a apresentar todo o conceito de um terminador de instrução (ou o fez independentemente de outros idiomas) e que o ponto-e-vírgula foi usado por algum motivo que agora está perdido no tempo. (Eu suspeito que o último seja o caso aqui, já que nenhum dos outros respondentes foi capaz de extrair uma citação da pessoa que introduziu o ponto-e-vírgula, em vez de oferecer suposições sobre o porquê do ponto-e-vírgula ser uma boa escolha.) Mas para reafirmar Acho que você aprenderá mais por que os designers de linguagem mudaram as coisas, e não por que as copiaram / guardaram. Quando as pessoas mudam as coisas que normalmente querem ou têm que explicar a mudança, ao passo que não o fazem quando copiam ou guardam as coisas da mesma forma porque “por que mudaríamos isso? é assim que é feito! ”

    
por 26.03.2012 / 14:38
fonte
2

É sobre visibilidade.

Os separadores iniciais de declaração eram os '.' como em COBOL e nova linha, retorno de carro em FORTRAN.

O CR mostrou-se limitante porque dificulta o fluxo de uma declaração em várias linhas.

O ponto final causou um problema mais interessante. Quando você lê texto em inglês, seu cérebro processa os pontos finais em um nível subliminar, você está consciente de que uma sentença terminou e você pode fazer uma pausa para respirar, mas você realmente não percebe a. que sinalizou isso. Também em muitas fontes, o '.' é o menor caractere possível, às vezes, renderizado como um único pixel. Os períodos perdidos ou extras se tornaram a causa mais comum de erros nos programas COBOL.

Portanto, aprendendo com os erros iniciais, a ALGOL escolheu um terminador específico que permitiria que uma instrução fluísse por várias linhas e escolhesse uma que fosse visível e facilmente percebida pelos leitores humanos. O ponto-e-vírgula é tanto grande quanto incomum em inglês comum para não ser processado subconscientemente.

    
por 28.03.2012 / 12:27
fonte
1

No meu entender, ele foi escolhido porque havia a necessidade de um terminador de declaração explícito que não fosse um retorno de carro / uma nova linha. Nos dias de telas de 80 colunas, ter uma única linha de código envolvida em várias linhas era comum o suficiente para que o uso de \ r ou \ n para o terminador de instrução não funcionasse.

Ponto-e-vírgulas eram convenientes porque não são usados em declarações lógicas / matemáticas. Como tal, eles não entram em conflito com o conteúdo real das declarações em qualquer extensão significativa.

Pessoalmente, acho que o uso contínuo do ponto-e-vírgula, juntamente com os requisitos de estilo para manter linhas abaixo de 80 caracteres, é francamente estúpido e anacrônico. Idiomas como o python têm demonstrado extensivamente que você pode escrever código fácil de entender e conciso com mais facilidade sem eles. Além disso, se você tiver problemas com linhas maiores que 80 caracteres, precisará de um monitor maior.

    
por 13.03.2012 / 20:30
fonte
0

Aqui estão duas perguntas: Por que a ALGOL obteve o ponto-e-vírgula e por que outras linguagens foram atrás dela?

A primeira pergunta já foi respondida de várias formas aqui.

Como o segundo, o ALGOL foi muito usado como uma linguagem pseudocódigo para a escrita de algoritmos. Então, ponto e vírgula logo se tornou natural para usuários de diferentes idiomas. E naturalmente eles foram levados para os idiomas mais jovens.

    
por 09.01.2016 / 11:14
fonte
0

Eu posso estar errado, mas acho que isso tem algo a ver com o fato de que em muitas montadoras um ponto-e-vírgula era usado para iniciar um comentário, geralmente colocado depois de uma instrução. Tudo depois de um ; foi um comentário e não faz mais parte da instrução em si.

Depois, é necessário terminar as instruções quando você as digita em um intérprete. Instruções breves (por exemplo, expressões matemáticas) poderiam ser terminadas simplesmente apertando a tecla Enter, dizendo ao interpretador que a expressão está pronta para ser calculada e produziu um resultado. Mas, às vezes, uma pessoa 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 poderia inserir mais linhas de código de uma só vez, porque Enter ainda não o enviara ao intérprete. Somente quando o intérprete encontrou o caractere de terminação em uma linha digitada com Enter, ele finalmente 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: diz onde a parte da instrução termina e a parte do comentário começa, então quando o intérprete a encontra em uma linha, ela sabe que ele pode liberar todas as linhas da expressão armazenada em buffer até o momento e executá-las, 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 será iniciada no modo de código novamente, iniciando uma nova expressão / instrução).

Supõe-se, naturalmente, que foi realmente o ponto-e-vírgula que foi usado para comentários da pessoa que surgiu com a ideia de reutilizá-lo como terminadores de instruções. Tendo sido qualquer outro personagem, poderíamos ter acabado com um terminador de instrução diferente.

Inb4: Não, isso não é uma conta histórica. Eu não tenho nenhuma evidência de que esta é a maneira atual de os semicolons virem à vida. É exatamente como imagino que possa ter acontecido.

    
por 01.07.2018 / 07:12
fonte
-1

A maioria das línguas recebeu o ponto-e-vírgula porque já era amplamente usado para esse fim e a mudança não fazia sentido.

E considerando os primeiros idiomas para fazer essa escolha, você terá que considerar quais são as alternativas. Ao projetar uma linguagem, você quer que os caracteres necessários estejam disponíveis, e os conjuntos de caracteres neste momento foram codificados em 6 bits, frequentemente com alguns padrões reservados, muitas vezes com alguns caracteres não definidos firmemente (para uma ocorrência posterior disso, pense no variantes nacionais da ISO-646 - a variante americana é bem conhecida com o nome ASCII - que reutiliza os códigos para caracteres "comuns", como [ , # ou $ , e vê o efeito em um contexto onde há apenas metade das posições de código disponíveis e letras e dígitos reservando mais da metade deles).

Provavelmente não havia nenhum outro caractere que pudesse ser usado como separador de instruções como intuitivamente ( . é provavelmente o único candidato sério para esse critério) e sem introduzir dificuldades de lexação ou análise em um momento em que a teoria de análise e lexação era ainda em elaboração ( . está fora de questão devido a seu uso em números reais).

    
por 15.03.2012 / 15:55
fonte
-1

Outra razão pela qual usar ponto-e-vírgula é porque é um dos caracteres que não precisamos ou usamos com mais frequência.

Suponha que usemos isso com mais freqüência como um nome de variável ou alguma coisa e se o ponto-e-vírgula fosse usado como palavra-chave ou como operador, seria um conflito de símbolo para o compilador, portanto era importante usar um símbolo que não é freqüentemente usado na codificação.

Eu acredito que as linguagens de programação estilo C tornaram popular e os autores de novas linguagens de programação não quiseram reinventar a roda e continuaram a usá-la até agora.

    
por 16.03.2012 / 14:34
fonte