5

주로 학습 과정에서 외부 도구에 의존하지 않고 처음부터 가상 컴퓨터, 어셈블러 및 컴파일러를 작성합니다.구문 트리를 어셈블리로 변환하는 데 필요한 리소스는 무엇입니까?

저는 컴파일러의 일부뿐만 아니라 가상 컴퓨터와 어셈블러가 어떻게 작동하는지에 대한 개념적으로 잘 알고 있다고 생각합니다.

내가 알고 싶은 것은 : 컴파일러에서는 소스 코드를 구문 트리로 변환했다고 가정합니다. 이 구문 트리를 어셈블리로 변환하기 위해 어떤 프로세스를 거쳐야합니까?

(. 내가 여기에 최소한의 간단한 설명을 찾고 있어요 경우와 동안 같은의가, 몇 가지 간단한 언어 구조를 가정하자.)

내가 기존 도구를 기반으로 특히 복잡한 솔루션에 관심이, 또는 용액하지 오전 . 오히려, 구문 트리에서 어셈블리로가는 아이디어에 대해 한 페이지 분량의 광범위한 설명이 필요합니다.

누구나 이러한 리소스를 알고 계십니까? (: 원칙, 기법 및 도구 컴파일러)

감사합니다 :)

+0

예. 모든 컴파일러 책의 1 장 2 ~ 3 페이지 그러나 나는 그것이 당신이 필요로하는 모든 것이기를 희망하고 있다고 생각합니다. 문제는 절차상의 langauges를 좋은 머신 코드 (가상 머신이라 할지라도)로 변환하는 것은 많은 기계류를 필요로하며,이 2 페이지는 필요한 것의 모호한 감각을 줄 것이지만, 빌드 할 수는 없을 것입니다 현명한 컴파일러 책의 다른 200 페이지를 읽지 않고 모든 종류의 현명한 코드 생성기. –

답변

6

컴파일러 질문에 대한 의무적 인 응답은 드래곤 책을 읽는 것입니다. 소스 코드를 구문 트리로 전환했다고 말하면 정확히 무엇을 의미합니까? 일반적으로 구문 분석의 첫 번째 단계는 추상 구문 트리 (AST)를 만드는 것입니다. 다음 단계는 대개 속성입니다. 속성은 소스 언어와 관련이 없지만 코드 생성에 필수적인 AST의 노드 속성입니다. 보통 타입 검사의 일부 형식은 메모리 크기 요구 사항을 결정하기 위해 여기서 수행되며, 객체 지향 언어에서 어떤 함수가 호출 될지 결정됩니다. 예를 들어, 소스가 obj1 = obj2 + obj3 인 경우 obj2 유형을 결정할 때까지 더하기 기호를 작성할 항목을 알지 못합니다.

질문에 답변을 드릴 수 있습니다. 1) 소스 코드를 AST로 구문 분석하십시오. 2) 대서양 표준시에 귀속을하십시오. 3) 중간 코드를 생성합니다 (어셈블리로 참조하는 것으로 상상해보십시오).

드래곤 책 5 장과 6 장에이 부분이 자세히 설명되어 있습니다. 실제로 까다로운 부분은 코드 생성에 필요한 속성을 알아내는 것입니다. 또한 if 문에는 몇 가지 까다로운 문제가 있습니다. 예를 들어 if 조건이 실패하면 일부 코드를 뛰어 넘을 필요가 있음을 알지만 적어도 초기에는 얼마나 멀리 있는지 알 수 없습니다. 백 패치는이 문제의 한 가지 해결책입니다.