Tipi enumerati e loro interpretazione da parte dei compilatori

1

Mi sembra che molti, se non la maggior parte, i compilatori trattino tipi enumerati come int sotto. In C / gcc, enum s viene compilato a int . In C # / Visual C #, puoi cambiare il tipo di dati sottostante con qualcosa di simile:

enum Days : byte {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};

ma il valore predefinito è int (secondo paragrafo) se non si modifica il tipo.

Per ovvi motivi, int s è efficiente. Vanno attraverso l'ALU con facilità ed evitano inutili confronti tra stringhe.

A prima vista, non sembra che i linguaggi interpretati abbiano tipi enumerati incorporati (Ruby, Perl, JavaScript, altri sono sicuro). Possono essere emulati però; Ad esempio in JavaScript .

Le mie domande:

  1. Perché (apparentemente) la maggior parte dei compilatori usa int come tipo sottostante? Il motivo storico / prestazioni è correlato?
  2. Ci sono linguaggi che compilano tipi enumerati con qualcosa di diverso da int (o byte , long , tipi numerici ...)? Se è così, perché hanno scelto di farlo in modo diverso?
posta Chris Cirefice 09.12.2014 - 04:00
fonte

2 risposte

3

La prima parte della tua domanda sarà difficile da rispondere perché quella decisione è stata presa molto tempo fa e bisognerebbe chiedere ai creatori di linguaggi come C di saperlo con certezza.

Il tuo secondo punto è abbastanza rispondente.

  • Java ha creato il tipo enum in risposta all'uso diffuso delle costanti int che non si comportano bene ( Efficace Java, seconda edizione, Bloch , articolo 30 / pagina 147). Ad esempio, puoi moltiplicare due costanti integer in modo non sensato ma non puoi fare lo stesso con due valori di enum . È possibile moltiplicare RED con BLUE quando si usano costanti integer, ma non enumerazioni. Che cosa significa, comunque?

    Inoltre, questa decisione è stata presa perché il tipo di enumerazione può essere "più intelligente". Può contenere valori e incapsulare il comportamento all'interno di ciascun valore enum. Piuttosto che avere un switch rispetto ai valori enum che sono fragili e un problema di manutenzione, inverti la logica e metti il corpo di ogni case all'interno di ogni singolo enum. Ora chiama un metodo sulla tua variabile enum e usa invio dinamico per astrarre il tuo switch. Ora l'enum ha i suoi valori e comportamenti localizzati sulla stessa classe.

  • C ++ 11 ora include il costrutto enum class che è stato fatto perché linguaggi come Java hanno implementato enumerazioni "intelligenti" con un buon successo. ( Lingua di programmazione C ++, 4a edizione, Stroustrup , sezione 8.4 / pagina 218) .

risposta data 09.12.2014 - 06:40
fonte
2

Cercherò di fare un po 'di luce in base alle lingue con cui ho più familiarità:

D :

Gli enumeratori nel linguaggio D sono solo un altro modo per dichiarare le costanti in fase di compilazione. Sono molto flessibili e consentono enumerazioni di tipo stringa, cosa non molto comune. È anche possibile controllare la dimensione delle costanti intere. Vedi la parte inferiore della pagina nel collegamento precedente per diversi esempi.

C ++ :

Le enumerazioni non classificate di vecchio stile in C ++ non sono richieste per avere la dimensione di un oggettoint di C ++%. Possono essere più grandi di così. Citando questo riferimento :

an unscoped enumeration type whose underlying type is not fixed ... in this case, the underlying type is either int or, if not all enumerator values can be represented as int, an implementation-defined larger integral type that can represent all enumerator values.

Quindi, se confrontiamo le dimensioni di questi due enumeratori C ++:

enum Test1 {
    A1,
    B1
};
enum Test2 {
    A2,
    B2 = 18446744073709551615ULL /* UINT64_MAX */
};

Il primo sarà la dimensione di un intero predefinito ( int ) e il secondo, la dimensione di un intero a 64 bit ( long long int ) per adattarsi alla costante di grandi dimensioni.

Il nuovo enum class introdotto in C ++ 11 consente all'utente di specificare la dimensione del tipo enum e le sue costanti. Anche le costanti sono con scope. Sono molto simili a un enumeratore C #.

Perché gli interi sono il caso comune?

Speculerò che gli integer sono comunemente la scelta predefinita per i tipi di enumeratore nei linguaggi di programmazione a causa della semplicità. La macchina può davvero gestire solo numeri. Anche una stringa di testo è giusta e una serie di numeri interpretati in modo particolare dal programma.

    
risposta data 09.12.2014 - 19:08
fonte

Leggi altre domande sui tag