Die Definition von "C-Style-Sprache" kann praktisch vereinfacht werden, indem "geschweifte Klammern ( {}
) verwendet werden". Warum verwenden wir dieses bestimmte Zeichen (und warum nicht etwas Vernünftigeres, []
das die Umschalttaste zumindest auf US-Tastaturen nicht erfordert)?
Gibt es einen tatsächlichen Vorteil für die Programmiererproduktivität, der sich aus diesen Klammern ergibt, oder sollten neue Sprachdesigner nach Alternativen suchen (dh nach den Leuten, die hinter Python stehen)?
Wikipedia sagt uns , dass C Verwendungen sagte Zahnspange, aber nicht , warum. Eine Aussage im Wikipedia-Artikel über die Liste der C-basierten Programmiersprachen legt nahe, dass dieses Syntaxelement etwas Besonderes ist:
Allgemein gesprochen sind Sprachen der C-Familie solche, die eine C-ähnliche Block-Syntax verwenden (einschließlich geschweifter Klammern , um den Block zu beginnen und zu beenden) ...
quelle
Antworten:
Zwei der Haupteinflüsse auf C waren die Algol-Sprachfamilie (Algol 60 und Algol 68) und BCPL (von denen C seinen Namen hat).
Von http://www.princeton.edu/~achaney/tmve/wiki100k/docs/BCPL.html
Von http://progopedia.com/language/bcpl/
In BCPL sieht man oft geschweifte Klammern, aber nicht immer. Dies war eine Einschränkung der Tastaturen zu der Zeit. Die Zeichen
$(
und$)
waren lexikographisch äquivalent zu{
und}
. Digraphen und Trigraphen wurden in C beibehalten (obwohl ein anderes Set für das Ersetzen von geschweiften Klammern -??<
und??>
).Die Verwendung von geschweiften Klammern wurde in B (das C vorausging) weiter verfeinert .
Aus der Benutzerreferenz zu B von Ken Thompson:
Es gibt Hinweise darauf, dass geschweifte Klammern als Kurzschrift für
begin
undend
innerhalb von Algol verwendet wurden.Von http://www.bobbemer.com/BRACES.HTM
Die Verwendung von eckigen Klammern (als vorgeschlagener Ersatz in der Frage) geht noch weiter zurück. Wie bereits erwähnt, beeinflusste die Algol-Familie C. Innerhalb von Algol 60 und 68 (C wurde 1972 und BCPL 1966 geschrieben) wurde die eckige Klammer verwendet, um einen Index in einem Array oder einer Matrix zu kennzeichnen.
Da Programmierer bereits mit eckigen Klammern für Arrays in Algol und BCPL und geschweiften Klammern für Blöcke in BCPL vertraut waren, bestand kaum Bedarf oder Wunsch, dies zu ändern, wenn eine andere Sprache erstellt wurde.
Die aktualisierte Frage enthält einen Produktivitätszusatz für die Verwendung von geschweiften Klammern und erwähnt Python. Es gibt einige andere Ressourcen, die diese Studie durchführen, obwohl die Antwort auf "Es ist anekdotisch, und was Sie gewohnt sind, ist, was Sie am produktivsten sind." Aufgrund der sehr unterschiedlichen Programmierkenntnisse und der Vertrautheit mit verschiedenen Sprachen wird es schwierig, diese zu erklären.
Siehe auch: Stapelüberlauf Gibt es statistische Studien, die belegen, dass Python „produktiver“ ist?
Ein Großteil der Gewinne hängt von der verwendeten IDE ab (oder von deren Fehlen). In vi-basierten Editoren wird der Cursor durch
%
Bewegen des Cursors über ein übereinstimmendes Öffnen / Schließen und Drücken von zum anderen übereinstimmenden Zeichen bewegt. Dies ist mit C-basierten Sprachen früher sehr effizient - heute noch weniger.Ein besserer Vergleich wäre zwischen
{}
undbegin
/end
welches die Optionen des Tages waren (horizontaler Raum war kostbar). Viele Wirth-Sprachen basierten auf abegin
undend
style (Algol (oben erwähnt), Pascal (viele sind damit vertraut) und der Modula-Familie).Ich habe Schwierigkeiten, eine zu finden, die dieses spezifische Sprachmerkmal isoliert - bestenfalls kann ich zeigen, dass die geschweiften Klammersprachen viel beliebter sind als die Anfangs- und Endsprachen, und es ist ein allgemeines Konstrukt. Wie oben im Bob Bemer-Link erwähnt, wurde die geschweifte Klammer verwendet, um das Programmieren als Kurzschrift zu vereinfachen.
Von Warum Pascal nicht meine bevorzugte Programmiersprache ist
Was über alles gesagt werden kann - seine Vertrautheit und Vorliebe.
quelle
{
und}
sind??<
und??>
. Die mit der Änderung von 1995 eingeführten Digraphen sind<%
und%>
. Trigraphen werden in einer sehr frühen Übersetzungsphase in allen Kontexten erweitert. Digraphen sind Token und werden nicht in Zeichenfolgenliteralen, Zeichenkonstanten oder Kommentaren erweitert.x:=(c|s1|s2)
anstelle von C'sx=c?s1|s2
. Ähnliches gilt für if & case- Anweisungen. ¢ BTW: A68 ist , von wo aus die Schale bekam es esac & fi ¢Die Eingabe von eckigen Klammern
[]
ist einfacher, seit dem IBM 2741- Terminal, das unter Multics- Betriebssystemen "weit verbreitet" war und für das Dennis Ritchie, einer der Entwickler der Programmiersprache C, Mitglied des Entwicklerteams war .Beachten Sie das Fehlen von geschweiften Klammern im IBM 2741-Layout!
In C werden eckige Klammern "genommen", da diese für Arrays und Zeiger verwendet werden . Wenn Sprachentwickler erwarten würden, dass Arrays und Zeiger wichtiger / häufiger verwendet werden als Codeblöcke (was wie eine vernünftige Annahme neben ihnen klingt , mehr im historischen Kontext des Codierungsstils unten), würde dies bedeuten, dass geschweifte Klammern "weniger wichtig" werden " Syntax.
Die Bedeutung von Arrays wird in dem Artikel Die Entwicklung der C-Sprache von Ritchie deutlich. Es gibt sogar eine explizit angegebene Annahme der "Prävalenz von Zeigern in C-Programmen" .
Für ein besseres Verständnis des historischen Kontexts und des Codierungsstils der Zeit, als die C-Sprache erstellt wurde, muss berücksichtigt werden, dass "der Ursprung von C eng mit der Entwicklung von Unix verknüpft ist " und insbesondere, dass das Betriebssystem auf einen PDP portiert wird. 11 "führte zur Entwicklung einer frühen Version von C" ( zitiert Quelle ). Laut Wikipedia , "im Jahr 1972 wurde Unix in der Programmiersprache C neu geschrieben" .
Der Quellcode verschiedener alter Versionen von Unix ist online verfügbar, z. B. auf der Unix Tree- Site. Von den verschiedenen dort vorgestellten Versionen scheint die zweite Ausgabe von Unix vom 1972-06 die relevanteste zu sein :
Sie können C-Quellcode auf der Second Edition Unix (V2) -Seite durchsuchen und studieren , um eine Vorstellung vom typischen Codierungsstil der Zeit zu erhalten.
Ein prominentes Beispiel, das die Idee unterstützt, dass es für Programmierer damals ziemlich wichtig war, eckige Klammern mühelos einzugeben, findet sich im Quellcode von V2 / c / ncc.c :
Es ist interessant festzustellen, dass die pragmatische Motivation, Zeichen auszuwählen, um sprachliche Syntaxelemente zu kennzeichnen, die auf ihrer Verwendung in gezielten praktischen Anwendungen basieren, dem Zipfschen Gesetz ähnelt, wie in dieser hervorragenden Antwort erläutert ...
... mit dem einzigen Unterschied, dass die Länge in der obigen Anweisung durch / generalisiert als Schreibgeschwindigkeit ersetzt wird.
quelle
grep -Fo
sagt mir die*.c
Dateien des CPython-Quellcodes (Rev. 4b42d7f288c5, weil ich sie zur Hand habe), einschließlich libffi, enthält 39511{
(39508{
, keine Ahnung , warum zwei Klammern nicht geschlossen sind), sondern nur 13718[
(13702[
). Das heißt, es werden Vorkommen in Zeichenfolgen und in Kontexten gezählt, die mit dieser Frage nichts zu tun haben. Dies ist also nicht wirklich zutreffend, selbst wenn wir ignorieren, dass die Codebasis möglicherweise nicht repräsentativ ist (beachten Sie, dass diese Verzerrung in beide Richtungen gehen kann). Immer noch ein Faktor von 2,8?C (und später C ++ und C #) erbte seinen Stil von seinem Vorgänger B , der 1969 von Ken Thompson (mit Beiträgen von Dennis Ritchie) geschrieben wurde.
Dieses Beispiel stammt aus der Benutzerreferenz zu B von Ken Thompson (über Wikipedia ):
B selbst basierte wieder auf BCPL , einer Sprache, die Martin Richards 1966 für das Multics-Betriebssystem geschrieben hatte. In Bs Klammersystem wurden nur runde Klammern verwendet, die durch zusätzliche Zeichen modifiziert wurden (Print Fakultäten, Beispiel von Martin Richards, über Wikipedia ):
Die in B und den folgenden Sprachen "{...}" verwendeten geschweiften Klammern sind eine Verbesserung, die Ken Thompson gegenüber dem ursprünglichen zusammengesetzten Klammerstil in BCPL "$ (...) $" vorgenommen hat.
quelle
$( ... $)
Format entspricht{ ... }
im Lexer in BCPL, wie??< ... ??>
gleichwertig ist{ ... }
in C. Die Verbesserung zwischen den beiden Arten in der Tastatur - Hardware ist - nicht die Sprache.