Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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)