Объективные преимущества синтаксиса в стиле C - PullRequest
7 голосов
/ 16 мая 2009

Существует действительно большое количество языков программирования, на которые сильно влияет синтаксис в стиле C (фигурные скобки, точка с запятой и т. Д.), Возможно, больше, чем в любом другом синтаксическом стиле. И по сей день многие современные и успешные или даже недавно изобретенные языки используют этот синтаксис - просто подумайте о Java, C ++, C #, PHP, JavaScript, C, Perl и т. Д.

Существуют ли какие-либо объективные причины, которые могли бы объяснить большое распространение и успех этого синтаксиса? Есть ли определенные преимущества перед синтаксисом других языков?

Ответы [ 10 ]

15 голосов
/ 16 мая 2009

ИМХО, единственная вещь, которая делает синтаксис в стиле C популярным, - это то, что большинство людей его знают. И, таким образом, использование стиля C для нового языка позволяет применять старые привычки (например, соглашения об именах). Это хорошая вещь! Хотя я думаю, что синтаксис меньше всего заботит изучение нового языка. Но хороший синтаксис может помочь избежать ошибок.

Microsoft приложила много усилий, чтобы сделать VB.NET таким же важным, как и C # (помните все « null ( Nothing в Visual Basic)» »в MSDN, что довольно раздражает я), но все же C # является доминирующим языком для платформы .NET. Похоже, у VB.NET проблема с плохой репутацией его предшественников. И все же использование стиля C, похоже, делает его более профессиональным.

В конце концов, одна из целей разработки C состояла в том, чтобы сделать компилятор простым в реализации. Было проще использовать препроцессор, чем определять новую языковую конструкцию для констант. Или семантика [5]. Это не относится к C ++, который очень сложно реализовать, отчасти потому, что он пытается оставаться совместимым с C.

Примеры:

  • Чувствительность к регистру, хотя нечувствительность к регистру более естественна для людей (НЕ для компьютеров). Это не означает, что вы должны произносить идентификаторы иначе, чем они были объявлены (будьте осторожны!), Но это может привести к путанице. Пример из реальной жизни (Java): getWhiteSpace () или getWhitespace ()?

РЕДАКТИРОВАТЬ: Еще один хороший пример: Какой худший гоча в C # или .NET? . Но, конечно, как только вы привыкнете к этому и с помощью IDE, это больше не проблема, иногда даже более естественная, поскольку она лучше напоминает, как на самом деле работают компьютеры.

  • приоритет оператора

  • = для назначения и == для сравнения. if (a = b) кто-нибудь? Аналогично, && и &, || и |, (! и ~) синтаксически слишком близки, хотя они означают разные вещи. Лично я предпочел бы and и or, потому что символы должны просто поддерживать синтаксис, а не быть основной частью.

  • ++ и -- операторы; Делает некоторые выражения чуть короче, но вводит побочные эффекты в выражения (a = b+++b++). Первоначально компиляторы могли компилировать это более эффективно, чем i = i + 1.

  • for(init;condition;step) петля; Хотя рекомендуется использовать его только для увеличения переменной, явного синтаксиса для этого не существует. Вместо этого это для конструкции избыточно, так как (почти) так же, как

    init;
    while (condition) {
      statement;
      step;
    }
    
  • switch заявление; когда-нибудь забыли перерыв? Почему нельзя разрешать использование диапазонов в качестве меток, как это делают большинство других языков?

  • if(condition) заявление. Использование круглых скобок было не таким хорошим выбором, поскольку его можно использовать в самом выражении условия:

    if (!(var & 0x02))
    
  • Препроцессор

  • Подтяжки. Это спорно. Я не согласен с аргументами, которые утверждают, что они «не используют много экрана», являются более краткими или быстрее пишутся. Во-первых, язык должен быть легким для чтения, а не простым для написания. Во-вторых, в зависимости от вашего стиля использование фигурных скобок занимает столько же места на экране, что и ключевые слова: вы пишете их в одну строку. Разве это не много потерянного места?

    Кроме того, люди критикуют LISP за беспорядок в скобках. Никогда не случалось с вами, что вы должны сосчитать свои брекеты, чтобы узнать, где вы их пропустили? Я иногда добавляю комментарий после закрывающей скобки, чтобы указать, что должно закончиться здесь. Базовый синтаксис уже включен. И даже не нужно эквивалент открывающей скобки. Отчасти я согласен с тем, что брекеты хороши: они почти невидимы, а отступы являются доминирующей визуальной характеристикой. С этой точки зрения питон является следующим шагом.

  • Точки с запятой как терминатор или разделитель операторов. Почему одна точка с запятой является допустимым утверждением?

    if (condition);
      DoSomething();
    
  • неразличимые последовательности ключевых слов

    public static string main()
    

    Это объявление метода? Или объявление переменной? Или прототип функции? Или что-то другое? Некоторые знаки препинания (и ключевые слова для каждого типа объявления) могли бы помочь, например, четко отделить возвращаемый тип. Это то, что делает C ++ трудным для анализа.

  • ортогональности. {} while (condition) подходит для других языковых конструкций, где за оператором следует блок. Я думаю, что VB

    do [while/until condition]
      Statements
    loop [while/until condition]
    

    хорошее решение, потому что у вас есть 4 возможных комбинации с различной семантикой: до / во время после ключевого слова do / loop.

  • Странный порядок модификаторов типа переменной.

    int * const & i [];
    
  • Тип и имя переменной просто появляются после друг друга, без маркера, что это объявление локальной переменной. Scala использует val и var , которые указывают объявление окончательной / изменяемой переменной, а тип разделяется двоеточием. В большинстве других вещей Scala использует синтаксис Java.

  • Оператор присваивания, возвращающий значение; Нет различия между операторами (с эффектами) и выражениями (которые просто возвращают значение)

