LLVM

위키백과, 우리 모두의 백과사전.
이동: 둘러보기, 검색
LLVM
개발자 LLVM Developer Group
발표일 2003년
최근 버전 3.4 / 2014년 01월 06일, 236일 경과
프로그래밍 언어 C++
운영 체제 크로스 플랫폼
종류 컴파일러
라이선스 en:University of Illinois/NCSA Open Source License
웹사이트 llvm.org

LLVM(이전 이름: Low Level Virtual Machine)은 컴파일러의 기반구조이다. 프로그램을 컴파일 타임, 링크 타임, 런타임 상황에서 프로그램의 작성 언어에 상관없이 최적화를 쉽게 구현할 수 있도록 구성되어 있다.[1]

LLVM은 원래는 저수준 가상 기계(low-level virtual machine)의 약자를 가리켰지만, LLVM이 성장하면서 다양한 목적을 가지게 되면서 현재는 이 약자는 사용하지 않는다.[1]

LLVM의 핵심 코드는 'LLVM 라이선스'로 배포되며, 이것은 BSD 라이선스와 비슷한 속성을 가진다.[2] 즉, LLVM을 사용한 프로그램을 배포하였을 때 해당 소스 코드를 공개/배포해야 하는 의무가 없다. 단 LLVM의 프론트엔드를 GNU 컴파일러 모음(GCC) 기반으로 사용할 경우 프론트엔드는 GPL로 배포한다. LLVM 프로젝트에서는 LLVM 라이선스를 가지는 프론트엔드를 위해, Clang이라는 프로젝트를 진행하고 있다.

개요[편집]

LLVM으로 언어에 가상 기계를 생성, 가상 기계가 언어에 독립적인 최적화를 실행한다. LLVM은 언어와 구조로부터 독립적이며, 언어 모듈과 시스템을 위한 코드 생성 부의 사이에 위치한다. LLVM은 컴파일 과정 동안 최적화와 함께 JIT을 정적 컴파일러로 사용, 개발의 각종 단계에서 사용할 수 있는 많은 부분을 가지고 있다.[3] LLVM은 전통적인 GCC 시스템에서 그랬듯이 코드를 정적으로 컴파일할 수도 있고, Java처럼 JIT를 이용하여 기계어(machine code)로 한 번 더 컴파일되는 중간 형식으로 코드를 컴파일할 수도 있다. 이말은 자바처럼 플랫폼에 독립적이란 뜻은 아니다.

JIT 컴파일러의 경우 런타임에 불필요한 정적 분기를 최적화하는 기능이 있는데, 이 기능은 다양한 런타임 옵션을 제공하면서 특정 환경에서는 사용되지 않는 옵션을 쉽게 식별할 수 있는 프로그램의 경우에 부분 평가(partial evaluation)를 하는데 유용하다. Mac OS X v10.5에서는 이를 사용하여 하드웨어에서 지원하지 않는 OpenGL 파이프라인을 제공하고 있다.[4]

현재 GNU 컴파일러 모음(GCC) 3.4와 4.0.1에서 빼낸 프런트 엔드를 사용하는 C 언어와 C++ 컴파일러를 지원하고 있다.

코드 표현[편집]

LLVM은 언어에서 독립적인 명령어 집합과 형식 시스템을 갖추고 있다. 명령의 대부분은 3-어드레스 코드 형식과 유사하다. 각 명령은 또한 정적 단일 대입 형식이며, 변수(로 입력된 레지스터)는 한 번 지정되면 그 다음은 변경되지 않는다. 따라서 변수간의 의존관계를 분석을 단순하게 할 수 있다.

변환은 어떤 형식이라도 명시적으로 형변환 명령을 통해 실행된다. LLVM의 기본 형식은 다수의 고정 길이의 정수이고, 파생 형식으로 포인터, 배열, 벡터, 구조체, 함수의 5가지가 존재한다. 구체적인 언어에서의 형식은 LLVM에서 지원하는 형식들을 결합하여 표현한다. 예를 들면, C++의 클래스는 구조체와 함수와 함수에 대한 포인터의 배열을 함께 사용하여 표현된다.

주석[편집]

  1. The LLVM Compiler Infrastructure Project. 2012년 3월 6일에 확인.
  2. LLVM: Frequently Asked Questions. 2012년 3월 6일에 확인.
  3. Java 바이트 코드와 MSIL 프런트 엔드, CPython 프런트 엔드, 그래프 컬러링 레지스터 할당 모듈 등에 이용할 수 있다.
  4. Chris Lattner (15 August 2006). A cool use of LLVM at Apple: the OpenGL stack. 《LLVMdev mailing list》. 26 October 2008에 확인.