13

컴파일러는 스택 기반 또는 무한 레지스터 인 중간 표현 (IR)을 선택하기도합니다. 이 over expression tree의 장점은 무엇입니까?스택 기반 바이트 코드 또는 무한 등록기의 장점

+0

내가 생각할 수있는 장점 중 하나는 표현식 트리가 일련의 바이트로 표현하기가 더 어렵다는 것입니다. 반면 스택 기반 VM 프로그램은 바이트 스트림으로 변환 될 수 있습니다. –

+0

@romkyns : 컴파일러 IL에 대해서는별로 중요하지 않습니다. 인덱스/포인터로 연결된 일련의 데이터 구조 만 있으면됩니다. –

답변

17

표현식 트리는 표현식에서는 작동하지만 전체 프로그램을 모델링하는 데는 효과가 없습니다. 특히 프로그램의 훌륭한 표현은 실제로 제어 및 데이터 흐름에 의해 연결된 그래프 (작업 및 동작)입니다. 일반적으로 사람들은 정확히 같은 그래프를 형성하는 "트리플"을 사용하는 것에 대해 이야기합니다.

스택 코드는 프런트 엔드가 생성하기 쉽지만 실제 코드를 생성하는 데 필요한 최종 레지스터 할당 프로세스는 어렵습니다. 임시 위치 세트 ("스택")가 있기 때문에 명확하게 할 수 없습니다 대상 아키텍처와 통합하고 데이터 흐름을 처리하기가 불편하게 만듭니다. ("이 코드의 결과를 사용하는 코드는 무엇입니까?").

레지스터 머신은 코드를 생성하기가 조금 더 어렵지만, 무한 레지스터를 본질적으로 데이터 흐름 와이어로 사용하여 데이터 흐름을 보존하는 경향이 있습니다. 이 데이터 흐름과 실제 레지스터에 쉽게 할당 할 수있는 기능 (그래프 채색에 의한 표준 레지스터 할당이 있음)을 사용하면 비교적 쉽게 좋은 코드를 생성 할 수 있습니다.

가상 머신 코드를 직접 생성하기로 결정하면 다른 성능 특성을 갖게됩니다. 기본적으로 스택 머신은 코드 풋 프린트가 작아지는 경향이 있습니다. 무한 등록기는 빠른 해석 실행을하는 경향이 있습니다. Google의 Dalvik은 JVM과 완전히 다릅니다. (아마 그들은 클래스 파일 포맷에 비해 Sun/Oracle에 의해 고소되기를 원하지 않았을 것입니다.)

나는 다음 문서를 제안합니다 : Virtual Machine Showdown: Stack Versus Registers. (PS : 저자 인 Anton Ertl과 관련된 모든 것은 흥미로운 읽을 거리가되는 경향이있다).

+0

나는 똑같은 답변을 올리려고했다! : D BTW, 나는 또한 그들에게 코드를 생성하는 것이 더 쉽기 때문에 스택 VM은 시작하기가 더 쉽다고 말하고 싶다 ... –

+1

나는 당신의 대답을 비교하여 실망한다. 질문은 Expression Trees와 스택/레지스터 . –

+0

@romkyns : 충분히 공정합니다. 답변이 수정되었습니다. –