Я написал небольшой компилятор в Racket для схемного языка. Теперь я хочу реализовать TCO для моего компилятора.На каком этапе я должен реализовать оптимизацию хвостового вызова для моего компилятора
Моя идея: мне нужно определить хвостовые звонки, прежде чем преобразовывать их в промежуточное представление. Но из этого page кажется, что TCO обычно выполняется на уровне сборки, меняя call
на jmp
. Я немного застрял здесь.
Любые предложения будут оценены.
EDIT: Моя цель - код сборки x86. ИК-я использую три адресных кода.
И вот 12 проходит для моего компилятора, то Flatten прохода, где я преобразовать исходный код в ИК
(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)
))
Зачем вам это нужно перед тем, как вы войдете в свой IR, а не в ANF (или CPS)? –
[ANF] (https://en.wikipedia.org/wiki/Administrative_Normal_Form), [CPS] (https://en.wikipedia.org/wiki/Continuation-passing_style), [IR] (https: // en .wikipedia.org/вики/Intermediate_representation). –
Ах да, спасибо за включение этих ссылок. –