РЕДАКТИРОВАТЬ: Еще несколько примеров здесь: https://stackoverflow.com/questions/163026/what-is-your-least-favorite-syntax-gotcha

Вы, конечно, не согласитесь по многим из этих пунктов, и не все они обязательно являются отрицательными (например, точки с запятой), или что я знал решение, которое лучше для всех случаев. Даже если бы я это сделал, полученный язык не был бы идеальным языком. Языки программирования всегда будут развиваться, и вновь изобретенные языки, надеюсь, будут учиться у своих предшественников. Итак, почему бы не придерживаться известного синтаксиса вместо разработки нового каждые десять лет?

Однако, когда у разработчика языка есть возможность избежать ошибок программирования, которые являются просто ошибками ввода, почему бы не изменить их? Например, это было сделано в операторе switch C #, что делает break (или goto) обязательным. И как только худшие недостатки были устранены, выгода, которую большинство программистов знает остальную часть синтаксиса синтаксиса, намного перевешивает преимущества редизайна языка с нуля. Но я все еще удивляюсь, почему так много программистов по-прежнему так стремятся защищать C-синтаксис, хотя они привыкли к тому, что прогресс в информатике требует регулярного пересмотра почти всего.

В заключение, я думаю, что единственная причина, по которой синтаксис C является доминирующим, заключается в том, что он известен почти всем профессиональным программистам, они просто привыкли к нему. Фактический синтаксис менее важен, хотя другие языки могут иметь преимущества. Это та же самая причина, по которой инженеры-электрики используют соглашение об электрическом заряде как таковое.

https://imgs.xkcd.com/comics/urgent_mission.png

(Возможно, будет комикс о программисте, который посещает Денниса Ритчи: «Пожалуйста, не делайте перерыв с в переключение операторов необязательно!»)

4 голосов
/ 16 мая 2009

Насколько я понимаю, на самом деле есть только три основных синтаксических элемента, которые были перенесены из C в остальной мир: блоки, обозначенные фигурными скобками, точки с запятой для обозначения концов строк и общие " краткость "стиля.

Упаковка блоков в один символ имеет разумный смысл; Во-первых, это быстрый ввод текста, не занимающий много места на экране (в отличие от пары ключевых слов BEGIN-END). Во-вторых, синтаксис достаточно гибкий, поэтому вы можете отформатировать ваши блоки так, как вам нужно / нужно в особых случаях (чего вы не можете сделать в чем-то вроде Python). Наконец, ваш код может быть несколько разложен чем-то как почтовый клиент, и все еще может быть читаем как людьми, так и компилятором (это единственная реальная проблема, с которой я сталкиваюсь с отступами для блоков в стиле Python).

Почему же фигурные скобки? Я не знаю, каков был исторический прецедент их использования в C (или, более вероятно, BCPL), но я могу рискнуть предположить. На «стандартной» американской клавиатуре не так много парных символов: {} [] () и <> об этом. Если мы хотим упростить жизнь компилятору, нам нужны уникальные символы для BEGIN и END, поэтому используйте что-то вроде | или # для конца блока отсутствует. Из наших пар {} действительно единственная, которая уже ничего не значит - () и [] имеют большой математический багаж (который переводится более или менее напрямую с функциями и массивами) и оба означают <и> среднее все виды вещей. Я бы тоже выбрал {} для блоков.

