LLVM 대 C—; LLVM은 어떻게 C-보다 Haskell의 경우 근본적으로 더 나을 수 없습니까?

StackOverflow https://stackoverflow.com/questions/815998

문제

나는 흥분했다 LLVM 모든 시스템을 모델링하기에 충분히 낮고 애플이 그것을 채택하고 있다고 약속 한 것으로 보았다. 그러나 다시 애플은 구체적으로 지원하지 않습니다 Haskell;

그리고 어떤 사람들은 Haskell이 더 나아질 것이라고 생각합니다. 씨--:

LLVM'ers는 제로 오버 헤드 쓰레기 수집의 문제를 해결하지 못했습니다. 데이터 모델을 제작하는 동안 이것을 해결하는 것은 컴퓨터 과학에서 공개적인 질문입니다.

-- LHC는 LLVM을 사용하지 않습니다.

도움이 되었습니까?

해결책

UNSW에는 GHC 코어를 LLVM으로 번역하는 프로젝트가 있습니다.

기억하십시오 : 10 년 전 LLVM이 모든 인프라 C를 구축 할 것이라는 것은 분명하지 않았습니다. 불행히도, LLVM은 휴대용 최적화 된 코드를위한 인프라를 가지고 있지만, 높은 수준의 언어 지원을위한 인프라는 C- Ha (s) d입니다.

흥미로운 프로젝트는 LLVM을 목표로하는 것입니다 ~에서 씨-- ...


업데이트, GHC 7 기준으로 GHC는 코드 생성에 LLVM을 사용합니다. 사용 -fllvm 깃발. 이는 일부 저수준 프로그램의 수치 성능이 향상되었습니다. 그렇지 않으면 성능은 이전 GCC 백엔드와 유사합니다.

다른 팁

C-를 조작하는 새로운 코드 생성 백엔드와 약간의 일을했을 때, C가 LLVM보다 더 나을 수있는 이유와 그들이 실제로 같은 일이 아닌 이유가 있다고 말할 수 있습니다.

  1. C-는 LLVM보다 높은 수준의 추상화에서 작동합니다. 예를 들어, 스택 포인터가 완전히 암시적인 C에서 코드를 생성 할 수 있으며 컴파일 프로세스 중에 나중에 만 표시 할 수 있습니다. 더 높은 수준의 표현으로 인해 불변량이 적을수록 더 많은 코드 모션을 허용하기 때문에 특정 유형의 최적화를 훨씬 쉽게 적용 할 수 있습니다.

  2. 우리가 이것을 적극적으로 고치려고 노력하는 동안 LLVM PROC 포인트. Proc Points는 무엇입니까? 본질적으로, Haskell은 고전적인 전화/RET 호출 협약을 사용하지 않기 때문에, 우리가 도덕적으로 하위 처리 호출을 할 때마다, 우리는 스택으로 연속을 밀고 하위 처리로 점프해야합니다. 이 연속은 일반적으로 로컬 레이블이지만 LLVM은 실제 절차 여야하므로 기능을 작은 조각으로 나누어야합니다 (각 조각은 Proc Point라고합니다). 이것은 절차 수준에서 작동하는 최적화에 대한 나쁜 소식입니다.

  3. C- 및 LLVM은 데이터 플로우 최적화에 대해 다른 접근 방식을 취합니다. LLVM은 phi-node와 함께 기존의 SSA 스타일을 사용합니다. 확인할 수 있습니다. HOOPL의 프로그래밍 최적화는 많은 재미 있지만, 특정 유형의 최적화 (일회성 중고 변수의 인라인이 떠오른다)는이 데이터 흐름 설정에서 가장 자연스럽지는 않습니다.

GHC는 이제 공식적으로 LLVM 백엔드를 보유하고 있으며 GCC 및 Native-Codegen과 경쟁하고 실제로는 더 빠릅니다.. 및 LLVM 프로젝트 새로운 전화 컨벤션을 수락했습니다 David Terei는 LLVM에서 Haskell을 위해 만들어 졌으므로 놀랍게도 두 프로젝트는 실제로 함께 작동하고 있습니다.

실제로 한 가지 문제는 LLVM이 훨씬 더 움직이는 대상 이었다는 것입니다.

GHC는 여러 버전의 LLVM을 지원하는 데 어려움을 겪었습니다. 활동이 있습니다 논의 이에 대한 GHC-DEV 메일 링리스트에서.

현재 GHC의 LLVM 백엔드 인 BTW는 Haskell이 CMM 언어로 번역 된 후 (STG 언어의 특정 레지스터로 확장 된 CM-C-reys is the De-indressed wassies로 인해, 컴파일이 느려지는 중복 최적화가 수행됩니다.

또한 역사적으로, 현재 AFAIK 인 LLVM 프로젝트는 휴대용 플랫폼 제공 우선 순위를 정하지 않으며 일부 개발자는 휴대용 어셈블리 언어의 형태가 아닌 컴파일러 IR입니다..

하나의 의도 대상에 대해 쓰는 LLVM IR은 다른 의도 된 목표에 전혀 유용하지 않을 수 있습니다. 비교를 위해 C- 웹 사이트는 실제로이를 휴대용 어셈블리라고합니다. "당신은 하나의 휴대용 어셈블리 언어로 훨씬 더 행복 할 것입니다 ..." 그들의 웹 사이트. 해당 웹 사이트는 휴대용을 완화하기위한 런타임 인터페이스도 언급합니다. 구현 쓰레기 수집 및 예외 처리.

따라서 CIL 및 Java 바이트 코드와 약간 더 공통적 인 모든 프론트 엔드의 휴대용 공통점으로 C를 생각할 수 있으며, 통일이 적을 수있는 모든 백엔드에 대한 표현적인 공통점으로 LLVM IR -여러 대상에 공통적 인 최적화. LLVM IR은 또한 LLVM 프로젝트가 저수준 최적화를 많이 구현할 것이라는 추가 보너스를 제공합니다. 즉, 어떤면에서 LLVM IR은 실제로 C보다 높은 수준으로 간주 될 수 있습니다. 예를 들어 LLVM IR은 C에서와 같이 다른 유형을 가지고 있습니다.

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