2017-02-14 26 views
2

(Вводящий в заблуждение заголовок: это только один из из множества взаимосвязанных аналогичных вопросов ниже: они звучат как просят полное справочное руководство, но имейте в виду эту тему там is нет справочного руководства, кроме полного Исходные коды GHC на его стадии STG, а также коллективный накопленный опыт других/«инсайдеров» ..)В выход STG GHC с -O2, что это за последовательность, следующая за Str = DmdType?

Я изучаю «транспиляцию» Haskell (с нуля для удовольствия/обучения, игнорируя существующие проекты, целевой язык/s аналогично высокоуровневой/«уже подходящей для STG-машины» с существующими GC + lambdas/func-values ​​+ closures), и поэтому я пытаюсь стать более знакомыми с STG IR GHC. Повторно просмотрев десятки или две онлайн-статьи/видеоролики различного возраста, глубины, деталей, которые действительно занимаются этой темой (плюс оригинальная статья, а также StgSyn.hs) и понимают многие, возможно, самые основные принципы, видя -ddump-stg ed output по-прежнему меня озаряет в разных частях (я не буду вручную разбирать его, но повторно использовать API GHC в памяти AST позже, конечно) --- в основном я думаю, что я застрял, отображая мои «грубо известные» концепции в " все еще иностранные "сокращенные/кодифицированные идентификаторы этого IR. Если вы немного знаете свой путь вокруг STG, подумайте о следующем мини-образце, чтобы прояснить несколько открытых вопросов и помочь еще больше укрепить мои (и будущие поиски)?

От a most simple .hs module, я -ddump-stg ред дважды, первый (слева) с -O0, а затем (справа) с -O2, both captured in this diff.

Проходя через все DEF-по четкости ..

  • Линии L_ | R5-11: так в O2, testX1 и testX2 кажутся глобальными константами/литералов для целых чисел 4 и 5 - - O0 их не имеет. Любопытно!

  • Есть Str=DmdType что-то о строгости? «Строгость типа по требованию» или некоторые такие? Но тогда глобальный постоянный литерал верхнего уровня/heap-ish/«global» не может быть «ленивым», может ли это ... (одна из вещей, где я не могу просто случайно Ctrl + F в StgSyn.hs --- это не там! что странно по-своему, как же там синтаксис СТГ не StgSyn.hs)

  • Caf имеют приблизительное представление о постоянной аппликативных-форм, но Unf=OtherCon? «Другой конструктор» (распакованный/родная Type.S# о связанной?) ..

  • линия L6 | R14: Удивление по-прежнему видеть информацию типа класса там (Num), является то, что «просто информация/аннотации» или это решающим для любого из встроенных кодов для создания некоторого «словарного» механизма поиска во время выполнения? (Я надеюсь, что на позднем этапе STG/pre-CMM, который будет разрешен и уже намечен, по возможности, по крайней мере в O2. После того, как GHC также решил ввести по умолчанию 4 и 5 в Integer). Вообще говоря, я понимаю, что STG является «нетипизированным», кроме обозначения типов примитивов, насыщенных минусов, возможно строк (похоже, это внизу внизу), поэтому такие аннотации типа «typeclass» могут быть только ... Я думаю, для читателей найти свой путь вокруг ddump-ed * .stg. Но исправьте меня, если нет.

  • GblId возможно, просто «глобальный идентификатор» aka верхнего уровня CAF справа? Арит ясно.

  • Линия L7 | R18: теперь Str=DmdType для testX есть, только в O2, а затем причудливый <S(LLC(C(S))LLLL),U(1*C1(C1(U)),A,1*C1(C1(U)),A,A,A,C(U))><L,U>! Что это, исчисление SKI? ; D не серьезно, LLC .. LLLL ..стек или другие макеты памяти для CMM? Есть идеи? Должна быть какая-то оптимизация, хотелось бы понять, что и как.

  • Линия L8 | R20: $dNum_sGM (слева) и $dNum_sIx (справа) меня немного беспокоит, они не кажутся «определенными» на уровне модуля "здесь где угодно. Typeclass "метод отправки словаря поиска" вид вещи? Будет, например. CMM возьмите это вместе с вышеописанной аннотацией Num, чтобы настроить ситуацию? Он всегда появляется вместе с func arg input.

  • Вся функция «тело» как для левого, так и для правого видов здесь видна в основном как «3 let s с формой лямбда-иш для 3 атомов, 2 из которых являются статически известными буквальными константами» --- I предположим, что это стандартное и ожидаемое в STG IR AST? Для первого из них, как ни странно, можно сказать, что O0 «вложил глобальное (то, что является testX1 или testX2 в O2), а O2 не имеет» (что делает последнее намного короче, поскольку это относится к обоим этим постоянным литералам).

  • Я когда-либо видел Occ=Once, что другие и как интерпретировать? Once для одного даже не в StgSyn.hs ..

  • Теперь LclId аналогом к ранее встречались GblId. Это означает объем идентификатора? Может ли это быть и в другом выражении? Как и в случае: если пересечение АСТ, я грубо знаю, насколько я глубок, я могу игнорировать это, поскольку, если я на верхнем уровне, это должно быть GblId и в противном случае LclId? Хм .. может быть, лучше взять то, что мне дает STG, но тогда мне нужно быть уверенным в семантике и возможностях. Ребята, используя StgSyn.hs У меня неправильный исходный файл, верно? Ничего на это и там .. (всегда надеюсь, не в ее комментарии достаточно хорошо сделано)

  • остальное только метаданные в виде строковых констант, OK .. Ой, подождите, посмотрите на O2, есть Str=DmdType m1 и Str=DmdType m, что m/m1 о, еще одна вещь, которую я не вижу «где-то на уровне модуля» здесь? И это не в O0 ..

  • все еще идет сильный? Просто бонус вопрос (на данный момент), расскажите нам о srt:SRT:[];)

ответ

1

Просто несколько лакомых кусочков - полный ответ вполне за пределами моего знания.

Типа вашей функции

testX :: GHC.Num.Num a => a -> a 

Он составлен на функцию с двумя аргументами: словарь класса Num типа и фактическим аргументом.

Знаки имен $d… для словарей экземпляров типового класса. Аннотации <S(LLC(C(S))LLLL),… - это строгость информации о аргументах функции. Они в основном говорят, какая часть аргумента будет использоваться вашей функцией, а какая нет. Выглядит немного странно, потому что в нем содержится информация обо всех членах экземпляра класса.

Некоторые это объясняется здесь:

https://ghc.haskell.org/trac/ghc/wiki/Commentary/Compiler/Demand

str:STR: является «Static справочная таблица», т.е. список свободных переменных выражения - в вашем случае, всегда [].

+0

Большое спасибо Крису! Я не ожидал бы «целого ответа на все», но на самом деле надеялся, что люди перехватят все, что легко им достается. Полезно знать о диктофонах и СТО и особенно о ссылках на информацию о строгости. Весьма признателен! – metaleap