2011-10-16 10 views
20

Perché non è garantito l'utilizzo di Int type di GHC con esattamente 32 bit di precisione? This document claim ha almeno Precisione firmata a 30 bit. È in qualche modo correlato al raccordo Maybe Int o simile in 32-bit?Dimensione bit di GHC's Int Type

+3

Ci saranno altri con maggiori dettagli, ma penso che abbia a che fare con la raccolta dei rifiuti e la pigrizia.Un po 'per "è valutato", un po' per copiato da GC. Non sicuro al 100%. – luqui

+3

Se è necessario avere 32 bit garantiti, c'è il tipo 'Int32' in' Data.Int'. – hammar

+1

Non c'è limite superiore perché dipende dalla piattaforma: sulla macchina 64x 'Prelude.maxBound :: Int' dovrebbe essere intorno a 2^63 –

risposta

23

È per consentire implementazioni di Haskell che utilizzano la codifica. Quando usi il tagging hai bisogno di alcuni bit come tag (almeno uno, due è meglio). Non sono sicuro che al momento ci siano tali implementazioni, ma mi sembra di ricordare che Yale Haskell l'abbia usato.

L'etichettatura può in qualche modo evitare gli svantaggi del pugilato, dal momento che non è più necessario impacchettare tutto; invece il tag bit ti dirà se è valutato ecc.

+7

Potresti spiegare" tagging "e" boxing "? –

5

Penso che questo sia dovuto ai primi modi di implementare GC e tutto il resto. Se disponi di 32 bit e ne hai solo 30, puoi utilizzare questi due bit di riserva per implementare cose interessanti, ad esempio utilizzando uno zero nel bit meno significativo per indicare un valore e uno per un puntatore.

Oggi le implementazioni non utilizzano quei bit in modo che uno Int abbia almeno 32 bit su GHC. (Non è del tutto vero. IIRC si possono impostare alcune bandiere per avere 30 o 31 bit Int s)

14

La definizione del linguaggio Haskell afferma che lo type Int covers at least the range [−229, 229−1]. Esistono altri compilatori/interpreti che utilizzano questa proprietà per aumentare il tempo di esecuzione del programma risultante.

Tutti i riferimenti interni ai dati Haskell (allineati) puntano a indirizzi di memoria multipli di 4 (8) su sistemi a 32 bit (64 bit). Quindi, i riferimenti hanno bisogno solo di 30 bit (61 bit) e quindi consentono 2 (3) bit per "puntatore" "".

In caso di dati, il GHC utilizza tali tag per memorizzare informazioni su tali dati di riferimento, vale a dire se tale valore è già stato valutato e, in caso affermativo, quale costruttore ha.

In caso di 30-bit Int s (così, non GHC), si potrebbe usare un po 'per decidere se è o un puntatore ad un non valutata Int o che si Int.

È possibile utilizzare la codifica del puntatore per conteggio di riferimento a un bit, che può accelerare il processo di garbage collection. Ciò può essere utile nei casi in cui una relazione one-to-one tra produttore e consumatore è stata creata in fase di esecuzione: risulterebbe direttamente nel riutilizzo della memoria invece che nell'alimentazione di un garbage collector.

Quindi, utilizzando 2 bit per l'indicatore del tagging, ci potrebbe essere una combinazione selvaggia di ottimizzazione intensa ... In caso di Ints potevo immaginare questi 4 tags:

  • singolare riferimento a un non valutata Int
  • uno dei molti riferimenti agli stessi eventualmente ancora non valutata Int
  • 30 bit di tale Int stessa
  • riferimento (di molti possibili riferimenti a) una valutazione di 32 bit Int.
+0

@hvr: non sono sicuro del motivo per cui ho ricordato 28 bit; il Rapporto Haskell 98 riporta lo stesso intervallo del 2010. Thx per la correzione. – comonad

+0

Ho revisionato tutto. Testo completamente nuovo, più preciso di prima. – comonad

Problemi correlati