코드 생성(컴파일러)

Code generation (compiler)

컴퓨팅에서 코드 생성컴파일러의 프로세스 체인의 일부이며 소스 코드의 중간 표현을 타깃 시스템에 의해 쉽게 실행할 수 있는 형태(예를 들어 기계 코드)로 변환한다.

고도의 컴파일러는 일반적으로 다양한 중간 폼에 여러 패스를 수행합니다.이 다단계 프로세스는 코드 최적화를 위한 많은 알고리즘이 한 번에 하나씩 적용하기가 더 쉽거나 한 최적화에 대한 입력이 다른 최적화에 의해 수행된 완료된 처리에 의존하기 때문에 사용됩니다.이 조직에서는 코드 생성 단계(백엔드)의 마지막 단계만 타깃에서 타깃으로 변경하면 되기 때문에 여러 아키텍처를 타깃으로 할 수 있는 단일 컴파일러의 작성도 용이합니다.(컴파일러 설계에 대한 자세한 내용은 컴파일러를 참조하십시오.)

코드 생성기에 대한 입력은 일반적으로 구문 분석 트리 또는 추상 구문 [1]트리로 구성됩니다.트리는 보통 3주소 코드와 같은 중간 언어로 선형 명령 시퀀스로 변환됩니다.컴파일의 추가 단계는 프로그램 표현에 중대한 변화가 수반되는지 여부에 따라 "코드 생성"이라고 불릴 수도 있고 그렇지 않을 수도 있다(예를 들어 코드 생성기는 피프홀 최적화 패스를 포함할 수도 있지만 피프홀 최적화 패스는 "코드 생성"이라고 불리지 않을 수도 있다).

주요 태스크

중간 표현으로부터 기계 명령의 선형 시퀀스로의 기본적인 변환에 가세해, 일반적인 코드 발생기는, 생성된 코드를 어떤 방법으로든 최적화하려고 한다.

통상, 고도의 컴파일러의 「코드 생성」 국면의 일부인 태스크에는, 다음과 같은 것이 있습니다.

명령 선택은 일반적으로 추상 구문 트리에서 특정 트리 구성을 템플릿에 대해 일치시키는 재귀적 포스트오더 트래버설을 수행함으로써 수행됩니다(예: 트리).W := ADD(X,MUL(Y,Z))명령의 선형 시퀀스로 변환될 수 있습니다.재귀적으로 순서를 생성함으로써t1 := X그리고.t2 := MUL(Y,Z)명령어를 출력합니다.ADD W, t1, t2.

중간 언어를 사용하는 컴파일러에서는 두 가지 명령 선택 단계가 있을 수 있습니다. 하나는 해석 트리를 중간 코드로 변환하는 단계이고, 다른 하나는 중간 코드를 타깃 머신의 명령 집합에서 명령으로 변환하는 단계입니다.이 두 번째 단계에서는 트리 트래버설이 필요하지 않으며 선형으로 수행될 수 있으며, 일반적으로 중간 언어 연산을 해당 연산 코드로 간단하게 대체합니다.그러나 컴파일러가 실제로 언어 변환자(예를 들어 Java를 C++변환하는 것)라면 두 번째 코드 생성 단계는 선형 중간 코드로부터 트리를 구축하는 것을 포함할 수 있습니다.

런타임 코드 생성

JIT(Just-In-Time Compilation)와 같이 런타임에 코드가 생성될 경우 전체 프로세스가 공간과 시간에 대해 효율적인 이 중요합니다.예를 들어, 정규식이 해석되어 런타임에 코드를 생성하기 위해 사용될 때, 결정론적인 유한 상태 머신이 아닌 비결정론적인 유한 상태 머신이 종종 생성됩니다. 왜냐하면 보통 전자는 후자보다 더 빨리 생성될 수 있고 메모리 공간을 차지하기 때문입니다.JIT 코드 생성은 일반적으로 덜 효율적인 코드를 생성하지만 런타임에만 사용할 수 있는 프로파일링 정보를 활용할 수 있습니다.

관련 개념

한 언어로 입력을 받고 3가지 언어로 출력을 생성하는 기본 작업은 형식 언어 이론의 핵심 변환 연산 측면에서 이해될 수 있습니다.따라서 원래 컴파일러에서 사용하기 위해 개발된 일부 기술은 다른 방법으로도 사용되게 되었습니다.를 들어 YACC(Yet Another Compiler-Compiler)는 Backus-Naur 형식으로 입력을 받아 C에서 파서로 변환합니다.원래 컴파일러용 파서를 자동으로 생성하기 위해 만들어졌지만, yacc는 [3]사양을 변경할 때마다 수정해야 하는 코드 작성을 자동화하기 위해 자주 사용됩니다.

많은 통합 개발 환경(IDE)은 어떤 형태의 자동 소스 코드 생성을 지원하며, 일반적으로 덜 복잡하지만 컴파일러 코드 생성기와 공통 알고리즘을 사용하는 경우가 많습니다.(「프로그램 변환」, 「데이터 변환」도 참조).

반사

일반적으로 구문 및 의미 분석기는 소스 코드로부터 프로그램의 구조를 검색하려고 하는 반면 코드 생성기는 이 구조 정보(예를 들어 데이터 유형)를 사용하여 코드를 생성한다.즉, 전자는 정보를 추가하는 반면 후자는 정보의 일부를 잃는다.이러한 정보 손실의 결과 중 하나는 반사가 어려워지거나 심지어 불가능해지는 것이다.이 문제에 대응하기 위해 코드 생성기는 실행에 필요한 코드 외에 구문 및 의미 정보를 포함하는 경우가 많습니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ Steven Muchnick; Muchnick and Associates (15 August 1997). Advanced Compiler Design Implementation. Morgan Kaufmann. ISBN 978-1-55860-320-2. code generation.
  2. ^ Aho, Alfred V.; Ravi Sethi; Jeffrey D. Ullman (1987). Compilers: Principles, Techniques, and Tools. Addison-Wesley. p. 15. ISBN 0-201-10088-6.
  3. ^ 코드 생성: 레일즈의 진정한 교훈.Artima.com (2006-03-16)2013년 8월 10일 취득.