2013-09-30 2 views
3

바이트 코드로 컴파일되고 사용자 정의 VM에서 실행되는 작은 언어를 만드는 과정에 있습니다. 그 아키텍처는 주로 내가 읽은 것의 영향을 받았습니다 파이썬과 루아. 함수 인수, 로컬 변수 및 임시 값을 저장하는 데이터 스택과 활성 함수 호출 당 하나의 항목을 포함하는 프레임 스택의 두 가지 스택이 있습니다. 프레임 스택의 각 항목에는 현재 함수, 명령 포인터 (현재 함수의 바이트 코드 배열에 대한 인덱스) 및 기본 포인터 (데이터 스택에 대한 인덱스 - 함수의 args/locals가 시작되는 위치와 같은)가 포함됩니다.바이트 코드로 컴파일 된 언어로 REPL/eval을 구현했습니다.

내가 풀리지 않게 된 곳은 REPL을 구현하는 것입니다. 구체적으로는 eval()을 구현하는 것입니다. 지금까지 동일한 스택 프레임 내에서 사용자 입력을 지속적으로 평가하는 아이디어가 있었지만 eval() 안에 새 로컬 변수를 만들 수있는 명확한 방법은 없습니다. 임시 데이터가 항상 스택상의 지역 (스택이 위쪽으로 자라기 때문에)을 생각할 수 있었던 유일한 접근법은 새로운 지역 주민이 eval()에 의해 생성되었다는 것을 어떻게 든 알아 차리고 스택을 재정렬하기 위해 일부 해커를 사용한다는 것입니다. 이것은 일반적인 경우에 문제를 일으킨다. 예를 들어, 조건부로 eval()을 사용하는 재귀 함수가 있다면 프레임 스택을 걷고 각 프레임의 데이터 스택을 조정해야합니다.

내 VM은 eval()의 현명한 구현을 지원할 수 있습니까? 그렇다면, 위에 설명 된 접근 방식이 현명한가? 그렇다면 아키텍처 변경에는 어떤 것이 필요합니까?

답변

관련 문제