Как среда исполнения Haskell различает указатели и распакованные значения размером с слово? - PullRequest
0 голосов
/ 03 января 2019

На 64-битной платформе тип OCaml int равен 63 битам из-за тегов указателя. Это позволяет распаковывать целые и по-прежнему отличаться от указателей во время выполнения, что позволяет получить точный GC. IIRC, GC в GHC RTS тоже точен, но Ints GHC 64-битные, и их можно распаковывать. Если это так, то как система времени выполнения различает Ints и указатели? Похоже, та же проблема возникнет при различении других неупакованных значений размера слова и указателей.

Ответы [ 2 ]

0 голосов
/ 03 января 2019

По сути, это описано в документации GHC RTS , когда подробно описывается формат объектов кучи, включающих заголовок и полезную нагрузку.

В заголовке описывается, какие слова полезной нагрузки являются указателями, так что сборка мусора может работать.

Это означает, что для любого объекта кучи есть приблизительные издержки на слово.

0 голосов
/ 03 января 2019

Краткая версия: значения распределяются со всеми указателями и всеми не указателями, сгруппированными вместе, и включают в себя немного метаданных, чтобы GC знал, что следовать.

Обратите внимание, чтоОтчет на Haskell на самом деле позволяет Int быть 31 или 63 битами, что делает стратегию OCaml действительной - но это не то, что делает GHC.

Немного более длинная версия заключается в том, что «метаданные» - это на самом деле пара функцийкоторые используются сборщиком мусора.Чтобы сделать грубый набросок, вы могли бы представить значения в Haskell как представленные во время выполнения как объект в стиле OO с методами:

class Fn:
    # By far the most used; this evaluates the value:
    enter(...) -> ...
    # Used by the garbage collector:
    scavenge(...) -> ...
    evacuate(...) -> ...

В результате этого значения знают достаточно о себе, чтобы вести бухгалтериюи для некоторых распространенных макетов GHC определяет специализированные версии этих функций;сборщик мусора может в большинстве случаев не замечать, как именно убирают мусор и работают.Разделение указателей и не указателей позволяет создать общую реализацию и использовать ее для общего случая.

Обратите внимание, что функция 'enter' существует даже для значений на Haskell, которые не являются "функциями", посколькулень означает, что даже если типом является, например, Int, оценка все равно может включать вычисления.

Если вам нужна очень длинная версия, я предлагаю прочитать:

https://www.microsoft.com/en-us/research/publication/implementing-lazy-functional-languages-on-stock-hardware-the-spineless-tagless-g-machine/

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

...