С новым языком, если вы не используете ключевые слова или отступы, зачем его менять? Легионы программистов привыкли использовать их для обозначения блоков, зачем аннулировать всю эту мышечную память?

Практически тот же аргумент применим к использованию точек с запятой. Использование чего-либо для обозначения конца строки значительно облегчает жизнь компилятору. Использование только одного символа делает жизнь программиста намного проще. Сканируя отдельные символы на клавиатуре, точка с запятой - одна из немногих, которая, математически говоря, ничего не значит. С точки зрения грамматики английского языка, точка (или, возможно, запятая) имеют наибольшее значение, но они уже используются в качестве десятичных знаков. И, если вы немного прищуриваетесь, наличие точки с запятой в качестве терминатора строки имеет достаточно сходное значение, как и в английском. И снова, если вы начинаете новый язык, зачем его менять?

Что касается основной краткости, я бы сказал, что это была единственная, которую вы могли бы сказать, объективно, было хорошей идеей. Чем меньше символов я смогу набрать, чтобы донести идею до компьютера, оставаясь достаточно близко к английскому, чтобы читать, тем лучше.

(Можно утверждать, что большинство языков типа C также заимствуют большую часть словарного запаса ключевых слов, но на самом деле большинство ключевых слов C пришло из более старых языков, таких как ALGOL, FORTRAN и BCPL, и на самом деле - все они (в основном) здравый смысл. И снова, после того, как вы обучили сообщество программистов, что такое «цикл времени», зачем менять имя?)

Я бы сказал, что сегодня любой язык, который не использует синтаксис во многом как C, делает это из-за некоторого фундаментального изменения парадигмы (например, подход Python с отступами). Если вы делаете язык, который работает в основном так же, зачем что-то менять? Ваша целевая аудитория уже может нажать на фигурные скобки своими мизинцами, зачем делать этот конкретный навык бесполезным?

Или, если продвинуться в последнем предложении еще на шаг, если вы пытаетесь продать сообщество программистов на своем новом, меняющем игру языке (Java, C # и т. Д.), У вас будет намного меньше препятствий прыгать, если все ваши клиенты уже знают синтаксис.

3 голосов
/ 16 мая 2009

Я думаю, что это просто вопрос стиля, а не преимущества.

1 голос
/ 16 мая 2009

Люди привыкли к этому. Когда это было изобретено, каждый язык был ужасен как ад. Тогда C приобрел популярность за то, что меньше сосал. (и, возможно, за то, что он более практичен, чем LISP).

Сегодня другие языки используют синтаксис, потому что он знаком программистам.

Не думаю, что в этом есть что-то большее. Я предпочитаю фигурные скобки перед началом / концом (хотя фигурные скобки являются болью на многих неанглийских клавиатурах), но все еще есть много особенностей синтаксиса Си, которые можно было бы сделать лучше. C ++ обнаруживает, что возвращаемый тип может лучше соответствовать после параметров (C ++ 0x разрешает этот синтаксис, поскольку он лучше работает с другими новыми функциями, такими как decltype).

И большинство функциональных языков поняли, что круглые скобки вокруг параметров часто не нужны. В этом отношении явная типизация часто также не требуется. Но большинство языков наследуют это от C, потому что «это синтаксис». Введите сначала имя переменной / функции, а затем

И давайте даже не будем вдаваться в мерзость, являющуюся указателями на функции. Конечно, мы можем найти более элегантный синтаксис для их типов. Или попробуйте typedef'ing типа массива.

Тогда есть причудливый выбор операторов. Почему бы просто не использовать "и" вместо &&?

Синтаксис C не очень хороший. Это делает работу, и мы настолько привыкли к этому, что, вероятно, здесь, чтобы остаться. Но это не "хорошо".

1 голос
/ 16 мая 2009

Верно сказать, зачем придумывать совершенно новый синтаксис, когда c лаконичен и понятен. Также помогло то, что большинство программ были знакомы с c и сами языки были реализованы в c. Это тот случай, когда вы пытаетесь улучшить то, что уже работает очень хорошо.

1 голос
/ 16 мая 2009

Блочные структурированные языки должны как-то указывать блоки. Относительная непопулярность семейства языков Паскаль, кажется, указывает на то, что ключевые слова не являются хорошим способом сделать это. С другой стороны, популярность Python может означать, что в будущем все больше языков будут использовать только отступы для обозначения структуры - хотя я надеюсь, что нет.

0 голосов
/ 16 мая 2009

Что касается того, почему фигурные скобки завоевали популярность ... Две причины:

  1. Эффект аэродинамической трубы. Существует только очень много хороших решений для любой конкретной проблемы, и чем больше проблема анализируется, тем более похожими могут быть решения этих проблем. Таким образом, Chevrolet 2009 года больше напоминает Ford 2008 года, чем 57 'Chevy делает Ford 57 года ... Новый Chevy и новый Ford, спроектированные в той же аэродинамической трубе. Фигурные скобки и точки с запятой имеют простой инженерный смысл, что делает синтаксический анализ C значительно проще (как для компьютеров, так и для людей) по сравнению с сопоставимыми языками стиля «блок» ... Следовательно, C # настолько напоминает Java, что я иногда на мгновение забываю, какой язык Я использую.

  2. (Как уже говорилось ранее) Программистам гораздо легче выучить новый язык, который "выглядит и чувствует себя" как предыдущая модель. Не изобретай велосипед, и он не перевернется; -)

