(Вводящий в заблуждение заголовок: это только один из из множества взаимосвязанных аналогичных вопросов ниже: они звучат как просят полное справочное руководство, но имейте в виду эту тему там 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 arginput
.Вся функция «тело» как для левого, так и для правого видов здесь видна в основном как «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:[]
;)
Большое спасибо Крису! Я не ожидал бы «целого ответа на все», но на самом деле надеялся, что люди перехватят все, что легко им достается. Полезно знать о диктофонах и СТО и особенно о ссылках на информацию о строгости. Весьма признателен! – metaleap