¿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
Respuesta
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.
¿Podría explicar" etiquetado "y" boxeo "? –
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)
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
sí - una referencia (de posiblemente muchas referencias) a una evaluación de 32 bits
Int
.
- 1. Tipo de datos de tamaño de bit arbitrario en C#
- 2. 32bit int * 32bit int = 64 bit int?
- 3. Inferencia de tipo GHC infortunios
- 4. tipo de int * (*) (* int, int * (*)())
- 5. Tipo de devolución de operadores bit a bit en C++
- 6. Comprensión del tamaño de objeto CLR entre 32 bit frente a 64 bit
- 7. Reducir el tamaño del ejecutable producido por GHC
- 8. Cuadrando n-bit int vs. multiplicando dos n bit ints
- 9. Puntero C++ de tamaño de bit específico
- 10. tamaño del tipo de caracteres en C#
- 11. Encontrar nth bit SET en un int
- 12. de LLVM para GHC
- 13. Tipo de advertencia de conversión después de operaciones bit a bit en C
- 14. Operadores de bit a bit y conversión de un int a 2 bytes y viceversa
- 15. ¿Haces solo la verificación de tipo de GHC?
- 16. ¿Campos de bits de tipo distinto de int?
- 17. índice de mysql en la columna del tipo int
- 18. Arrays de desplazamiento bit a bit
- 19. El xyz literal del tipo int está fuera del rango
- 20. Lista de extensiones GHC
- 21. uso de los operadores bit a bit para empaquetar valores múltiples en un int
- 22. GHC: error al inferir el tipo de parámetro phantom
- 23. Límite de tamaño del tipo de datos JSON en PostgreSQL
- 24. bit a bit de sustracción en Python
- 25. ¿De qué cosas debería tener cuidado si estoy usando unboxed type (como Int #) en Haskell/GHC?
- 26. OR bit a bit de las constantes
- 27. Tamaño de int en C en arquitecturas diferentes
- 28. AND bit a bit/NO de VB.NET a C#
- 29. ¿Cómo correlacionar un tipo de bit en Mysql para hibernar?
- 30. Cuál es el tamaño máximo de int (10) en Mysql
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
Si necesita tener 32 bits garantizados, existe el tipo 'Int32' en' Data.Int'. – hammar
No hay límite superior porque depende de la plataforma: en la máquina 64x 'Prelude.maxBound :: Int' debe estar alrededor de 2^63 –