Приветствия. Кит.

PS: Я предсказываю, что в течение 50 лет мы будем использовать компиляторы «естественного языка» ... и с любовью вспоминать о хороших «днях кудрявых языков», когда мужчины напуганы, а овцы напуганы.

0 голосов
/ 16 мая 2009

Существуют ли какие-либо объективные причины, которые могли бы объяснить большое распространение и успех этого синтаксиса?

Не совсем объективно, но у С было три основных исторических преимущества:

  • в то время он был немного более кратким, чем другие языки (использование {} вместо начала / конца Алгола)
  • у него не было явных недостатков (например, у Fortran были неоднозначности и он не поддерживал несколько операторов в одной строке)
  • после того, как он стал популярным, почти любой другой дизайнер языков знал C и, вероятно, работал на C, чтобы создать набор инструментов для своего языка

Есть ли определенные преимущества перед синтаксисом других языков?

Хорошо, наличие явных разделителей блоков и операторов позволяет использовать выражения с несколькими операторами; например, вы не можете делать лямбда-выражения с несколькими утверждениями в Python (не то чтобы у вас были лямбда-выражения в C, хотя вы делаете это в новейшем C ++). Необходимость вводить только один символ для блоков является небольшим преимуществом, но не огромным (вероятно, проще настроить редактор для соответствия «начала» и «конца», чем для символов Си («{« ИЛИ »?? <") to ("} "ИЛИ" ??> "), и если скорость печати является ограничивающим фактором в вашем программировании, вы, вероятно, не автоматизируете задачу, которой должны быть).

0 голосов
/ 16 мая 2009

Afaik популярность C напрямую связана с популярностью Unix, а не с его синтаксисом. Есть несколько аспектов этой точки; его низкоуровневая (*) и тонкая обязательная библиотека, подходящая для разработки ядра, наличие компиляторов, относительные ранние попытки кросс-системной совместимости.

Если бы мне пришлось назвать вторую причину, это была бы относительная модель свободной сборки (блоки компиляции встречаются только в компоновщике, только компоновщик видит (в основном переваренная программа) выполненной в первый раз), что отлично подходит для низкой системы памяти.

Часто говорят о плотности кода, но это позже ревизионизм. Что касается более поздних языков, использующих синтаксис, это больше в надежде, что это сделает путь обновления проще, чем превосходство синтаксиса. Это хорошо видно в C #, что довольно далеко от C, за исключением блокового синтаксиса и имени.

(*) Я намекаю больше на отсутствие множества помощников компилятора. IOW более или менее содержимого libgcc, если вы урезаете его до уровня K & R.

0 голосов
/ 16 мая 2009

Синтаксис в стиле C очень компактен. В зависимости от ситуации это недостаток или преимущество. В любом случае, это повышение производительности для старших программистов на Си.

Многие новые языки официально претендуют на наследие от C, например, C ++, C #, Objective-C.

Более того, я полагаю, что многие создатели языка имеют большой C-фон. Умышленно или нет, они могут воспроизводить на своем новом языке то, что они знают лучше всего и что они считают наиболее эффективным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...