#c #expression #value-categories
#c #выражение #категории значений
Вопрос:
Я изучаю категории значений C 11 для выражений. Исходя из моего все еще поверхностного понимания, они были введены как дополнительный тип / категория для выражений, чтобы устранить проблемы компиляции, которые могли возникнуть из-за возможного присутствия семантики перемещения.
Кроме того, если я правильно понял, категории значений — это не то же самое, что тип выражения, их всего 5, и между ними существуют отношения типа «is-a», подобные наследованию.
На первый взгляд все это кажется очень своеобразным и, возможно, немного слишком сложным.
Мне было интересно, является ли эта сложность:
- является фундаментальным и общим (и, следовательно, его нельзя избежать), поскольку оно исходит из общей теории выражений, или
- если это просто причуда C .
Если это последнее, не является ли причиной такого сложного моделирования историческая эволюция C в стиле аккреции, которая ограничивает разработку языка, оставляя неизменными все прошлые дизайнерские решения?
Мой интерес к этому вопросу заключается в том факте, что: если мы рассматриваем случай 1), я получу больше мотивации для ознакомления с тонкостями категорий значений, поскольку я заинтересован в понимании языков программирования в целом на фундаментальном уровне. В этом случае не могли бы вы дать мне представление о том, как эта теория задействована или используется при разработке какого-либо другого языка?
Если вместо этого мы рассматриваем случай 2), все равно было бы очень интересно продолжить изучение темы и поискать лучшие, более простые и чистые модели для выражений и типов / категорий для них. Также в этом случае есть представление о том, как другие языки обрабатывают эти вещи?
Комментарии:
1. Это просто причуда.
2. На самом деле это не так сложно, как только вы это изучите. Существует только три отдельные категории (lvalue, xvalue, prvalue), а два других названия являются условиями удобства группировки двух категорий вместе.
3. Это особенность C , и она обусловлена «эволюцией в стиле аккреции» (которую я бы назвал «доблестными усилиями сохранить обратную совместимость» для языка, который был невероятно успешным). Одно из больших преимуществ Haskell перед C заключается в том, что отсутствие успеха позволило ему развиваться более чисто, поскольку разработчики Haskell готовы нарушить обратную совместимость (когда есть веская причина, а не по прихоти), и небольшое сообщество пользователей соглашается с тем, что язык развивается таким образом.
4. Я написал игрушечный компилятор для языка, который использовал категории значений C . Это действительно упростило вставку вызовов конструкторов копирования / перемещения и деструкторов, а также позволило мне реализовать RVO и копировать elision. Я думаю, что это отличный способ работы с выражениями, а не просто особенность C .
5. Также обратите внимание: C 17 полностью обновил способ работы спецификации в отношении категорий значений в попытке упростить все это (без изменения эффективного поведения). Возможно, вы тоже захотите взглянуть на это.