Размер бита типа GHC Int - PullRequest
       43

Размер бита типа GHC Int

21 голосов
/ 16 октября 2011

Почему в Int type GHC не гарантировано использование точности 32 бита? В этом документе утверждается , он имеет не менее 30-битной точности со знаком.Это как-то связано с подгонкой Maybe Int или схожим с 32-битным?

Ответы [ 3 ]

24 голосов
/ 16 октября 2011

Это разрешает реализации Haskell, которые используют тегирование.При использовании тегов вам понадобится несколько битов в качестве тегов (хотя бы один, два лучше).Я не уверен, что в настоящее время есть такие реализации, но я, кажется, помню, что Йель Хаскелл использовал это.

Маркировка может несколько избежать недостатков бокса, так как вам больше не нужно все упаковывать;вместо этого бит метки скажет вам, оценен ли он и т. д.

14 голосов
/ 28 октября 2011

Определение языка 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.
5 голосов
/ 16 октября 2011

Я думаю, это из-за ранних способов реализации GC и всего такого.Если у вас есть 32 доступных бита и вам нужно только 30, вы можете использовать эти два запасных бита для реализации интересных вещей, например, используя ноль в младшем значащем бите для обозначения значения и единицу для указателя.

Сегодня реализации не используют эти биты, поэтому Int имеет как минимум 32 бита на GHC.(Это не совсем так. IIRC можно установить для некоторых флагов 30 или 31 бит Int с)

...