문제

LLVM과 일반 컴파일러의 차이점은 무엇입니까?
더 동적이므로 일반적으로 매우 동적인 언어를 컴파일하는 데 사용할 수 있습니다(예:Javascript)를 정적 바이너리 코드로 변환하시겠습니까?만드는 원리는 무엇인가요?
나는 컴파일러에 대한 Dragon Book을 알고 있지만 LLVM에 대한 그런 것이 있습니까?

편집하다:나는 발견했다 이것 흥미로운 프로젝트.

도움이 되었습니까?

해결책

LLVM과 "일반 컴파일러" 사이에는 몇 가지 차이점이 있습니다. 여기서는 "gcc"를 의미한다고 가정하겠습니다.

  • LLVM은 전체 프로그램 분석(링크 타임 분석이라고도 함)을 위해 설계되었으므로 선택적으로 코드를 나중에 다시 분석할 수 있는 형식인 "비트코드"로 컴파일할 수 있습니다.
  • LLVM은 JIT(Just-In-Time 컴파일러)를 제공하므로 JVM과 마찬가지로 프로그램이 실행되는 동안 다시 분석할 수 있습니다.
  • LLVM은 매우 잘 설계되었습니다.
    • 그 구성 요소는 모듈식이며 잘 분리되어 있습니다.
    • 중간 표현(텍스트, 바이너리 및 메모리 내 표현)에 대해 3가지 형식이 있으며 이는 동일합니다.
    • 중간 표현은 SSA 형식을 사용합니다.
    • 중간 표현에는 유형 시스템이 있습니다.

Javascript 및 기타 동적 언어의 경우 Python 및 Ruby 구현을 시도하면서 동적 언어 커뮤니티에서 LLVM에 대한 많은 흥미로운 점을 확인했습니다.그러나 이들은 정적 컴파일러가 되려고 시도하지 않습니다.그들은 JIT 사용에 중점을 두고 있습니다.특히, 처음에 프로그램을 해석한 다음 런타임 시 LLVM을 사용하여 컴파일하는 "혼합 모드 인터프리터"를 사용하여 장기 실행 실행 파일을 최적화하고 있습니다.LLVM을 사용하는 자바스크립트 엔진을 본 적이 없지만 아마도 있을 것입니다.비정상적인 상황이나 축소된 Javascript 버전을 제외하고는 정적 실행 파일을 생성하지 않습니다.

LLVM을 만든 이유는 다음의 일부로 시작되었습니다. 비크람 어드브에 대한 연구 그룹의 작업 평생 편집 (JIT 및 링크 타임 최적화를 의미함)박사 학위를 취득한 후 Chris Lattner는 Apple로 옮겨 프로젝트를 크게 발전시켰습니다(아마도 BSD 라이센스가 있기 때문에 과거에 GPL인 gcc에서 문제를 일으켰기 때문일 것입니다).

다른 팁

일반 컴파일러는 없습니다. 창조의 주된 이유는 컴파일러 연구를위한 플랫폼을 만드는 것이 었습니다. 따라서 매우 모듈 식으로 설계되어 연구를 처리하고 컴파일러의 다른 부분에 대해 걱정할 필요가없는 컴파일러의 해당 부분에서 작업 할 수 있습니다. LLVM 책이없는 것처럼 드래곤 컴파일러가 없습니다 (Dragon Book 또는 다른 컴파일러 책에서 읽은 이론은 직접 적용 할 수 있어야 함). 사실 나는 LLVM을 한동안 보지 않았지만 그들의 문서는 꽤 나빴다.

나는 전혀 개발자가 아니지만 : GPL이 80 년대에 OBJC 런타임을 게시 한 옆에 있어도 Apple이 다른 컴파일러 (GPL이든 아니든)에 자금을 지원하는 주된 이유는 IDE와 통합 될 의지입니다. GCC는이 영역에서 너무 많은 관성을 갖는 것으로 입증되었으며, GCC는 코드 부품 재사용을 가능하게 할만 큼 모듈화되지 않습니다 (Xcode "Fix It"기능). 그것이 제가 내 독서에서 이해 한 것입니다

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top