Подтвердить что ты не робот

Каковы классы хранения в D?

До сих пор у меня создалось впечатление, что такие вещи, как immutable и const, были классами хранения. В недавнем видео (примерно в 11:55) Уолтер Брайт утверждает, что immutable не является классом хранения, а скорее конструктором типа. В официальной документации , immutable, const и среди многих других ключевых слов перечислены как классы хранения:

StorageClass:
abstract
auto
const
deprecated
enum
extern
final
immutable
inout
shared
nothrow
override
pure
__gshared
Property
scope
static
synchronized

Является ли этот список неправильным? Некоторые из них не имеют смысла (например, устарели, переопределяются).

Я знаю static и ref классы хранения, но что остальное? И какое из ключевых слов в D являются конструкторами типов?

4b9b3361

Ответ 1

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

Прежде всего, TDPL, глава 8, явно относится к классификаторам типов (для которых Уолтер использовал конструктор типа термина). В D только 3 из них:

Уст
  неизменная
  общий

Все три из них являются частью типа, который они изменяют. Это не относится к классам хранения, таким как ref.

inout - это то, что TDPL называет "символом классификатора подстановочных знаков", поэтому он является заполнителем для классификатора типа, а не действительно является типом qualifer или классом хранения.

Теперь, что касается классов хранения или нет, я даю две цитаты из TDPL:

Каждый параметр функции (base и exponent в приведенном выше примере) имеет в дополнение к своему типу дополнительный класс хранения, который определяет способ передачи аргументов функции при вызове.

(со страниц 6 - 7)

Хотя static не связан с передачей аргументов функциям, обсуждение этого вопроса является подходящим, потому что, как и ref, static, применяемое к данным, это класс хранения, что означает указание о деталях относительно того, как данные сохранены.

(со страницы 137)

Кроме того, эта строка относится к классам хранения в C, которая, как представляется, используется довольно немного в объяснениях классов хранения в C, найденных в Интернете:

Класс хранения определяет область видимости и время жизни переменных и/или функций в рамках программы C.

Класс хранения не влияет на тип переменной, как он хранится. К сожалению, я не могу найти точный список классов хранения в D, и люди довольно либеральны с термином класс хранения, используя его, даже если он не применяется. Практически любой атрибут, применяемый к типу save для модификаторов доступа, кажется, называется классом хранения, в зависимости от того, кто говорит. Тем не менее, есть несколько, которые, вне всякого сомнения, являются классами хранения:

enum (при использовании в качестве константы манифеста)
  ехЬегп
  ленивым
  из
  исх
  сфера
  статические

lazy, out и ref могут использоваться для изменения параметров функции и указания того, как они передаются, тогда как enum и static используются для указания того, как хранятся переменные (что нигде в случае enum, поскольку константы манифеста скопированы повсюду, где они используются, а не являются фактическими переменными). extern влияет на связь.

in является гибридным, поскольку он является синонимом для scope const, и хотя scope является классом хранения, const является классификатором типов.

В онлайн-документации также упоминаются auto и synchronized как классы хранения, хотя я не знаю, на какой основе. auto похож на inout на то, что он является заполнителем (в своем случае - заполнителем для типа, а не спецификатором типа) и поэтому не указывает ничего о том, как хранится тип, поэтому я бы не подумал, что это будет класс хранения. synchronized не изменяет переменные, а классы.

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

Помимо этого, я не знаю. Тот факт, что synchronized указан как класс хранения, подразумевает, что некоторые из других (например, final) могут быть, но (например, synchronized) они не имеют никакого отношения к тому, как переменные хранятся или связаны. Итак, я не знаю, как их можно считать классами хранения.

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

РЕДАКТИРОВАТЬ. Похоже, что нет окончательного официального списка классов хранения в D. Термин используется почти для любого атрибута, используемого в объявлении переменной, который не влияет на его тип (т.е. а не классификатор типа). Похоже, что Уолтер и Андрей склонны уделять большое внимание классификаторам типов, чтобы подчеркнуть, какие атрибуты влияют на тип переменной, но термин класс хранения не был дано нигде почти такого же уровня важности и в конечном итоге используется неофициально, а не по любому строгому определению.