Являются ли категории значений выражений C релевантными за пределами C ?

#c #expression #value-categories

#c #выражение #категории значений

Вопрос:

Я изучаю категории значений C 11 для выражений. Исходя из моего все еще поверхностного понимания, они были введены как дополнительный тип / категория для выражений, чтобы устранить проблемы компиляции, которые могли возникнуть из-за возможного присутствия семантики перемещения.

Кроме того, если я правильно понял, категории значений — это не то же самое, что тип выражения, их всего 5, и между ними существуют отношения типа «is-a», подобные наследованию.

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

Мне было интересно, является ли эта сложность:

  1. является фундаментальным и общим (и, следовательно, его нельзя избежать), поскольку оно исходит из общей теории выражений, или
  2. если это просто причуда C .

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

Мой интерес к этому вопросу заключается в том факте, что: если мы рассматриваем случай 1), я получу больше мотивации для ознакомления с тонкостями категорий значений, поскольку я заинтересован в понимании языков программирования в целом на фундаментальном уровне. В этом случае не могли бы вы дать мне представление о том, как эта теория задействована или используется при разработке какого-либо другого языка?

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

Комментарии:

1. Это просто причуда.

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

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

4. Я написал игрушечный компилятор для языка, который использовал категории значений C . Это действительно упростило вставку вызовов конструкторов копирования / перемещения и деструкторов, а также позволило мне реализовать RVO и копировать elision. Я думаю, что это отличный способ работы с выражениями, а не просто особенность C .

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