A definição de "linguagem C-Style" pode ser praticamente simplificada para "usa chaves ( {}
)." Por que usamos esse caractere em particular (e por que não algo mais razoável, como []
, que não requer a tecla Shift pelo menos nos teclados dos EUA)?
Existe algum benefício real na produtividade do programador proveniente desses aparelhos, ou os novos designers de linguagem devem procurar alternativas (por exemplo, os caras por trás do Python)?
A Wikipedia nos diz que C usa os aparelhos mencionados, mas não o porquê. Uma declaração no artigo da Wikipedia sobre a lista de linguagens de programação baseadas em C sugere que esse elemento de sintaxe é algo especial:
Em termos gerais, os idiomas da família C são aqueles que usam sintaxe de bloco do tipo C (incluindo chaves para iniciar e finalizar o bloco) ...
fonte
Respostas:
Duas das principais influências para C foram a família de idiomas Algol (Algol 60 e Algol 68) e BCPL (da qual C leva seu nome).
De http://www.princeton.edu/~achaney/tmve/wiki100k/docs/BCPL.html
Em http://progopedia.com/language/bcpl/
Dentro da BCPL, geralmente se vê chaves, mas nem sempre. Essa era uma limitação dos teclados da época. Os caracteres
$(
e$)
eram lexicograficamente equivalentes a{
e}
. Dígrafos e trigramas foram mantidos em C (embora um conjunto diferente para substituição de chaves -??<
e??>
).O uso de chaves foi mais refinado em B (que precedeu C).
Da referência dos usuários ao B de Ken Thompson:
Há indicações de que os aparelhos foram usados como mão curta para
begin
eend
dentro de Algol.De http://www.bobbemer.com/BRACES.HTM
O uso de colchetes (como uma substituição sugerida na pergunta) remonta ainda mais. Como mencionado, a família Algol influenciou C. No Algol 60 e 68 (C foi escrito em 1972 e BCPL em 1966), o colchete foi usado para designar um índice em uma matriz ou matriz.
Como os programadores já estavam familiarizados com colchetes para matrizes em Algol e BCPL e chaves para blocos em BCPL, havia pouca necessidade ou desejo de mudar isso ao criar outro idioma.
A pergunta atualizada inclui um adendo de produtividade para o uso de chaves e menciona python. Existem alguns outros recursos que fazem este estudo, embora a resposta se refira a "É anedótico e o que você está acostumado é com o que é mais produtivo". Devido às habilidades amplamente variadas em programação e familiaridade com diferentes idiomas, elas se tornam difíceis de explicar.
Veja também: Estouro de pilha Existem estudos estatísticos que indicam que o Python é "mais produtivo"?
Muitos dos ganhos dependeriam do IDE (ou falta de) usado. Nos editores baseados em vi, colocar o cursor sobre uma abertura / fechamento correspondente e pressionar pressionará
%
o cursor para o outro caractere correspondente. Isso é muito eficiente nos idiomas baseados em C nos velhos tempos - menos agora.Uma melhor comparação seria entre
{}
ebegin
/end
quais eram as opções do dia (o espaço horizontal era precioso). Muitas línguas Wirth foram baseadas em umbegin
eend
estilo (Algol (mencionados acima), pascal (muitos estão familiarizados com), ea família Modula).Tenho dificuldade em encontrar alguém que isole esse recurso específico de idioma - na melhor das hipóteses, posso mostrar que os idiomas entre chaves são muito mais populares do que os idiomas finais e é uma construção comum. Conforme mencionado no link de Bob Bemer acima, a chave foi usada para facilitar a programação como taquigrafia.
De Por Pascal não é minha linguagem de programação favorita
O que é tudo o que pode ser dito - sua familiaridade e preferência.
fonte
{
e}
são??<
e??>
. Os digrafos (introduzidos pela emenda de 1995) são<%
e%>
. Os trígrafos são expandidos em todos os contextos, em uma fase de tradução muito inicial. Os dígrafos são tokens e não são expandidos em literais de seqüência de caracteres, constantes de caracteres ou comentários.x:=(c|s1|s2)
vez de C'sx=c?s1|s2
. Da mesma forma, isso se aplica às declarações if & case . ¢ BTW: A68 é de onde o shell conseguiu o seu esac & fi ¢Colchetes
[]
são mais fáceis de escrever, desde IBM 2741 terminal que foi "amplamente utilizado em Multics" OS, que por sua vez tinha Dennis Ritchie, um dos criadores da linguagem C como membro da equipe dev .Observe a ausência de chaves no layout do IBM 2741!
Em C, chaves entre colchetes são "tiradas", pois são usadas para matrizes e ponteiros . Se os projetistas de linguagem esperassem que matrizes e ponteiros fossem mais importantes / usados com mais freqüência do que blocos de código (o que soa como uma suposição razoável ao seu lado, mais no contexto histórico do estilo de codificação abaixo), isso significaria que chaves entre chaves seriam "menos importantes" "sintaxe.
A importância das matrizes é bastante aparente no artigo O desenvolvimento da linguagem C de Ritchie. Existe até uma suposição explicitamente declarada de "prevalência de indicadores em programas C" .
Para uma melhor compreensão do contexto histórico e do estilo de codificação da época em que a linguagem C foi criada, é necessário levar em consideração que "a origem de C está intimamente ligada ao desenvolvimento do Unix" e, especificamente, que portar o SO para um PDP- 11 "levou ao desenvolvimento de uma versão inicial do C" ( fonte de citações ). Segundo a Wikipedia , "em 1972, o Unix foi reescrito na linguagem de programação C" .
O código fonte de várias versões antigas do Unix está disponível online, por exemplo, no site da árvore Unix . Das várias versões apresentadas lá, a mais relevante parece ser a Segunda Edição Unix, datada de 1972-06:
Você pode procurar e estudar o código fonte C na página Second Edition Unix (V2) para ter uma idéia do estilo de codificação típico da época.
Um exemplo proeminente que apóia a idéia de que naquela época era bastante importante que o programador pudesse digitar colchetes com facilidade pode ser encontrado no código-fonte V2 / c / ncc.c :
É interessante observar como a motivação pragmática de escolher caracteres para denotar elementos de sintaxe da linguagem com base em seu uso em aplicações práticas direcionadas se assemelha à Lei de Zipf, conforme explicado nesta resposta fantástica ...
... com a única diferença de que o comprimento na instrução acima é substituído por / generalizado como velocidade de digitação.
fonte
grep -Fo
diz-me os*.c
arquivos do código-fonte CPython (rev. 4b42d7f288c5 porque é isso que tenho em mãos), que inclui a libffi, contém 39511{
(39508{
, não sei por que duas chaves não estão fechadas), mas apenas 13718[
(13702[
) Isso está contando ocorrências em seqüências de caracteres e em contextos não relacionados a essa pergunta, portanto isso não é realmente preciso, mesmo se ignorarmos que a base de código pode não ser representativa (observe que esse viés pode ir em qualquer direção). Ainda assim, um fator de 2,8?C (e subsequentemente C ++ e C #) herdou seu estilo de suporte do antecessor B , que foi escrito por Ken Thompson (com contribuições de Dennis Ritchie) em 1969.
Este exemplo é da referência dos usuários a B de Ken Thompson (via Wikipedia ):
O próprio B foi novamente baseado no BCPL , uma linguagem escrita por Martin Richards em 1966 para o sistema operacional Multics. O sistema de órtese de B usava apenas chavetas, modificadas por caracteres adicionais (exemplo de fatorial de impressão de Martin Richards, via Wikipedia ):
Os chavetas usadas em B e nos idiomas subsequentes "{...}" são uma melhoria que Ken Thompson fez sobre o estilo de chaveta composto original em BCPL "$ (...) $".
fonte
$( ... $)
formato é equivalente a{ ... }
no lexer em BCPL, assim como??< ... ??>
é equivalente a{ ... }
em C. A melhora entre os dois estilos é no hardware do teclado - e não a linguagem.