La définition du "langage de style C" peut être pratiquement simplifiée jusqu'à "utilise des accolades ( {}
)." Pourquoi utilisons-nous ce caractère particulier (et pourquoi pas quelque chose de plus raisonnable, comme []
, qui n'exige pas la touche Maj au moins sur les claviers américains)?
Existe-t-il un avantage réel pour la productivité du programmeur provenant de ces accolades, ou les nouveaux concepteurs de langage devraient-ils rechercher des alternatives (par exemple, les développeurs de Python)?
Wikipedia nous dit que C utilise les accolades dites, mais pas pourquoi. Une déclaration dans l'article de Wikipedia sur la liste des langages de programmation basés sur C suggère que cet élément de syntaxe est quelque peu spécial:
De manière générale, les langues de la famille C sont celles qui utilisent la syntaxe de bloc de type C (y compris les accolades pour commencer et terminer le bloc) ...
la source
Réponses:
Les familles Algol (Algol 60 et Algol 68) et BCPL (d'où C tire son nom) sont deux des principales influences de C.
De http://www.princeton.edu/~achaney/tmve/wiki100k/docs/BCPL.html
De http://progopedia.com/language/bcpl/
Au sein de BCPL, on voit souvent des accolades, mais pas toujours. C'était une limitation des claviers à l'époque. Les caractères
$(
et$)
étaient lexicographiquement équivalents à{
et}
. Les graphes numériques et trigraphiques ont été conservés en C (bien qu’un ensemble différent pour le remplacement des accolades -??<
et??>
).L'utilisation d'accolades a été encore affinée dans B (qui a précédé C).
De la référence des utilisateurs à B par Ken Thompson:
Il semblerait que des accolades aient été utilisées comme main courte pour Algol
begin
et à l'end
intérieur de celle-ci.De http://www.bobbemer.com/BRACES.HTM
L'utilisation de crochets (en tant que remplacement suggéré dans la question) remonte encore plus loin. Comme mentionné, la famille Algol a influencé C. Dans Algol 60 et 68 (C a été écrit en 1972 et BCPL en 1966), le crochet a été utilisé pour désigner un indice dans un tableau ou une matrice.
Comme les programmeurs connaissaient déjà les crochets pour les tableaux dans Algol et BCPL et les accolades pour les blocs dans BCPL, il n’était ni nécessaire ni désir de changer cela lors de la création d’une autre langue.
La question mise à jour inclut un addenda de productivité pour l'utilisation d'accolades et mentionne python. Il existe d’autres ressources sur cette étude, mais la réponse se résume à «C’est une anecdote, et à quoi vous êtes habitué est ce avec quoi vous êtes le plus productif». En raison de la diversité des compétences en programmation et de la connaissance de différentes langues, il devient difficile de rendre compte de celles-ci.
Voir aussi: Dépassement de pile Existe-t-il des études statistiques indiquant que Python est «plus productif»?
Une grande partie des gains dépendrait de l'EDI (ou de l'absence de) utilisé. Dans les éditeurs basés sur vi, placer le curseur sur une ouverture / fermeture correspondante et appuyer sur
%
pour déplacer le curseur sur l'autre caractère correspondant. C’est très efficace avec les langages basés sur C à l’époque - moins que maintenant.Une meilleure comparaison serait entre
{}
etbegin
/end
quelles étaient les options du jour (l’espace horizontal était précieux). De nombreuses langues Wirth étaient basées sur unbegin
et leend
style (Algol (mentionné ci - dessus), pascals (beaucoup sont familiers avec), et la famille Modula).J'ai du mal à trouver un élément qui isole cette fonction linguistique spécifique - au mieux, je peux montrer que les langues à accolades bouclées sont beaucoup plus populaires que les langues de début à la fin et qu'il s'agit d'une construction commune. Comme mentionné dans le lien Bob Bemer ci-dessus, l'accolade a été utilisée pour faciliter la programmation en sténographie.
De Pourquoi Pascal est pas mon préféré langage de programmation
C'est à peu près tout ce qui peut être dit - sa familiarité et ses préférences.
la source
{
et}
sont??<
et??>
. Les digraphes (introduits par l’amendement de 1995) sont<%
et%>
. Les trigraphes sont développés dans tous les contextes, à un stade très précoce de la traduction. Les graphes numériques sont des jetons et ne sont pas développés en littéraux de chaîne, constantes de caractère ou commentaires.x:=(c|s1|s2)
x=c?s1|s2
Les accolades carrées
[]
sont plus faciles à taper depuis le terminal IBM 2741 "largement utilisé sur le système d’ exploitation Multics" , qui avait à son tour Dennis Ritchie, l’un des créateurs du langage C, en tant que membre de l’équipe de développement .Notez l' absence d'accolades chez IBM 2741!
En C, les accolades carrées sont "prises" car elles sont utilisées pour les tableaux et les pointeurs . Si les concepteurs de langage s'attendaient à ce que les tableaux et les pointeurs soient plus importants / utilisés plus fréquemment que les blocs de code (ce qui semble être une hypothèse raisonnable à leurs côtés, plutôt que sur le contexte historique du style de codage ci-dessous), cela signifierait que les accolades seraient moins importantes. "syntaxe.
L’importance des tableaux est assez évidente dans l’article Le développement du langage C de Ritchie. Il existe même une hypothèse explicite de "prévalence de pointeurs dans les programmes C" .
Pour mieux comprendre le contexte historique et le style de codage de l'époque de la création du langage C, il convient de prendre en compte le fait que "l'origine de C est étroitement liée au développement de l'Unix" et, en particulier, que le transfert du système d'exploitation vers un PDP- 11 "ont conduit au développement d’une première version de C" ( source de citations ). Selon Wikipedia , "en 1972, Unix a été réécrit dans le langage de programmation C" .
Le code source de diverses anciennes versions d'Unix est disponible en ligne, par exemple sur le site de l' arbre Unix . Parmi les différentes versions présentées, la plus pertinente semble être la deuxième édition Unix de 1972-06:
Vous pouvez parcourir et étudier le code source en C depuis la page Second Edition Unix (V2) pour avoir une idée du style de codage typique de l'époque.
Un exemple frappant qui soutient l'idée qu'il était alors très important pour le programmeur de pouvoir taper facilement des crochets se trouve dans le code source V2 / c / ncc.c :
Il est intéressant de noter comment la motivation pragmatique de la sélection de caractères pour désigner des éléments de syntaxe de langage basés sur leur utilisation dans des applications pratiques ciblées ressemble à la loi de Zipf, comme expliqué dans cette réponse géniale ...
... à la seule différence que la longueur indiquée ci-dessus est remplacée par / généralisée par la vitesse de frappe.
la source
grep -Fo
me dit les*.c
fichiers du code source de CPython (rév. 4b42d7f288c5 car c’est ce que j’ai sous la main), qui inclut libffi, contient 39511{
(39508{
, pourquoi deux accolades ne sont pas fermées), mais seulement 13718[
(13702)[
). Compter les occurrences dans les chaînes et dans des contextes sans rapport avec cette question, donc ce n’est pas vraiment exact, même si nous ignorons que la base de code peut ne pas être représentative (notez que ce biais peut aller dans un sens ou dans l’autre). Encore un facteur de 2,8?C (et par la suite C ++ et C #) ont hérité son style de renforcement de son prédécesseur B , écrit par Ken Thompson (avec la contribution de Dennis Ritchie) en 1969.
Cet exemple provient de la référence des utilisateurs à B de Ken Thompson (via Wikipedia ):
B lui-même était à nouveau basé sur BCPL , un langage écrit par Martin Richards en 1966 pour le système d’exploitation Multics. Le système de contreventement de B n'utilisait que des accolades rondes, modifiées par des caractères supplémentaires (exemple de factorielles d'impression de Martin Richards, via Wikipedia ):
Les accolades utilisées dans B et les langues suivantes "{...}" constituent une amélioration apportée par Ken Thompson au style d'accolade composé précédent dans BCPL "$ (...) $".
la source
$( ... $)
format est équivalent à celui{ ... }
du lexer dans BCPL, tout comme??< ... ??>
à celui{ ... }
de C. L'amélioration entre les deux styles réside dans le matériel du clavier et non dans la langue.