나의 첫 번째 컴파일러 작성

3046 단어 armcompilerjava

출발점


나는 대학 수업 프로젝트를 위해 나의 첫 번째 컴파일러를 짰다. 나는 그것을 매우 좋아하기 때문에 나는 이 방면의 경험을 공유하고 싶다.나는 이 점에 대해 매우 전문적인 소개를 할 것이다. 우선 몇 가지 소개를 할 것이다.

설정


너는 컴퓨터가 원본 코드를 모르고, 이진 코드를 안다는 것을 안다.그렇다면, 우리는 어떻게 원본 코드에서 이진 코드로 바꿉니까?컴퓨터 하드웨어는 전신호를 순환하고 처리하는 물리적 형식으로 0과 1을 전신호로 전환하는 것을 책임진다.너는 어떻게 생각하느냐?모든 컴파일러는 컴파일러의 프로세서에 의존한다. (자바 가상기와 같은 다른 것을 사용하지 않는 한.)2진 코드의 상부를 어셈블리라고 하는데, 이것은 일종의 저급 프로그래밍 언어이다.따라서 내 컴파일러의 목표는 고급 프로그래밍 언어를 저급 프로그래밍 언어로 바꾸는 것이다.컴파일러가 반드시 저급 프로그래밍 언어로 바뀌어야 하는 것은 아니라는 것을 감안하면, 그것은 다른 고급 프로그래밍 언어로 바뀔 수 있다.

프로세스


컴파일러는 두 가지 주요 단계로 나뉘는데 그것이 바로 분석과 종합이다.분석은 회상 정보(예를 들어 변수)를 통해 원본 프로그램의 구조를 식별하고 종합은 구조와 회상 정보의 구축에서 번역한다.저는 own version분석을 했습니다. 단지 이 과정을 완성하기 위해서였지만 제compiler에 대해 저는 실제적으로 기능이 강한 해상도 생성기를 사용하여 제가 실현하는 문제를 피했습니다. 방문자 모델을 사용하여ANTLR라고 합니다.

단계.


어휘 분석


분석한 언어의 문법에 따라 원본 프로그램의 요소를 식별한다.이 단계에서는 기호 테이블에 정보를 저장하고 요소 ID를 나타내는 태그를 생성합니다.
pos = initial + rate * 60
... 로 변하다
<id, 1> <=> <id, 2> <+> <id, 3> <*> <60>

문법 분석


해석이라고도 하는데 전 단계의 표기를 사용하여 문법 트리라고 불리는 문법 구조를 구성한다.이 단계에서 문법 오류를 식별할 수 있다. 예를 들어 부족;, 괄호가 부족하다.

어의 분석


일이 재미있어지기 시작했다.처음 두 단계에서 ANTLR을 사용했기 때문에 이 시점부터 시작하겠습니다.이 부분에서 내가 좋아하는 것은 나의 고급 언어 입력이 어떻게 될지 결정해야 한다는 것이다.축진 (예:python) 을 사용해야 합니까? 아니면 네모난 괄호 (예:java) 를 사용하여 작용역을 정의해야 합니까?강한 유형 변수 (int-var) 를 사용해야 합니까? 아니면 느슨한 유형 변수 (var) 를 사용해야 합니까?이 모든 문제 중 하나는 목표 구성 요소라는 것을 항상 명심해야 한다.목표 프로그램 집합은 당신이 실제로 무엇을 할 수 있는지, 무엇을 할 수 없는지를 결정할 것입니다.내 컴파일러의 경우 RaspberryPi의 ARM 컴파일러를 선택합니다.
의미 분석은 문법 트리와 기호표를 이용하여 지령의 의미를 검증하는데 다시 말하면 원본 프로그램은 사실상 의미가 있다.

중간 코드 생성


이 단계에서, 나는 반드시 유사한 어셈블리 코드를 만들어야 한다. 이를 3 주소 코드라고 부른다.상상해 보다
pos = initial + rate * 60

t1 = id3 * t1
t3 = id2 + t2
id1 = t3
그중 idt는 다음 단계 어셈블리 코드의 레지스터가 될 것이다.이론적으로 이 단계는 컴파일러를 목표 컴파일러에 독립시킬 수 있다. 왜냐하면 같은 중간 코드에서 서로 다른 프로그램 집합을 생성할 수 있기 때문이다.

코드 생성


이 부분에서 나는 어쩔 수 없이 몇 가지 일을 고려해야 한다.이러한 값은 어떻게 저장됩니까?각 유형에 사용할 공간은 얼마나 됩니까?나는 어떻게 전 세계인을 구해야 합니까?이것들은 해결해야 할 첫 번째 문제이다. 이것이 바로 구성 요소가 어떻게 작동하는지 이해하는 것이 왜 중요한가 하는 것이다.나는 모든 내용을 4 바이트에 저장하기로 결정했다. 어떤 종류의 변수든지, 이것은 단순하지만 효율적이지 않기 위해서이다.이 바이트들을 어디에 저장합니까?전역 변수는 메모리와 창고의 모든 다른 내용에 저장될 것입니다.다른 단계는 레지스터를 어떻게 사용하는지, 얼마나 많은 레지스터를 사용하는지 고려해야 한다. 데이터의 현재 값과 주소, 그리고 레지스터가 언제 사용할 수 있는지 알아야 하기 때문이다.
마지막으로 나에게 가장 어려운 부분은 기록 활성화다.이 부분은 코드 블록에 사용되는 레지스터를 초기화하는 데 사용되며, 매개 변수, 되돌아오는 값, 임시 변수, 제어 링크를 포함한다.이 부분은 귀속을 실현하는 관건이다.
기초Dragon Book.

좋은 웹페이지 즐겨찾기