2009-05-16 2 views
7

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

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

ответ

14

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

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

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

Примеры:

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

EDIT: Еще один хороший пример: What is the worst gotcha in C# or .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 за беспорядок круглых скобок. Никогда не случилось с тобой, что ты должен подсчитать свои фигурные скобки, чтобы узнать, где ты пропустил его? Я иногда добавляю комментарий после закрытия, чтобы указать, что должно заканчиваться здесь. Синтаксис BASIC уже включен. И даже не нужен эквивалент открывающей скобки. Отчасти я согласен, что фигурные скобки хороши: они почти невидимы, а отступ - доминирующая визуальная характеристика. Таким образом, python - это следующий шаг.

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

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

    public static string main() 
    

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

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

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

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

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

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

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

EDIT: Несколько примеров здесь: https://stackoverflow.com/questions/163026/what-is-your-least-favorite-syntax-gotcha

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

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

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

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

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

+1

+1 Обратите внимание, что легко реализовать немного. У них также была значительная проблема с памятью, и система (с ее отдельным препроцессором-компилятором-ассемблером-компоновщиком) была разработана для минимизации состояния, необходимого в памяти сразу, чтобы максимизировать размер программ, которые могли быть скомпилированы для заданного объема памяти , –

+1

+1 Макросъемка с учетом урожайности памяти в момент возникновения C некоторых дизайнерских решений. Кроме того, кто-либо еще любит боязнь Я? –

+0

Поскольку некоторые люди помещают открывающую скобку на следующую строку, это может быть даже общим для фигурных скобок, чтобы занимать больше места. – rpetrich

3

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

+0

Я думаю, это скорее вопрос популярности. :) +1 хотя. –

1

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

+0

Отступы или фигурные скобки, по крайней мере, это не форматирование в стиле Лиспа.)()()()()) ((()))() –

+2

Преимущество слов в качестве разделителя блоков заключается в том, что вы можете определить, какой блок вы сейчас закрыли или где вы его пропустили! Сравнить End If End Хотя End Function к } }} – Dario

+0

-1 популярность языка, как правило, не основаны на поверхностном синтаксисе. Опасные выводы из воздуха. –

0

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

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

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

0

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

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

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

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

1

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

+0

То же, что и «C является популярным». Это не объясняет, почему синтаксис _got_ популярен. –

4

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

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

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

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

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

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

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

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

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

+0

BCPL не использовал фигурные скобки, он использует пары $ (и $). Одна из многих мерзких вещей об этом ... – 2009-05-16 12:59:49

+0

Действительно? Такие вещи, как точки для членов, тип/область квалификаторов при первом появлении переменной и аргументы parens for function, не кажутся вам общими? – Chuck

+0

... хорошо, да. Я старался оставаться как можно более общим. :) Но точка взята. –

0

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

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

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

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

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

+0

Перечитав некоторые тексты Брайана Кернигана, кажется, что фигурные скобки были добавлены прежде всего как чистый способ устранить болтаться еще, предоставляя токеновые представления блоков операторов. –

+0

, вероятно, проще настроить редактор для соответствия «begin» to «end», чем для соответствия C («{« OR »?? <») («}» ИЛИ «??>» - хотя это Легче снова отключить триграфы. –

+0

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

1

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

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

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

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

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

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

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

-1

Как почему фигурные скобки прижился ... Две причины:

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

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

Cheers. Кит.

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

Смежные вопросы