Definicję „języka w stylu C” można praktycznie uprościć do „używa nawiasów klamrowych ( {}
)”. Dlaczego używamy tej konkretnej postaci (i dlaczego nie coś bardziej rozsądnego, na przykład []
, co nie wymaga klawisza Shift przynajmniej na klawiaturach w USA)?
Czy jest jakaś rzeczywista korzyść dla wydajności programisty pochodzącej z tych nawiasów, czy też nowi projektanci języków powinni szukać alternatyw (np. Facetów stojących za Pythonem)?
Wikipedia mówi nam, że C używa wspomnianych aparatów ortodontycznych, ale nie dlaczego. Oświadczenie w artykule w Wikipedii na temat listy języków programowania opartych na języku C sugeruje, że ten element składniowy jest nieco wyjątkowy:
Mówiąc ogólnie, języki rodziny C to te, które używają składni bloków podobnych do C (w tym nawiasów klamrowych do rozpoczynania i kończenia bloku) ...
źródło
Odpowiedzi:
Dwa główne czynniki wpływające na C to rodzina języków Algol (Algol 60 i Algol 68) i BCPL (od której C bierze swoją nazwę).
From http://www.princeton.edu/~achaney/tmve/wiki100k/docs/BCPL.html
From http://progopedia.com/language/bcpl/
W ramach BCPL często widać nawiasy klamrowe, ale nie zawsze. Było to wówczas ograniczenie klawiatury. Znaki
$(
i$)
były leksykograficznie równoważne do{
i}
. Digraphy i trigrafy były utrzymywane w C (choć inny zestaw do wymiany nawiasów klamrowych -??<
i??>
).Zastosowanie nawiasów klamrowych zostało dodatkowo udoskonalone w B (które poprzedziło C).
Od odniesienia użytkowników do B autorstwa Kena Thompsona:
Istnieją przesłanki, że nawiasy klamrowe były używane jako krótka ręka w Algolu
begin
iend
wewnątrz niego.Od http://www.bobbemer.com/BRACES.HTM
Zastosowanie nawiasów kwadratowych (jako sugerowanego zamiennika w pytaniu) sięga jeszcze dalej. Jak wspomniano, rodzina Algola miała wpływ na C. W Algolu 60 i 68 (C napisano w 1972 r. I BCPL w 1966 r.) Nawias kwadratowy zastosowano do oznaczenia indeksu w tablicy lub macierzy.
Ponieważ programiści znali już nawiasy kwadratowe dla tablic w Algolu i BCPL oraz nawiasy klamrowe dla bloków w BCPL, nie było potrzeby ani chęci zmiany tego przy tworzeniu innego języka.
Zaktualizowane pytanie zawiera dodatek produktywności dla użycia nawiasów klamrowych i wspomina o pythonie. Istnieją inne zasoby, które zajmują się tym badaniem, chociaż odpowiedź sprowadza się do „Jest to anegdota, a to, do czego jesteś przyzwyczajony, to to, z czego jesteś najbardziej produktywny”. Ze względu na bardzo różne umiejętności programowania i znajomość różnych języków, stają się one trudne do wytłumaczenia.
Zobacz także: Przepełnienie stosu Czy istnieją badania statystyczne wskazujące, że Python jest „bardziej produktywny”?
Wiele korzyści będzie zależało od zastosowanego IDE (lub jego braku). W edytorach opartych na vi, umieszczenie kursora nad jednym pasującym otwieraniem / zamykaniem i naciśnięcie
%
spowoduje przeniesienie kursora do drugiego pasującego znaku. Jest to bardzo wydajne w przypadku języków opartych na C w dawnych czasach - teraz mniej.Lepszym porównaniem byłoby między
{}
ibegin
/end
które były opcjami dnia (przestrzeń pozioma była cenna). Wiele języków Wirth opartych było na stylubegin
iend
(Algol (wspomniany powyżej), pascal (wielu zna) i rodzina Modula).Mam trudności ze znalezieniem tych, które izolują tę konkretną cechę języka - co mogę zrobić, to pokazać, że języki nawiasów klamrowych są znacznie bardziej popularne niż języki początkowe i jest to wspólna konstrukcja. Jak wspomniano w linku Boba Bemera powyżej, nawias klamrowy został użyty, aby ułatwić programowanie jako skrót.
Od Dlaczego Pascal nie jest moim ulubionym językiem programowania
To wszystko, co można powiedzieć - jego znajomość i preferencje.
źródło
{
i}
są??<
i??>
. Drafrafami (wprowadzonymi poprawką z 1995 r.) Są<%
i%>
. Trigrafie są rozszerzane we wszystkich kontekstach, w bardzo wczesnej fazie tłumaczenia. Cyfry to tokeny i nie są rozwijane w literałach łańcuchowych, stałych znaków ani komentarzy.x:=(c|s1|s2)
zamiast C użytkownikax=c?s1|s2
. Podobnie dotyczy to instrukcji if i case . ¢ BTW: A68 pochodzi z miejsca, w którym powłoka ma swój esac i fi ¢Kwadratowe nawiasy klamrowe
[]
są łatwiejsze do wpisania, odkąd terminal IBM 2741, który był „szeroko stosowany w systemie operacyjnym Multics” , który z kolei miał Dennisa Ritchiego, jednego z twórców języka C jako członka zespołu programistów .Zwróć uwagę na brak nawiasów klamrowych w układzie IBM 2741!
W C nawiasy kwadratowe są „pobierane”, ponieważ są używane do tablic i wskaźników . Jeśli projektanci języków spodziewali się, że tablice i wskaźniki będą ważniejsze / używane częściej niż bloki kodu (co brzmi jak rozsądne założenie po ich stronie, bardziej w kontekście historycznego stylu kodowania poniżej), oznaczałoby to, że nawiasy klamrowe byłyby „mniej ważne „składnia.
Znaczenie tablic jest dość widoczne w artykule The Development of the C Language autorstwa Ritchie. Istnieje nawet wyraźnie określone założenie „rozpowszechnienia wskaźników w programach C” .
Aby lepiej zrozumieć kontekst historyczny i styl kodowania w czasie, gdy język C był tworzony, należy wziąć pod uwagę, że „pochodzenie C jest ściśle związane z rozwojem Uniksa”, a w szczególności przenosi system operacyjny na PDP- 11 „doprowadziło do opracowania wczesnej wersji C” ( źródło cytatów ). Według Wikipedii , „w 1972 roku, Unix został przepisany w języku programowania C” .
Kod źródłowy różnych starych wersji Uniksa jest dostępny online, np. Na stronie The Unix Tree . Spośród różnych przedstawionych tam wersji, najbardziej odpowiednia wydaje się być Second Edition Unix z 1972-06:
Możesz przeglądać i studiować kod źródłowy C ze strony drugiej edycji Uniksa (V2), aby uzyskać wyobrażenie o typowym stylu kodowania tamtych czasów.
Wybitny przykład, który popiera pomysł, że w tamtym czasie programiści mogli z łatwością pisać nawiasy kwadratowe, można znaleźć w kodzie źródłowym V2 / c / ncc.c :
Warto zauważyć, jak pragmatyczna motywacja wybierania znaków w celu oznaczenia elementów składni języka na podstawie ich użycia w ukierunkowanych praktycznych zastosowaniach przypomina Prawo Zipfa, jak wyjaśniono w tej wspaniałej odpowiedzi ...
... z tą różnicą, że długość powyższego wyrażenia jest zastępowana / uogólniona jako szybkość pisania.
źródło
grep -Fo
mówi mi*.c
pliki kodu źródłowego CPython (rev. 4b42d7f288c5, ponieważ to właśnie mam pod ręką), który zawiera libffi, zawiera 39511{
(39508{
, nie wiem dlaczego dwa nawiasy klamrowe nie są zamknięte), ale tylko 13718[
(13702[
). To zliczanie wystąpień w ciągach znaków i kontekstach niezwiązanych z tym pytaniem, więc nie jest to tak naprawdę dokładne, nawet jeśli zignorujemy to, że podstawa kodu może nie być reprezentatywna (zauważ, że to odchylenie może iść w dowolnym kierunku). Nadal współczynnik 2,8?C (a następnie C ++ i C #) odziedziczył swój styl wzmacniający po swoim poprzedniku B , który został napisany przez Kena Thompsona (z udziałem Dennisa Ritchiego) w 1969 roku.
Ten przykład pochodzi z odniesienia użytkownika do B autorstwa Kena Thompsona (za pośrednictwem Wikipedii ):
Sam B był ponownie oparty na BCPL , języku napisanym przez Martina Richardsa w 1966 roku dla systemu operacyjnego Multics. System stężeń B wykorzystywał tylko okrągłe stężenia, modyfikowane dodatkowymi znakami (przykład czynnikowy wydruku Martin Richards, z Wikipedii ):
Nawiasy klamrowe używane w języku B i kolejnych językach „{...}” to ulepszenie wprowadzone przez Kena Thompsona w stosunku do oryginalnego stylu złożonego aparatu klamrowego w BCPL „$ (...) $”.
źródło
$( ... $)
Format jest równoważne{ ... }
w lexer w BCPL, tak jak??< ... ??>
jest równoważne{ ... }
w C. Poprawa pomiędzy tymi dwoma stylami jest w sprzęt klawiatura - nie jest językiem.