[llvm] LLVM은 정확히 무엇입니까?

나는 LLVM에 대해 항상 듣습니다. 그것은 Perl에 있고, Haskell에 있고, 누군가 다른 언어로 그것을 사용합니까? 무엇입니까?



답변

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

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

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

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


답변

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

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

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

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


답변

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

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


답변

‘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으로 번역하는 프론트 엔드를 만들었습니다”와 같은 문장에서 사용될 때 이러한 의미를 갖습니다.


답변

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


답변

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

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

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


답변