LLVM은 정확히 무엇입니까?


답변:


369

LLVM은 중간 및 / 또는 이진 기계 코드를 구성, 최적화 및 생성하는 데 사용되는 라이브러리입니다.

LLVM은 "프론트 엔드"(파서 및 어휘 분석기)와 "백 엔드"(LLVM의 표현을 실제 머신 코드로 변환하는 코드)를 제공하는 컴파일러 프레임 워크로 사용될 수 있습니다.

LLVM은 JIT 컴파일러 역할도 할 수 있습니다. 컴파일 속도를 목표로하는 빠른 코드 최적화를 통해 x86 / x86_64 및 PPC / PPC64 어셈블리 생성을 지원합니다.

관심이 있으시면 데모 페이지의 C 또는 C ++ 코드에서 생성 된 LLVM의 머신 코드로 플레이 할 수 있지만 데모 페이지는 현재 2013 년 이후 비활성화되어 있습니다.


39
그것을 가지고 놀고 싶다면이 놀라운 기사를보십시오 : gnuu.org/2009/09/18/writing-your-own-toy-compiler
LiraNuna

29
답변에 제공된 링크에는 "LLVM 데모 페이지가 현재 비활성화되어 있습니다."라고 표시되어 있습니다.
EngrStudent

5
ellcc.org/demo/index.cgi 는 LLVM을 통해 C / C ++를 컴파일하여 중간 코드를 포함한 다양한 대상으로 컴파일하는 또 다른 방법입니다.
Tom Goodfellow

1
그것이 의미하는 바를 실제로 보여줄 수 있습니까?
Migrate2Lazarus 내 프로필보기

112

LLVM의 좋은 요약은 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

프론트 엔드에는 Perl과 다른 많은 고급 언어가 있습니다. 백엔드에는 머신에서 직접 실행되는 기본 코드가 있습니다.

중앙에는 중간 코드 표현이 있습니다. 모든 고급 언어를이 LLVM IR 형식으로 표현할 수 있으면이 IR을 기반으로하는 분석 도구를 쉽게 재사용 할 수 있습니다. 이것이 기본 근거입니다.


39
그림은 천 단어의 가치 👍
ipatch

3
따라서 LLVM은 컴파일러 디자이너에게 유용한 것으로 보입니다. 프로그래머가 소스 코드와 독립적으로 생성 된 코드를 분석하는 것 외에 표준 컴파일러 또는 LLVM 기반 컴파일러로 컴파일 할 경우주의해야합니까?
jinawee

4
LLVM을 사용하여 IR로 컴파일 할 수 있으면 IR 분석을 위해 많은 도구가 열릴 수 있습니다. 그러나 도구가 기본 바이너리 만 분석 할 수있는 경우 (예 : x86) LLVM 생성 바이너리인지 gcc 생성 바이너리인지 인텔 컴파일러 생성 여부는 차이가 없습니다.
피터 테오

73

LLVM ( "저수준 가상 머신"을 의미하지만 더 이상은 아님)은 C ++로 작성된 컴파일러 인프라로, 작성된 프로그램의 컴파일 타임, 링크 타임, 런타임 및 "유휴 시간"최적화를 위해 설계되었습니다. 임의의 프로그래밍 언어로. 원래 C / C ++를 위해 구현 된 LLVM의 언어 독립적 디자인 (및 성공)은 Objective C, Fortran, Ada, Haskell, Java 바이트 코드, Python, Ruby, ActionScript, GLSL을 포함한 다양한 프런트 엔드를 생성했습니다. , 다른 사람.

자세한 설명은이 글을 읽으십시오 Unladen Swallow
도 확인하십시오


13
.. 그래서 문서가 말하려는 것; LLVMLVM ( Low Level Virtual Machine )의 약어 인 반면 프로젝트 이름은 철자가 아닌 LLVM 입니다.
Jochem Kuijpers

2
이전에는 약어를 사용했지만 나중에 en.wikipedia.org/wiki/LLVM을
VVB

2
의견을 요약합니다. "LLVM (Low Level Virtual Machine)"은 "LLVM (프로젝트 수명 초기에"Low Level Virtual Machine "을 의미 함)"과 유사해야합니다.
ssokolow

