2011-07-29 3 views
7

저는 하스켈에서 백엔드로 LLVM을 사용하는 간단한 게으른 함수 언어를 구현하고 있습니다. Simon Peyton Jones ("함수형 프로그래밍 언어 구현", "함수 언어 구현 : 자습서")에 의해 작성된 두 권의 책을 읽고이를 바탕으로 G-Machine compiler and interpreter을 구현했습니다.G-Machine 소스를 LLVM으로 변환 IR

현재 G-Machine 지침에서 LLVM IR 코드를 생성하는 문제에 봉착했습니다. 주된 문제는 G-Machine이 스택 머신 인 반면 LLVM IR은 등록 머신이라는 것입니다. 따라서 G-Machine을 LLVM IR로 변환하려면 LLVM IR에서 일종의 런타임 스택을 유지해야합니다 (잘못된 경우 수정하십시오). 그 IR 지침을 사용하여 LLVM 스택에 후속 스택 노드를 할당 할 생각을했지만, 그 다음에는 각 스택 요소가 이전 스택에 대한 포인터를 가지고있는 링크 된 방식으로 스택을 생성해야합니다. 널 포인터. 그러나이 방법은 매우 적합하지 않으며 G-Machine에서 "푸시 n"조작의 경우 선호되는 O (1) 대신 O (n)의 복잡성을 갖습니다. 다른 아이디어는 단일 셀 대신 전체 메모리 블록을 할당하는 것입니다.

내 질문은 내 문제를 해결하는 더 나은/다른 방법을 볼 수 있는지 여부입니다.

+1

어떤 이유가 무엇입니까? 말할 필요도없이 이미 STG에서 LLVM에 이르는 컴파일러가 있습니다. –

+1

글쎄, G - 기계 멋지고 간단합니다. 그리고 고전. – augustss

답변

9

링크 된 목록 스택을 수행하지 마십시오. 미친 문제입니다. 사용 된 고정 메모리 블록. 포인터 스택과 비 포인터 스택을 사용할 수 있으며, 포인터를 통해 무언가를 가리키는 것을 의미 할 수 있습니다. 그런 다음 모든 GC 뿌리가 포인터 스택에 있으므로 가비지 수집을 수행하는 것이 매우 쉽습니다.

LLVM 레지스터에는 힙 포인터, 힙 한계 포인터, 두 개의 스택 포인터가 있습니다.

LLVM 최적화 프로그램은 비효율적 인 스택 연산을 효율적인 레지스터 연산으로 전환합니다.

관련 문제