2017-02-14 7 views
2

(오해의 여지가있는 제목 : 아래에만 수많은 유사 관련 질문이 있습니다. : 전체 참조 설명서를 요구하는 것과 같지만이 주제에 대해 염두에 두어야합니다. 전체가 아닌 참조 설명서가 없습니다. GHC의 STG 파이프 라인 단계에 대한 소스 코드 및 다른 사람들/내부자의 공동 축적 된 경험).GHC의 STG 출력에서 ​​-O2를 사용하면 Str = DmdType 다음에 오는이 시퀀스는 무엇에 관한 것입니까?

"재미있는/학습을 위해 처음부터"기존 프로젝트를 무시하고 "/기존의 GC + lambdas/func-values ​​+ closure가있는 비슷한 수준의 "STG 머신에 맞게") GHC의 STG IR에 익숙해 지려고합니다. 다양한 나이, 깊이, 세부 사항을 다루는 12 개 또는 2 개의 온라인 기사/비디오를 반복적으로 읽었을 때 (원래의 종이와 StgSyn.hs를 더한 것), 그리고 아마도 가장 기본적인 기본 원리를 이해한다면, -ddump-stg 에드 출력은 여전히 ​​여러 부분에서 나에게 당혹감을 안겨주고 있습니다. (수동으로 분석하지는 않지만 나중에 GHC API의 메모리 내 AST를 재사용 할 것입니다.) 대부분은 "대략적으로 알려진"개념을 " 여전히 외국의 "약식/목록 화 된 식별자를 사용합니다. STG 주변을 조금이라도 알고 있다면 다음과 같은 미니 샘플을보고 몇 가지 질문을 명확히하고 내 (그리고 앞으로의 검색 사용자)를 더욱 굳히는 데 도움이 될까요? a most simple .hs module 가입일

, I는 -O2, both captured in this diff 함께 (오른쪽) 제 (좌측)과 후 -O0-ddump-stg ED있다.

.. DEF-로 데프 모든 것을 통해 걷기

  • 라인 L_ | R5-11 : 그래서 O2, testX1testX2 글로벌 상수 것 같다/정수 4, 5 리터 - - O0은 그것들을 가지고 있지 않습니다. 이상한!

  • 은 엄격 대한 Str=DmdType 뭔가 있습니까? "엄격한 요구 사항은 유형에 따라 달라질 수 있습니까?" 하지만 최상위 레벨/힙 - 쉐도우/"글로벌"상수는 "게으름"할 수 없습니다. (StgSyn.hs에서 Ctrl + F 만 누르면 안되는 것 중 하나입니다. 하지 자신의 방식으로 홀수 인! 거기에 어떻게 STG 구문은

  • Caf

    가 일정 실용적-양식에 대한 거친 생각을 가지고) StgSyn.hs에서가 아니라 올하지만 Unf=OtherCon? "다른 생성자"(/ 기본 Type.S#이 - 관련 박스 없음?) ..

  • 라인 L6 | R14 : 아직 (Num) 거기에 형 수준의 정보를보고 깜짝 "단지 정보/주석"또는이 있다는 것이다 내장 된 코드 - 젠 (code-gens) 중 어떤 것이 런타임에 "사전"조회 기계를 설정하는 데 중요한가? (나는 이미 가능한 적어도 O2 인치 모든 GHC는 입력 기본에 Integer-45 결정 후 해결 될 것이라고 말 STG/사전 CMM 단계에 의해 확인 희망을 거라고 및 인라인). 일반적으로 말하자면 STG는 프리 형식, 포화 된 단점, 문자열 (나중에는 아래쪽에 표시됨)을 나타내는 것 이외의 "유형이 지정되지 않은"형식이므로 이해할 수 있습니다. 따라서 이러한 "typeclass"주석은 오직 .. 될 수 있습니다. ddump-ed * .stg 주변. 그러나 그렇지 않으면 나를 정정하십시오.

  • GblId 최상위 CAF 일명 아마 "글로벌 식별자"맞죠? 알레르기는 분명합니다. 선 L7

  • | R18은 지금 testX에 대한 Str=DmdType이는 단지 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 "메서드 파견 사전 lookup"일종의? 예. CMM은 위의 Num 주석과 함께이 작업을 수행합니다. 항상 input func 인수와 함께 나타납니다.

  • 전체 기능 모두 좌우 "정적 리터럴 상수를 공지 2되는 3자를위한 람다 틱 형태 3 let S"본질적 여기서 알 수는 "본체"--- I이 이것이 표준이며 STG IR AST에서 예상되는 것입니까? 이들 중 첫 번째 부분에 대해 우리는 O0가 "전역에 인라인되어 (O2에서 testX1 또는 testX2는 무엇인가) O2는"(이러한 상수 리터럴 모두에 적용되는 것처럼 훨씬 짧음) O2가 없다고 말할 수 있습니다.

  • 난 단지 Occ=Once을 보았습니다. 다른 것들과 해석 방법은 무엇입니까? 하나 Once는 .. 심지어 StgSyn.hs에

  • 이제

    LclIdGblId 발생 이전에 대응하지 않습니다. 그것은 식별자의 범위를 나타냅니다? 이 표현 컨텍스트에서 다른 것일 수도 있습니까? AST를 통과하다가 내가 얼마나 깊은지를 대략 알고 있다면 상위 레벨에 있다면 GblId이어야하며 그렇지 않으면 LclId이어야합니다. 흠 .. 어쩌면 STG가 나에게주는 것을 더 잘 받아 들일 것이지만 그때 의미와 가능성에 대해 확신 할 필요가 있습니다. StgSyn.hs를 사용하는 사람들, 잘못된 소스 파일을 가지고 있습니까? 거기에서이에 아무것도 중 .. O2 보면,

  • 나머지는 그냥 문자열 상수, OK .. 아 기다리는 메타 데이터 (항상 희망이 아주 잘 이루어지지의 코멘트대로) Str=DmdType m1Str=DmdType m 거기에 무슨 일이 있어요 m/m1 정도면, "모듈 수준의 아무 곳이나 정의 된"항목이 여기에 표시되지 않습니까? 그리고 O0에 없습니다.

  • 여전히 강세가 되나요? 단순히 보너스 문제는 (지금)에 대한 srt:SRT:[] 우리에게)

답변

1

불과 몇 가벼운 음식을 - 전체 대답은 매우 내 지식을 넘어이다. Num 형 클래스의 사전, 실제 인수 : 그것은 두 개의 인수로 함수에 컴파일되어

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

함수의 유형입니다.

$d…은 클래스 유형 인스턴스의 사전을 나타냅니다. <S(LLC(C(S))LLLL),… 주석은 함수 인수에 대한 엄격 성 정보입니다. 그들은 기본적으로 인수의 어느 부분이 함수에 의해 사용되고 그렇지 않은지에 관해 말합니다. 모든 클래스 인스턴스 멤버에 대한 정보가 포함되어 있기 때문에 약간 이상하게 보입니다.

이 중 일부

여기 설명 :

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

str:STR:은 "정적 참조 테이블"표현의 자유 변수의 즉 목록입니다 - 귀하의 경우, 항상 []에.

+0

많은 감사 크리스! 나는 "모든 것에 대한 모든 대답"을 기대하지는 않지만 실제로 사람들이 쉽게 알 수있는 것들을 가지고 소망합니다. dicts 및 SRT, 특히 엄격 성 정보에 대한 자세한 내용에 대해 알아두면 유용합니다. 감사합니다! – metaleap