2011-10-16 13 views
20

¿Por qué no se garantiza que el Int type de GHC utiliza exactamente 32 bits de precisión? This document claim tiene al menos precisión con signo de 30 bits. ¿Está relacionado de alguna manera con el ajuste Maybe Int o similar en 32 bits?Tamaño del bit de Int de GHC Tipo

+3

Habrá otros con más detalles, pero creo que tiene que ver con la recolección de basura y la pereza.Un poco para "se evalúa", un poco para copiar por GC. Sin embargo, no estoy 100% seguro. – luqui

+3

Si necesita tener 32 bits garantizados, existe el tipo 'Int32' en' Data.Int'. – hammar

+1

No hay límite superior porque depende de la plataforma: en la máquina 64x 'Prelude.maxBound :: Int' debe estar alrededor de 2^63 –

Respuesta

23

Es para permitir implementaciones de Haskell que usan etiquetado. Al usar el etiquetado necesita algunos bits como etiquetas (al menos uno, dos es mejor). No estoy seguro de que actualmente haya implementaciones similares, pero parece recordar que Yale Haskell lo usó.

El etiquetado puede evitar las desventajas del boxeo, ya que no tiene que encerrar todo; en su lugar, el bit de etiqueta le dirá si se evalúa, etc.

+7

¿Podría explicar" etiquetado "y" boxeo "? –

5

Creo que esto se debe a las primeras formas de implementar GC y todo eso. Si tiene 32 bits disponibles y solo necesita 30, puede usar esos dos bits de repuesto para implementar cosas interesantes, por ejemplo, usando un cero en el bit menos significativo para denotar un valor y uno para un puntero.

Hoy en día las implementaciones no utilizan esos bits por lo que un Int tiene al menos 32 bits en GHC. (Eso no es del todo cierto. IIRC uno puede establecer algunos indicadores para tener 30 o 31 bit Int s)

14

La definición del lenguaje Haskell establece que el type Int covers at least the range [−229, 229−1]. Existen otros compiladores/intérpretes que usan esta propiedad para aumentar el tiempo de ejecución del programa resultante.

Todas las referencias internas al punto de datos Haskell (alineado) a direcciones de memoria que son múltiples de 4 (8) en sistemas de 32 bits (64 bits). Por lo tanto, las referencias solo necesitan 30 bits (61 bits) y, por lo tanto, permiten 2 (3) bits para "etiquetado con puntero".

En el caso de los datos, el GHC usa esas etiquetas para almacenar información sobre los datos a los que se hace referencia, es decir, si ese valor ya está evaluado y, en caso afirmativo, qué constructor tiene.

En caso de 30 bits (s Int así, no GHC), se podría utilizar un bit para decidir si es o bien un puntero a un Int sin evaluar o que Int sí.

El etiquetado de punteros se puede usar para recuento de referencia de un bit, que puede acelerar el proceso de recolección de basura. Esto puede ser útil en casos en los que se creó una relación directo productor-consumidor directa en el tiempo de ejecución: resultaría directamente en la reutilización de la memoria en lugar de la alimentación de un recolector de basura.

Por lo tanto, el uso de 2 bits para el etiquetado de puntero, podría haber alguna combinación salvaje de intensa optimización ... En caso de Entrs que podía imaginar estos 4 etiquetas:

  • una referencia singular a un sin evaluar Int
  • una de las muchas referencias a los mismos, posiblemente, aún sin evaluar Int
  • 30 bits de que Int
  • una referencia (de posiblemente muchas referencias) a una evaluación de 32 bits Int.
+0

@hvr: No estoy seguro de por qué recordé 28bits; el informe Haskell 98 indica el mismo rango que el 2010. Thx para la corrección. – comonad

+0

He revisado todo. Texto completamente nuevo, más preciso que antes. – comonad

Cuestiones relacionadas