2012-04-14 3 views
13

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

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

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

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

ответ

13

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

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

Const
неизменны
совместно

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

EDIT: Похоже, что нет определенного официального списка классов хранения в D. Термин используется почти для любого атрибута, используемого в объявлении переменной, который не влияет на его тип (т. Е. Не является классификатором типа). Похоже, что Уолтер и Андрей склонны уделять большое внимание классификаторам типов, чтобы подчеркнуть, какие атрибуты влияют на тип переменной, но термин класс хранения не был дано нигде почти такого же уровня важности и в конечном итоге используется не в соответствии с каким-либо строгим определением.

+0

auto не является заполнителем для типа. Это просто класс non-op starage, который ставится перед декларациями без каких-либо других sc или типов, поэтому компилятор распознает его как объявление и вводит тип. неизменяемый x = 5; работает просто отлично без авто. – Mafi

+0

@Mafi, * фактически *, 'auto' можно рассматривать как класс хранения для переменных стека, как в C и C++. Ключевое слово 'auto' исходит из этого использования, и его семантика * расширена *, чтобы допускать вывод типов переменных без каких-либо других классов хранения; только в этот момент ключевое слово стало использоваться вне локальных переменных. Однако ключевое слово 'auto' было редким зрением перед семантикой вывода типа, и по-прежнему является редким зрелищем на C, поскольку' auto' является классом хранения по умолчанию для локальных переменных. Он называется «авто», потому что это означает «автоматическое время жизни», то есть переменную стека. –