Определение «языка C-Style» практически может быть упрощено до «использования фигурных скобок ( {}
)». Почему мы используем этот конкретный символ (и почему не что-то более разумное, например []
, которое не требует клавиши Shift, по крайней мере, на клавиатурах США)?
Есть ли какая-то реальная выгода для производительности программиста, которая исходит из этих фигурных скобок, или новые разработчики языка должны искать альтернативы (например, парни из Python)?
Википедия говорит нам, что C использует указанные скобки, но не почему. Утверждение в статье в Википедии о Списке языков программирования на C позволяет предположить, что этот синтаксический элемент несколько особенный:
Вообще говоря, языки семейства C - это те, которые используют синтаксис C-подобного блока (включая фигурные скобки для начала и конца блока) ...
источник
Ответы:
Двумя основными факторами, влияющими на C, были семейство языков Algol (Algol 60 и Algol 68) и BCPL (от которого C берет свое название).
С http://www.princeton.edu/~achaney/tmve/wiki100k/docs/BCPL.html
С http://progopedia.com/language/bcpl/
В BCPL часто можно увидеть фигурные скобки, но не всегда. Это было ограничение клавиатуры в то время. Символы
$(
и$)
были лексикографически эквивалентны{
и}
. Органы и триграфы были сохранены в C (хотя другой набор для замены фигурных скобок -??<
и??>
).Использование фигурных скобок было дополнительно уточнено в B (что предшествовало C).
Из ссылки пользователей на Б Кена Томпсона:
Есть признаки того, что фигурные скобки использовались в качестве короткой руки для
begin
иend
внутри Алгола.С http://www.bobbemer.com/BRACES.HTM
Использование квадратных скобок (в качестве предлагаемой замены в вопросе) восходит еще дальше. Как уже упоминалось, семья Алгол повлияла на C. В Алголе 60 и 68 (C был написан в 1972 году и BCPL в 1966 году) квадратная скобка использовалась для обозначения индекса в массиве или матрице.
Поскольку программисты уже были знакомы с квадратными скобками для массивов в Algol и BCPL и фигурными скобками для блоков в BCPL, не было особой необходимости или желания изменить это при создании другого языка.
Обновленный вопрос включает в себя дополнение производительности для использования фигурных скобок и упоминает Python. Есть некоторые другие ресурсы, которые делают это исследование, хотя ответ сводится к «Это анекдотично, и то, к чему вы привыкли, это то, с чем вы наиболее продуктивны». Из-за различий в навыках программирования и знакомства с разными языками, их становится трудно объяснить.
См. Также: Переполнение стека. Существуют ли статистические исследования, показывающие, что Python «более продуктивен»?
Большая часть выигрышей будет зависеть от используемой IDE (или ее отсутствия). В редакторах на основе vi при наведении курсора на одно соответствующее открытие / закрытие и нажатии
%
переместите курсор на другой соответствующий символ. Это очень эффективно с языками на основе C в прежние времена - теперь меньше.Лучшее сравнение было бы между
{}
иbegin
/end
которые были вариантами дня (горизонтальное пространство было драгоценным). Многие виртские языки были основаны на стилеbegin
иend
стиле (Алгол (упомянутый выше), паскаль (многие знакомы с ним) и семья Модула).Мне трудно найти что-то, что изолирует эту особенность языка - в лучшем случае я могу показать, что языки с фигурными скобками гораздо более популярны, чем языки начального и конечного языков, и это общая конструкция. Как упомянуто в ссылке Боба Бемера выше, фигурная скобка использовалась, чтобы упростить программирование как сокращение.
От Почему Паскаль не мой любимый язык программирования
Что обо всем, что можно сказать - его знакомство и предпочтения.
источник
{
и}
являются??<
и??>
. Органы (введенные поправкой 1995 года) - это<%
и%>
. Триграфы расширяются во всех контекстах, на очень ранней стадии перевода. Органы являются токенами и не раскрываются в строковых литералах, символьных константах или комментариях.x:=(c|s1|s2)
вместо C - хx=c?s1|s2
. Аналогично это относится к операторам if & case . ¢ КСТАТИ: A68 оттуда, где оболочка получила его esac & fi ¢Квадратные скобки
[]
легче вводить, начиная с терминала IBM 2741, который "широко использовался в ОС Multics" , в который в свою очередь входил Деннис Ритчи, один из создателей языка Си, в качестве члена команды разработчиков .Обратите внимание на отсутствие фигурных скобок на макете IBM 2741!
В C квадратные скобки «взяты», поскольку они используются для массивов и указателей . Если бы разработчики языка ожидали, что массивы и указатели будут более важными / использованными чаще, чем кодовые блоки (что звучит как разумное предположение с их стороны, более подробно об историческом контексте стиля кодирования ниже), это означало бы, что фигурные скобки переходят к «менее важным». "синтаксис.
Важность массивов довольно очевидна в статье Ритчи «Развитие языка Си ». Есть даже явно заявленное предположение о «распространенности указателей в программах на Си» .
Для дальнейшего понимания исторического контекста и стиля кодирования того времени, когда был создан язык C, необходимо принять во внимание, что «происхождение C тесно связано с разработкой Unix» и, в частности, это перенос ОС на PDP- 11 «привело к разработке ранней версии C» ( источник цитаты ). Согласно Википедии , «в 1972 году Unix был переписан на языке программирования Си» .
Исходный код различных старых версий Unix доступен онлайн, например, на сайте The Unix Tree . Из различных представленных там версий наиболее актуальным представляется второе издание Unix от 1972-06:
Вы можете просмотреть и изучить исходный код на языке Си со страницы второго издания Unix (V2), чтобы получить представление о типичном стиле кодирования того времени.
Яркий пример, подтверждающий идею о том, что в то время программисту было достаточно легко набирать квадратные скобки, можно найти в исходном коде V2 / c / ncc.c :
Интересно отметить, что прагматическая мотивация выбора символов для обозначения элементов синтаксиса языка, основанного на их использовании в целевых практических приложениях, напоминает закон Ципфа, как объясняется в этом потрясающем ответе ...
... с той лишь разницей, что длина в вышеприведенном выражении заменяется / обобщается как скорость набора текста.
источник
grep -Fo
сообщает мне*.c
файлы исходного кода CPython (rev. 4b42d7f288c5, потому что это то, что у меня под рукой), который включает libffi, содержит 39511{
(39508{
, не знаю, почему две скобки не закрыты), но только 13718[
(13702[
). Это подсчет вхождений в строках и в контекстах, не связанных с этим вопросом, так что это не совсем точно, даже если мы игнорируем, что база кода может быть не репрезентативной (обратите внимание, что это смещение может идти в любом направлении). Тем не менее, фактор 2,8?C (а затем C ++ и C #) унаследовал свой бодрящий стиль от своего предшественника B , который был написан Кеном Томпсоном (с участием Денниса Ричи) в 1969 году.
Этот пример взят из «Ссылки пользователя на B» Кена Томпсона (из Википедии ):
Сам B снова был основан на BCPL , языке, написанном Мартином Ричардсом в 1966 году для операционной системы Multics. Система крепления B использует только круглые скобки, модифицированные дополнительными символами (пример печати факториала Мартина Ричардса через Википедию ):
Фигурные скобки, используемые в B и последующих языках "{...}", - это улучшение, которое Кен Томпсон сделал по сравнению с оригинальным составным стилем скобок в BCPL "$ (...) $".
источник
$( ... $)
Формат эквивалентен{ ... }
в лексере в BCPL, так же , как??< ... ??>
это эквивалентно{ ... }
в С. Улучшение между этими двумя стилями находится в аппаратной клавиатуры - не язык.