2012-04-14 13 views
13

Fino ad ora avevo l'impressione che cose come immutable e const fossero classi di archiviazione. In un recente video (at around 11:55) Walter Bright afferma che immutable non è una classe di archiviazione, ma piuttosto un costruttore di tipi. Nel official documentation, immutable, const, e tra le molte altre parole chiave, sono elencati come classi di memoria:Quali sono le classi di memoria in D?

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

`la lista sbagliata? Alcune di esse non hanno senso (ad es. Deprecate, override).

So che static e ref sono classi di archiviazione, ma qual è il resto? E quale delle parole chiave in D sono costruttori di tipi?

risposta

13

Vorrei sottolineare che c'è una grande differenza tra una regola di grammatica denominata StorageClass e ciò che è semanticamente una classe di memoria nella lingua. Le regole grammaticali hanno a che fare con l'analisi, non con la fase semantica della compilazione.

Prima di tutto, TDPL, capitolo 8, è esplicitamente relativo ai qualificatori di tipo (per i quali Walter ha utilizzato il termine costruttore di termini). Ci sono solo 3 di loro in D:

const
immutabile
condiviso

Tutti e tre di loro sono una parte del tipo che modificano. Questo non è vero con le classi di archiviazione come ref.

inout è ciò che TDPL chiama un "qualificatore di caratteri jolly", quindi è un segnaposto per un qualificatore di tipo anziché essere un qualifer o di classe di archiviazione.

Ora, da che cosa è un classi di memoria o no, io do due citazioni da TDPL:

Ogni parametro di funzione (base e exponent nell'esempio di cui sopra) ha, in aggiunta al suo tipo, un optional classe di memoria che decide il modo in cui gli argomenti vengono passati alla funzione quando vengono richiamati.

(da pagine 6 - 7)

Sebbene static non è legato al passare argomenti alle funzioni, discutere qui è appropriato perché, proprio come ref, static applicato ai dati è una classe stoccaggio, che significa un'indicazione su un dettaglio relativo alla modalità di memorizzazione dei dati.

(da pag 137)

Inoltre, c'è questa linea per quanto riguarda le classi di stoccaggio in C che sembra essere usedquite a bit in spiegazioni sulle classi di memoria in C trovare online:

A La classe di memoria definisce l'ambito (visibilità) e la durata delle variabili e/o funzioni all'interno di un programma C.

Una classe di memoria non ha alcun effetto sul tipo di una variabile, solo come è memorizzata. Sfortunatamente, non riesco a trovare un elenco esatto delle classi di archiviazione in D, e le persone sono abbastanza liberali con il termine classe di archiviazione, utilizzandolo anche quando non si applica. Praticamente qualsiasi attributo applicato a un tipo di salvataggio per i modificatori di accesso sembra essere chiamato classe di memoria, a seconda di chi sta parlando. Tuttavia, ci sono alcuni che sono al di là di classi di memoria dubbio:

enum (quando usato come costante manifesta)
extern
artificiale
su
ref
portata
statico

lazy, out e ref possono essere utilizzati per modificare la funzione parametri e indicano come vengono passati, mentre enum e static vengono utilizzati per indicare come vengono memorizzate le variabili (che non è da nessuna parte nel caso di enum, dal momento che le costanti manifest vengono copiate dappertutto che vengono utilizzate anziché essere variabili effettive). extern influisce sul collegamento.

in è un ibrido, dal momento che è un sinonimo di scope const, e mentre scope è una classe di archiviazione, const è un qualificatore tipo.

La documentazione online si riferisce anche a auto e synchronized come classi di archiviazione, anche se non so su quali basi. auto è come inout in quanto è un segnaposto (nel suo caso un segnaposto per un tipo piuttosto che un qualificatore di tipo) e quindi non indica nulla su come un tipo viene archiviato, quindi non avrei pensato che sarebbe una classe di archiviazione. synchronized non modifica le variabili ma piuttosto le classi.

__gshared è probabilmente anche una classe di archiviazione, anche se è un po 'divertente, poiché fa più o meno ciò che fa shared (che è un qualificatore di tipo), ma non fa parte del tipo.

Oltre quello, non lo so. Il fatto che synchronized sia elencato come una classe di memoria implica che alcuni degli altri (come final) potrebbero essere, ma (come synchronized) non hanno nulla a che fare con il modo in cui le variabili sono memorizzate o collegate. Quindi, non so come potrebbero essere considerati classi di archiviazione.

Chiederò comunque al newsgroup e vedo se riesco a ottenere un elenco più definitivo.

EDIT: Sembra che non vi sia un elenco definitivo e ufficiale di classi di memoria in D. Il termine è utilizzato per quasi tutti gli attributi utilizzati in una dichiarazione di variabile che non influisce sul suo tipo (cioè non un qualificatore di tipo). Sembra che Walter e Andrei tendano a fare un grande punto sui qualificatori del tipo per sottolineare quali attributi effettivamente influenzano il tipo di una variabile, ma il termine classe di memoria non è stato dato quasi allo stesso livello di importanza e finisce per essere usato informalmente piuttosto che per ogni definizione rigorosa.

+0

auto non è un segnaposto per un tipo. E 'solo una classe di tipo starage no-op che viene messa di fronte alle dichiarazioni senza nessun altro sc o tipo, quindi il compilatore lo riconosce come dichiarazione e ne deduce il tipo. immutabile x = 5; funziona bene senza auto. – Mafi

+0

@Mafi, * effettivamente *, 'auto' può essere considerato come la classe di archiviazione per le variabili stack, come in C e C++. La parola chiave 'auto' deriva da questo utilizzo e la sua semantica era * espansa * per consentire l'inferenza di tipo delle variabili senza altre classi di memoria; è stato solo a questo punto che la parola chiave è diventata utilizzabile al di fuori delle variabili locali. Tuttavia, la parola chiave 'auto' era una rara vista prima della sua semantica di inferenza di tipo, ed è ancora una vista rara in C, dato che 'auto' è la classe di archiviazione predefinita per le variabili locali. Si chiama "auto" perché significa "durata automatica", cioè una variabile di stack. –

Problemi correlati