Определение языка Haskell гласит, что тип Int
охватывает по крайней мере диапазон [−2 29 , 2 29 −1] .
Существуют другие компиляторы / интерпретаторы, которые используют это свойство для увеличения времени выполнения результирующей программы.
Все внутренние ссылки на (выровненные) данные Haskell указывают на адреса памяти, кратные 4 (8) в 32-разрядных (64-разрядных) системах. Таким образом, ссылки должны иметь только 30 бит (61 бит) и, следовательно, разрешить 2 (3) бита для «маркировки указателя» .
В случае данных GHC использует эти теги для хранения информации об этих ссылочных данных, т. Е. Оценивается ли уже это значение и, если да, то какой у него конструктор.
В случае 30-битных Int
с (то есть, не GHC), вы можете использовать один бит, чтобы решить, является ли он указателем на неоцененный Int
или самим Int
.
Теговое указание может использоваться для подсчета однобитных ссылок , что может ускорить процесс сбора мусора. Это может быть полезно в тех случаях, когда во время выполнения были созданы непосредственные отношения один к одному производитель-потребитель: это привело бы непосредственно к повторному использованию памяти вместо загрузки сборщика мусора.
Итак, используя 2 бита для маркировки указателя, можно получить некоторую дикую комбинацию интенсивной оптимизации ...
В случае Ints я мог бы представить эти 4 тега:
- единственная ссылка на неоцененную
Int
- одна из многих ссылок на то же самое, возможно, все еще неоцененная
Int
- 30 битов этого
Int
самого
- ссылка (возможно, из множества ссылок) на оцененный 32-битный
Int
.