Объективные преимущества синтаксиса C-стиля

В статье Википедии об истории UTF-8 говорится, что более ранняя версия UTF-8 позволяла кодировать более 21 бита. Эти кодировки занимали 5 или даже 6 байтов.

После того, как стало ясно, что 2 ^ 21 кодовых точек, вероятно, будет достаточно для оставшегося времени человечества (то же самое, что и с 5 битами, 6 битами, 7 битами, 8 битами и 16 битами), кодировки для 5 и для 6 байт были просто запрещены. Все остальные правила кодирования были сохранены для обратной совместимости.

Как следствие, числовое пространство для кодовых точек Unicode теперь равно 0..10FFFF, что даже немного меньше 21 бита. Поэтому, возможно, стоит проверить, соответствуют ли эти 21 бит 24 битам по 3 байта вместо текущих 4 байтов.

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

0xxx_xxxx                        7 bits freely chooseable
110x_xxxx 10xx_xxxx             11 bits freely chooseable
1110_xxxx 10xx_xxxx 10xx_xxxx   16 bits freely chooseable

Теперь 7 + 11 + 16 бит = 16,04 бит, что намного короче, чем требуется 21 бит. Поэтому кодирование всех кодовых точек Unicode с использованием до 3 байтов на текущие правила кодирования UTF-8 невозможно.

Вы можете определить другое кодирование, где старший бит каждого байта является битом продолжения:

0xxx_xxxx                        7 bits freely chooseable
1xxx_xxxx 0xxx_xxxx             14 bits freely chooseable
1xxx_xxxx 1xxx_xxxx 0xxx_xxxx   21 bits freely chooseable

Теперь у вас достаточно места для кодирования всех 21-битных кодовых точек. Но это совершенно новая кодировка, поэтому вам придется установить это по всему миру. Учитывая опыт работы с Unicode, это займет около 20 лет. Удачи.

7
задан Dario 16 May 2009 в 11:29
поделиться

10 ответов

ИМХО, единственное, что делает синтаксис в стиле 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? . Целью разработки было упростить реализацию компилятора. Было проще использовать препроцессор, чем определять новую языковую конструкцию для констант. Или семантика [5]. Это не относится к C ++, который очень сложно реализовать, отчасти потому, что он пытается оставаться совместимым с C.

Примеры:

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

РЕДАКТИРОВАТЬ: Еще один хороший пример: Какая самая плохая ошибка в C # или .NET? . Целью разработки было упростить реализацию компилятора. Было проще использовать препроцессор, чем определять новую языковую конструкцию для констант. Или семантика [5]. Это не относится к C ++, который очень сложно реализовать, отчасти потому, что он пытается оставаться совместимым с C.

Примеры:

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

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

Примеры:

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

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

Примеры:

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

РЕДАКТИРОВАТЬ: Еще один хороший пример: Какая самая плохая ошибка в C # или .NET? . но может привести к путанице. Реальный пример (Java): getWhiteSpace () или getWhitespace ()?

РЕДАКТИРОВАТЬ: Еще один хороший пример: Какая самая плохая ошибка в C # или .NET? . но может привести к путанице. Реальный пример (Java): getWhiteSpace () или getWhitespace ()?

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

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

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

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

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

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

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

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

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

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

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

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

     общедоступная статическая строка main ()
    

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

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

     делает [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

(Может быть, будет комикс о программисте, посетившем Денниса Ричи: «Пожалуйста, не ломайте ] в операторах switch необязательно! ")

15
ответ дан 6 December 2019 в 07:08
поделиться

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

3
ответ дан 6 December 2019 в 07:08
поделиться

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

1
ответ дан 6 December 2019 в 07:08
поделиться

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

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

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

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

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

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

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

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

4
ответ дан 6 December 2019 в 07:08
поделиться

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

1
ответ дан 6 December 2019 в 07:08
поделиться

As to why curly-braces caught on... Two reasons:

  1. The wind-tunnel effect. There are only so many good solutions to any given problem, and the more the problem is analysed the more alike the solutions to those problems are likely to become. Hence a 2009 Chevrolet more closely resembles a 2008 Ford than a 57' Chevy does a '57 Ford... The new Chevy and the new Ford where designed in the same wind tunnel. Curly-braces and semi-colons make simple engineering sense, making C substantially easier to parse (for both computers and humans) than comparable languages of "the block" style... Hence C# so closely resembles Java that I sometimes momentarily forget which langauge I'm using.

  2. (As previously stated) It's much easier for programmers to learn a new language which "looks and feels like" the previous model. Don't reinvent the wheel and it won't roll over on you ;-)

Cheers. Keith.

PS: I predict that within 50 years we'll be using "natural language" compilers... and reminiscing fondly about the good 'ole days of curly-brace languages, when men where men, and sheep where scared.

0
ответ дан 6 December 2019 в 07:08
поделиться

Are there any objective reasons that could explain the great spread and success of this syntax?

Not quite objective, but C had three main historic advantages:

  • it was a bit terser than other languages at the time ( use of {} rather than Algol's begin/end )
  • it had no obvious disadvantages ( eg Fortran had ambiguities and didn't support multiple statements on one line )
  • after it got popular, almost every other language designer knew C, and probably worked in C to build their language's toolset

Are there certain advantages over the syntax of other languages?

Well, having explicit block and statement delimiters allows multiple-statement expressions; for example, you can't do multi-statement lambda expressions in Python ( not that you have lambdas in C, though you do in the newest C++ ). Having to only type one character for blocks is a minor advantage, but not a massive one (it's probably easier to set up an editor to match "begin" to "end" than it is to match C's ("{" OR "??<") to ("}" OR "??>"), and if typing speed is the limiting factor in your programming, you're probably not automating a task you should be ).

0
ответ дан 6 December 2019 в 07:08
поделиться

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

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

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

0
ответ дан 6 December 2019 в 07:08
поделиться

People are used to it. When it was invented, every language was ugly as hell. Back then, C gained popularity for sucking less. (and perhaps for being more down-to-earth than LISP).

Today, other languages reuse the syntax because it's familiar to programmers.

I don't think there's much more to it than that. I prefer braces over begin/end (although the braces are a pain on many non-english keyboards), but there are still a lot of quirks of C syntax that could be done better. C++ is discovering that the return type might just fit better after the parameters (C++0x is allowing that syntax because it works better with other new features like decltype).

And most functional languages have realized that the parentheses around the parameters are often not necessary. For that matter, explicit typing often isn't necessary either. But most languages inherit that from C because "that's the syntax". Type first, then variable/function name.

And let's not even get into the abomination that is function pointers. Surely we can find a more elegant syntax for their types. Or try typedef'ing an array type.

Then there is the quirky choice of operators. Why not just use "and" instead of &&?

C's syntax isn't nice. It does the job, and we're so used to it that it's probably here to stay. But it's not "good".

1
ответ дан 6 December 2019 в 07:08
поделиться

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

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

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

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

0
ответ дан 6 December 2019 в 07:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: