중간 표현
Intermediate representation프로그램 실행 |
---|
일반적인 개념 |
코드의 종류 |
컴파일 전략 |
주목할 만한 런타임 |
주목할 만한 컴파일러 및 툴 체인 |
IR(Intermediate Representation)은 컴파일러 또는 가상 머신에서 소스 코드를 나타내기 위해 내부적으로 사용되는 데이터 구조 또는 코드입니다.IR은 최적화 및 [1]변환과 같은 추가 처리에 도움이 되도록 설계되었습니다.'양호' IR은 정확해야 합니다.정보 손실[2] 없이 소스 코드를 표시할 수 있어야 하며 특정 소스 또는 타깃 언어에 [1]구애받지 않습니다.IR은 메모리 내 데이터 구조 또는 프로그램이 [3]읽을 수 있는 특별한 태플 또는 스택 기반 코드 중 하나의 형태를 취할 수 있습니다.후자의 경우에는 중간 언어라고도 합니다.
일반적인 예는 대부분의 현대 컴파일러에서 찾을 수 있습니다.예를 들어 CPython 인터프리터는 프로그램을 나타내는 사람이 읽을 수 있는 선형 텍스트를 실행 전에 흐름 분석 및 재배열이 가능한 중간 그래프 구조로 변환한다.이와 같은 중간 표현을 사용하면 GNU 컴파일러 컬렉션이나 LLVM과 같은 컴파일러 시스템을 다양한 소스 언어로 사용하여 다양한 타깃 아키텍처를 위한 코드를 생성할 수 있습니다.
중간 언어
중간 언어는 컴퓨터 프로그램 분석을 돕기 위해 설계된 추상 기계의 언어입니다.이 용어는 프로그램의 소스 코드가 대상 머신의 객체 또는 기계 코드를 생성하기 전에 코드 개선 변환에 더 적합한 형식으로 변환되는 컴파일러에서의 사용에서 유래합니다.중간 언어의 설계는 일반적으로 세 가지 기본적인 면에서 실용적인 기계어와 다릅니다.
- 각 명령은 정확히 하나의 기본 연산을 나타냅니다. 예를 들어 마이크로프로세서에 공통되는 "시프트 추가" 어드레싱 모드는 존재하지 않습니다.
- 명령 세트에 제어 흐름 정보가 포함되지 않을 수 있습니다.
- 사용 가능한 프로세서 레지스터의 수는 많거나 무제한일 수 있습니다.
일반적으로 사용되는 중간 언어 형식은 3주소 코드입니다.
이 용어는 오브젝트나 머신 코드 자체는 출력하지 않고 중간 언어만 출력하는 일부 고급 프로그래밍 언어에 의해 중간 언어로 사용되는 언어를 가리키는 데에도 사용됩니다.이 중간언어는 컴파일러에 제출되고 컴파일러는 완성된 오브젝트 또는 머신 코드를 출력합니다.이는 보통 C와 같은 많은 프로세서 및 운영체제용 컴파일러를 갖춘 중간 언어를 사용하여 최적화 프로세스를 용이하게 하거나 휴대성을 높이기 위해 수행됩니다.이에 사용되는 언어는 어셈블리 언어 등 상위 레벨 언어와 하위 레벨 언어 사이에서 복잡성이 감소합니다.
언어들
중간 언어로 명시적으로 설계되지는 않았지만 어셈블리의 추상화로서의 C의 특성 및 Unix와 다른 운영 체제에서의 사실상의 시스템 언어로서의 C의 편재성으로 인해 C는 널리 사용되는 중간 언어가 되었습니다.Eiffel, Sather, Estrel, 리스프(Lush, Gambit), 하스켈(Glasgow Haskell 컴파일러), 스퀵의 Smalltalk-subset Slang, Cython, Seed7, SystemTap, Vala, V 등의 방언은 C를 중간 언어로 사용합니다.C의 변형은 C--와 C 중간 언어를 포함한 C의 기능을 휴대용 어셈블리 언어로 제공하도록 설계되어 있습니다.
가상 시스템 또는 p-code 시스템을 대상으로 하는 모든 언어는 중간 언어로 간주할 수 있습니다.
- 자바 바이트 코드
- Microsoft 의 Common Intermediate Language 는 의 모든 컴파일러가 공유하도록 설계된 중간 언어입니다.NET Framework, 머신 코드에 정적 또는 동적 컴파일 전.
- 대부분의 중간 언어는 정적으로 입력된 언어를 지원하도록 설계되어 있지만, Parrow 중간 표현은 동적 입력 언어(처음에는 Perl과 Python)를 지원하도록 설계되어 있습니다.
- TIMI는 IBM i 플랫폼의 컴파일러에 의해 사용됩니다.
- BCPL의 O 코드
- MATLAB 사전 컴파일 코드
- Microsoft P-Code
- 파스칼 p코드
GNU 컴파일러 컬렉션(GCC)은 내부적으로 여러 중간 언어를 사용하여 이식성과 교차 컴파일을 단순화합니다.이 언어들 중에는
- 이력 레지스터 전송 언어(RTL)
- 트리 언어 GENERIC
- SSA 기반의 GIMPLE(GENERIC보다 낮은 레벨, 대부분의 옵티마이저에서는 입력, 콤팩트한 "바이트 코드" 표기)
GCC는 최종 타깃으로 다음 IR 생성을 지원합니다.
- HSA 중간층
- LLVM 중간 표현(LLVM 옵티마이저와 코드젠을 사용하는 현재는 사용되지 않는 llvm-gcc의 GIMPLE에서 변환됨)
LLVM 컴파일러 프레임워크는 LLVM IR 중간언어를 기반으로 합니다.이 언어 중 콤팩트한 바이너리 시리얼라이즈 표현은 비트코드라고도 불리며 [4][5]애플에 의해 제품화되어 있습니다.GIMPLE Bytecode와 마찬가지로 LLVM Bitcode는 링크 시간 최적화에 유용합니다.GCC와 마찬가지로 LLVM도 Google의 PNaCl IR 및 SPR을 비롯한 직접 배포를 위한 일부 IR을 대상으로 합니다.LLVM에서 한층 더 발전된 것은 다양한 이기종 타깃의 코드를 생성하고 다른 컴파일러의 출력을 [6]조합할 수 있는 MLIR(Multi-Level Intermediate Representation)을 사용하는 것입니다.
ILOC 중간언어는[7] 컴파일러 설계에 관한 클래스에서 단순한 타깃 [8]언어로서 사용됩니다.
다른.
정적 분석 도구는 중간 표현을 사용하는 경우가 많습니다.예를 들어 radare2는 이진 파일 분석 및 리버스 엔지니어링을 위한 도구 상자입니다.중간 언어인[9] ESIL 및 REIL을[10] 사용하여 이진 파일을 분석합니다.
「 」를 참조해 주세요.
레퍼런스
- ^ a b Walker, David. "CS320: Compilers: Intermediate Representation" (Lecture slides). Retrieved 12 February 2016.
- ^ Chow, Fred (22 November 2013). "The Challenge of Cross-language Interoperability". ACM Queue. 11 (10). Retrieved 12 February 2016.
- ^ Toal, Ray. "Intermediate Representations". Retrieved 12 February 2016.
- ^ "Bitcode (iOS, watchOS)". Hacker News. 10 June 2015. Retrieved 17 June 2015.
- ^ "LLVM Bitcode File Format". llvm.org. Retrieved 17 June 2015.
- ^ "MLIR".
- ^ "ILOC 시뮬레이터" W. A. Barrett 2007에 의해 웨이백 머신에 2009-05-07 아카이브, Keith Cooper와 Linda Torczon, "Engineering a Compiler", Morgan Kaufmann, 2004.ISBN 1-55860-698-X.
- ^ Uli Kremer의 "CISC 471 컴파일러 설계"
- ^ The radare2 contributors. "ESIL". radare2 project. Archived from the original on 18 August 2015. Retrieved 17 June 2015.
{{cite web}}
:author=
범용명(도움말)이 있습니다. - ^ Sebastian Porst (7 March 2010). "The REIL language – Part I". zynamics.com. Retrieved 17 June 2015.