저는 Racket에서 스킴과 유사한 언어를 사용하여 작은 컴파일러를 작성했습니다. 이제 컴파일러에 TCO를 구현하고 싶습니다.내 컴파일러에 대한 테일 호출 최적화를 어느 단계에서 구현해야합니까?
제 아이디어는 인터럽트 표현으로 변환하기 전에 테일 호출을 감지해야합니다. 그러나이 page에서 TCO는 일반적으로 어셈블리 레벨에서 call
을 jmp
으로 변경하여 처리하는 것처럼 보입니다. 나는 여기에 좀 붙어있다.
의견을 보내 주시면 감사하겠습니다.
EDIT : 내 대상은 x86 어셈블리 코드입니다. 사용 된 IR은 세 개의 주소 코드입니다.
그리고 여기 내 컴파일러 12 개 패스하고, 패턴 화 된 패스는 내가 소스 코드 나에게
(define test-passes
(list
`("uniquify" ,(uniquify '()) ,interp-scheme)
`("reveal-functions" ,(reveal-functions '()) ,interp-F)
`("convert-to-closures" ,convert-to-closure ,interp-F)
`("expose allocation" ,expose-allocation ,interp-F)
`("flatten" ,(flatten #f) ,interp-C)
`("instruction selection" ,select-instructions ,interp-x86)
`("liveness analysis" ,(uncover-live (void)) ,interp-x86)
`("build interference" ,(build-interference (void) (void) (void) (void)) ,interp-x86)
`("allocate register" ,allocate-registers ,interp-x86)
`("lower-conditionals" ,lower-conditionals ,interp-x86)
`("patch-instructions" ,patch-instructions ,interp-x86)
`("x86" ,print-x86 #f)
))
ANF (또는 CPS)에서 수행하는 것과 달리 IR에 들어가기 전에 왜 이것을해야합니까? –
[ANF] (https://en.wikipedia.org/wiki/Administrative_Normal_Form), [CPS] (https://en.wikipedia.org/wiki/Continuation-passing_style), [IR] (https : // ko .wikipedia.org/wiki/Intermediate_representation). –
아 그래, 링크를 포함 해 주셔서 감사합니다. –