52

'LLVM 코어 라이브러리 시작하기' 책 (c) 에 따르면 :

실제로 LLVM이라는 이름은 다음 중 하나를 나타낼 수 있습니다.

  • LLVM 프로젝트 / 인프라 : 프론트 엔드, 백엔드, 옵티 마이저, 어셈블러, 링커, libc ++, 컴파일러 -rt 및 JIT 엔진과 같이 완전한 컴파일러를 구성하는 여러 프로젝트를위한 우산입니다. "LLVM"이라는 단어는 예를 들어 다음 문장에서 이러한 의미를 갖습니다. "LLVM은 여러 프로젝트로 구성되어 있습니다."

  • LLVM 기반 컴파일러 : LLVM 인프라를 사용하여 부분적으로 또는 완전히 구축 된 컴파일러입니다. 예를 들어, 컴파일러는 프론트 엔드 및 백엔드에 LLVM을 사용하지만 GCC 및 GNU 시스템 라이브러리를 사용하여 최종 링크를 수행 할 수 있습니다. LLVM은 다음 문장에서 이러한 의미를가집니다. "LLPS를 사용하여 C 프로그램을 MIPS 플랫폼으로 컴파일했습니다."

  • LLVM 라이브러리 : LLVM 인프라의 재사용 가능한 코드 부분입니다. 예를 들어, LLVM은 "내 프로젝트는 LLVM을 사용하여 JIT (Just-In-Time) 컴파일 프레임 워크를 통해 코드를 생성합니다"라는 문장에서 의미가 있습니다.

  • LLVM 코어 : 중간 언어 수준에서 발생하는 최적화 및 백엔드 알고리즘은 프로젝트가 시작된 LLVM 코어를 형성합니다. LLVM은 다음 문장에서이 의미를 갖습니다. "LLVM과 Clang은 서로 다른 두 프로젝트입니다."

  • LLVM IR : LLVM 컴파일러 중간 표현입니다. LLVM은 "내 언어를 LLVM으로 번역하는 프론트 엔드를 만들었습니다"와 같은 문장에서 사용될 때 이러한 의미를 갖습니다.


35

LLVM은 기본적으로 컴파일러 및 / 또는 언어 지향 소프트웨어를 빌드하는 데 사용되는 라이브러리입니다. 기본 요점은 아마도 가장 일반적인 컴파일러 스위트 인 gcc가 있지만 재사용 할 수 있도록 빌드되지는 않았습니다. gcc에서 컴포넌트를 가져 와서 자체 애플리케이션을 빌드하는 데 사용하기는 어렵습니다. LLVM은 누구나 컴파일러 및 언어 지향 소프트웨어를 빌드하는 데 사용할 수있는 "모듈 식의 재사용 가능한 컴파일러 및 툴체인 기술"을 구축하여이 문제를 해결합니다.


6
LLVM은 라이브러리이고 Clang은 컴파일러입니까?
Abdul

11
Clang은 LLVM의 C / C ++ 프론트 엔드 컴파일러입니다. C 코드를 LLVM 비트 코드로 변환합니다.이 코드는 백엔드 컴파일러에 의해 일부 어셈블리 언어로 변환됩니다.
보리스 멀더

6

LLVM 컴파일러 인프라는 코드에서 최적화 및 변환을 수행하는 데 특히 유용합니다. 또한 고유 한 용도를 제공하는 여러 도구로 구성되어 있습니다. llvm-prof는 프로그램 핫스팟을 식별하기 위해 실행 프로파일 링을 수행 할 수있는 프로파일 링 도구입니다. Opt는 다양한 최적화 단계 (예 : 데드 코드 제거)를 제공하는 최적화 도구입니다.

중요하게 LLVM은 자신 만의 패스를 작성하기위한 라이브러리를 제공합니다. 예를 들어, 프로그램의 특정 기능에 전달 된 특정 인수에 대한 범위 점검을 추가해야하는 경우 간단한 LLVM 패스를 작성하면 충분합니다.

자신의 패스 작성에 대한 자세한 내용은 http://llvm.org/docs/WritingAnLLVMPass.html을 확인 하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.