Синтаксический сахар против особенности

В C# (и Java) строка немного больше чем массив символов с сохраненной длиной и несколькими методами. Аналогично, объекты (в сравнении со ссылками и ценностями) - это не более, чем прославленные структуры с наследованием и добавленными интерфейсами.

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

Чтобы продолжить эту идею, подумайте (у меня могут быть некоторые детали неправильно, но суть остается):

transistor
elementary logic gate
compound gate
  |         |
 ALU    flip-flop
   |    |       |
   | register  RAM
   | |
   CPU
   microcode
   assembly
   C
   C++
   | |
MSIL JavaScript
C#   jQuery

Много раз, любой отдельный слой абстракции очень похож на синтаксический сахар, но несколько слоев разделения очень сильно отличаются друг от друга.

Как вы знаете, когда что-то перестало быть синтаксическим сахаром и стало добросовестным?

10 ответов

Решение

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

Вы правы, когда говорите, что на самом деле объекты - это прославленные структуры с методами и наследованием. Это, однако, только деталь реализации. То, что позволяют объекты, - это думать по-другому. Вы можете легче относиться к сущностям реального мира, думая об объектах. То же самое произошло, когда мы вернулись назад во времени, мы перешли от использования переходов к процедурному программированию. Под капотом процессор все еще продолжает переходить от OP к OP, но мы могли бы думать по-другому, более "черным" способом.

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

Синтаксический сахар - это особенность.

Когда изменение дает значение? Я закодировал в ассемблере. Я переключился на C и посмотрел на вывод компилятора. Его код был на 95% лучше моего ручного ассемблера, и его было гораздо проще написать. Для меня это обеспечило ценность, поэтому я бы сказал, что это не сахар.

C++ помогает мне переводить мои объектно-ориентированные мысли в код. Пока накладные расходы не очень высоки, я думаю, что это особенность.

Я практичный вид. "Если я вижу, это ценно" - мой ответ

Все программное обеспечение представляет собой гигантский стек абстракций, построенный поверх других абстракций. Строка может быть не более чем массивом символов, но есть много операций, которые кажутся естественными для строк, но неудобными для массивов символов. Цель всех этих абстракций одна и та же: удалить ненужные детали, чтобы разработчик мог сосредоточиться на важных частях проблемы.

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

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

Кажется, что синтаксический сургар - это синтаксис, который ничего не меняет в способностях языка, и использование другой конструкции выполняет абсолютно одно и то же. String (мышление на Java) - это не просто синтетический сахар над массивом символов. Массив char является изменяемым (по содержанию, если не по длине). Вы не могли бы сделать массив символов неизменным с существующей языковой функцией без массива String.

С другой стороны, оператор "плюс", работающий со строками, действительно является синтетическим сахаром для использования StringBuilder и вызова append.

"Синтаксический сахар" - это функция, которая вам не нравится

Я должен был бы сказать, когда тот же самый результат не может быть достигнут простым написанием другого кода с тем же типом "ограничения по времени", что и при использовании синтаксического сахара.

Мой пример будет лямбда-выражением, записывающим foreach цикл не займет много усилий, но с использованием .Foreach() конечно тоже приятно; против переписывания всего HttpRequest класс самостоятельно. Один синтаксический, один особенность. И то, и другое экономит время, причем один в гораздо большей степени, чем другой.

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

Некоторые конструкции могут быть однозначно расценены как синтаксический сахар. Например, в VB.NET код для проверки того, что две ссылки не равны, используется для запроса If Not (ref1 Is Ref2) но более новые версии языка позволяют If ref1 IsNot Ref2, Ничто не может быть выражено в новом синтаксисе, который не может быть выражен в старом, но новый синтаксис является более чистым, не вносит двусмысленности, и единственная причина, по которой его не следует использовать, заключается в том, что код должен быть обратно совместим со старыми версиями. языка.

Некоторые конструкции может быть немного сложнее определить как сахар. В частности, если язык добавляет конструкции, которые будут работать идентично существующим конструкциям при использовании с другими типами, но не смогут компилироваться с другими, такие конструкции могут обеспечить средства проверки типов во время компиляции, которых раньше не было. Обобщения Java обычно можно рассматривать в этом свете. Можно добавить Cat для ArrayList<Cat> так же легко, как ArrayList; что за ArrayList<Cat> добавляет это охранник, чтобы отклонить Dogво время компиляции. Так как ограничения во время компиляции не позволяют писать программы, которые не могут быть написаны без них, некоторые люди могут рассматривать их как синтаксический сахар. С другой стороны, даже если проверка типа выполняется во время компиляции, а не во время выполнения, она все равно может рассматриваться как одно из заданий программы.

"лень - двигатель прогресса". Этот процесс остановится, когда вы сможете сразу отобразить свои идеи в машине.

Синтаксический сахар и языковая особенность в основном описывают одно и то же, даже если синтаксический сахар иногда используется уничижительно, тогда как особенность часто связана с более глубокими изменениями в языковой архитектуре (введение лямбд и т. Д.). Но это различие очень зависит от индивидуальной точки зрения (и его субъективно чувствуется полезность).

Относительно аспектов языкового дизайна и вашего примера с strings а также char-arraysЯ бы сказал, что это не должно быть ни функцией, ни сахаром, а просто выражаться в базовом синтаксисе языков (LOP - языковое программирование). Общие понятия (классы типов, метапрограммирование и т. Д.) Позволяют вам самостоятельно выразить много новых и полезных конструкций, не дожидаясь, пока язык получит новую функцию. Достаточно взглянуть на возможности метапрограммирования на Haskell или C++.

Другие вопросы по тегам