2011-04-22 3 views
0

주 작업은 데이터를 구문 분석하고 이에 상응하는 어셈블리 언어 명령 세트를 작성하는 것입니다 (두 논리 모두). 이 컴파일러는 다른 C 고유의 기능을 사용합니까? 내 프로그램을 언어 X로 가져 와서 C 프로그램처럼 만든 다음 gcc를 사용하여 컴파일 할 수있는 프로그램을 작성할 수 있다는 것을 의미합니다. gcc를 사용하여 컴파일합니다. 백엔드에서도 일어나는 모든 일들이 합리적입니다. 내 질문의 그래픽 표현은 다음과 같습니다컴파일러 생성시 C (또는 ML) 역할은 무엇입니까?

언어 X - 기계 특징에서 실행 - ASM 생성하는 기능을 C의 문자열 처리를 사용하여 구문 분석 C에서 만든 컴파일러 : 어셈블리 코드 아무것도 더 생성하지 않으려면 C의 기본 메커니즘을 사용하여 - 그것의 사용 결국 자신의 어셈블리 논리.

언어 X - 다시 C에서 만든 컴파일러는 구문처럼 C로 재 부호화 - ASM - - 기계 코드
기능 컴파일러처럼 GCC에 제공 : 멍청한 시스템이 종료

+1

구문 분석 비트만으로도 엄청난 작업입니다. 그런 다음 파서의 결과는 일반적으로 다양한 고급 알고리즘을 통해 전송됩니다. 그리고 코드 생성은 * 매우 복잡 할 수도 있습니다 (이전 통과에서 얻은 결과에 따라 다릅니다. 이미 죽은 단순 SSA이지만 여전히 레지스터 할당이 있습니다). 컴파일러는 정기적으로 사용하는 가장 복잡한 응용 프로그램 중 일부입니다. – delnan

+2

나는 이것이 왜 "진짜 질문이 아닌가"하는 이유를 모르겠다. 그것은 매우 흥미로운 질문이 아니며 "무지한"질문에 가깝지만, 그렇다면 무엇입니까? –

+0

어리석은 태도이지만 내 질문을 지원해 주셔서 감사합니다! – Nishant

답변

3

컴파일러의 두 가지 주요 작업은 "파서 작성"과 "어셈블러에 출력 작성"입니다. 가장 흥미로운 점은 검증 과정 (유형 검사), 분석 과정 (추가 최적화를위한 다양한 정보 수집) 및 변환 과정 (고레벨에서 저급 수준 언어로, 어떤 단계를 거쳐 무언가를 끝낼 때까지)입니다. 조립과 같이 보이기).

간단한 컴파일러를 디자인하더라도 (처음 GCC와 경쟁 할 필요가 없음) 파서가 "주요 작업"이되어서는 안됩니다. 사실 파서는 요즘 문법이 다소 전통적이라면 요즘은 꽤 일상적인 문제로 간주됩니다 (저는 미학적 구문 확장성에 대해 말하지 않고 있습니다). 비교적 잘 작동하는 파서 생성기가 있습니다. 더 많은 유연성을 위해 수작업으로 작성된 파서를 사용할 수도 있지만, 문제가되지 않아야합니다.

C 또는 다른 언어를 출력하는 컴파일러를 작성하는 것이 좋습니다. 다양한 컴파일러 (예 : Haskell과 다양한 Scheme)가 C를 대상 언어로 사용했습니다. 하지만 대개 (흥미 롭습니다. 어쨌든) 프로그래밍 언어의 추상화를 C 언어로 번역 할 수있는 저수준 언어로 컴파일하기 위해 많은 사전 작업이 이루어졌습니다.

요즘에는 가상 머신 (JVM, CLR, 얼랭의 VM, 앵무새 ...)을 목표로하거나 LLVM 바이트 코드를 생성 할 수 있습니다.

질문에 ML을 언급했습니다. 대수 데이터 타입 (즉, SML, OCaml, Haskell 등)을 사용하는 정적으로 형식화 된 함수형 언어는 컴파일러를 작성하는 매우 훌륭한 언어입니다. 가장 적합한 것, 나는 주장 할 것이다.Modern Compiler Implementation in ML에 관심이있을 수 있습니다 (C 및 Java의 변형이 있지만 ML 책이 가장 좋습니다). 그것은 약간의 장소에서 전문화되어 있지만 컴파일 기술에 대한 전체적인 견해를 갖는 것은 좋은 선택 일 것입니다. 물론 컴파일 전문가가되기를 원한다면 드래곤 북 (Dragon Book)과 같은 다른 레퍼런스를 사용할 수도 있고 아마도 비슷한 언어의 레퍼런스를 사용할 수도있다. (순전히 기능적 언어를 컴파일하는 것은 명령형 언어를 컴파일하는 것과 매우 다를 수있다.).

2

각을에서 C의 기능을 사용하기 때문에 컴파일러가 다릅니다

컴파일러 작성자는 생각할 수있는 모든 것을 할 수 있습니다. 이전의 "번역자"f2c는 사실 Fortran 컴파일러였습니다 (즉, 출력을 생성했습니다). c.

컴파일 과정이 느려질 수는 있지만 (별개의 lex 및 구문 분석 단계가 있습니다.) 아무 문제가 없습니다.

심각한 컴파일러의 경우 대부분의 코드와 대부분의 시간이 소요되는 출력을 최적화하는 것은 추상 구문 트리를 조작하는 것입니다. Crenshaw tutorial에서 수행되는 즉각적인 코드 생성과 완전한 기능을 갖춘 컴파일러 간에는 큰 차이가 있습니다.

관련 문제