Почему GHC Int type
не гарантированно использует ровно 32 бита точности? Этот документ претендует, он имеет не менее 30-битной точности. Это как-то связано с установкой Maybe Int
или схожими в 32-битные?
Размер бит GHC Int Type
Ответ 1
Это разрешить реализации Haskell, использующих тегирование. При использовании меток вам нужны несколько бит в качестве тегов (по крайней мере один, два лучше). Я не уверен, что в настоящее время есть такие реализации, но я, кажется, помню, что Йель Хаскелл использовал его.
Маркировка может несколько избежать недостатков бокса, так как вам больше не нужно вскрывать все; вместо этого бит тега скажет вам, будет ли он оцениваться и т.д.
Ответ 2
В определении языка Haskell указано, что type Int
охватывает хотя бы диапазон [-2 29 2 29 -1].
Существуют и другие компиляторы/интерпретаторы, которые используют это свойство для увеличения времени выполнения результирующей программы.
Все внутренние ссылки на (выровненные) данные Haskell указывают на адреса памяти, которые кратно 4 (8) в 32-разрядных (64-разрядных) системах. Таким образом, для ссылок требуется только 30 бит (61 бит) и, следовательно, разрешить 2 (3) бита для "маркировки указателя".
В случае данных GHC использует эти теги для хранения информации об этих ссылочных данных, то есть, будет ли это значение уже оценено и если это имеет тот конструктор, который он имеет.
В случае 30-разрядного Int
(так, а не GHC) вы можете использовать один бит, чтобы решить, является ли он указателем на неоценимый Int
или сам Int
.
Пометка указателя может использоваться для однобитового подсчета ссылок, что может ускорить процесс сбора мусора. Это может быть полезно в тех случаях, когда во время выполнения было создано прямое взаимно-однозначное отношение между производителем и потребителем: это приведет непосредственно к повторному использованию памяти вместо подачи сборщика мусора.
Итак, используя 2 бита для маркировки указателя, может быть какая-то дикая комбинация интенсивной оптимизации... В случае Интов я мог представить эти 4 тега:
- особая ссылка на неоценимую
Int
- одна из многих ссылок на один и тот же, возможно, еще не оцененный
Int
- 30 бит этого
Int
- ссылка (возможно, много ссылок) на оцениваемый 32-разрядный
Int
.
Ответ 3
Я думаю, что это из-за ранних способов внедрения GC и всего этого. Если у вас есть 32 бита, и вам нужно всего 30, вы можете использовать эти два запасных бита для реализации интересных вещей, например, используя нуль в младшем значении для обозначения значения и один для указателя.
Сегодня реализации не используют эти биты, поэтому Int
имеет не менее 32 бит в GHC. (Это не совсем так. IIRC можно установить несколько флагов с 30 или 31 бит Int
s)