The LLVM Compiler Infrastructure Project
llvm.org
LLVM은 2000년 12월 초부터 시작하여 컴파일러를 위한 잘 정의된 인터페이스를 갖춘 재사용 가능한 라이브러리 세트로 설계되었습니다. 당시 오픈 소스 프로그래밍 언어의 구현은 일반적으로 모놀리식 실행 파일이 있는 특수한 목적 만을 수행하는 도구로 설계되었는데,
정적 분석이나 리팩토링을 수행하기 위해 정적 컴파일러의 파서를 재사용하는 것에 대한 어려움
스크립팅 언어는 런타임과 인터프리터를 더 큰 어플리케이션에 포함시키는 방법을 제공하는 경우가 많았지만 이 런타임을 포함되거나 제외되는 단일 모놀리식 코드 덩어리로 되어 있음
구현의 일부를 재사용할 방법이 없고 언어 구현 프로젝트 전반에서 그것을 공유하는 것도 거의 없음
전통적인 정적 컴파일러를 제공하거나 인터프리터 혹은 JIT(Just in time) 컴파일러 두 가지를 모두 지원하는 언어 구현을 보는 것도 매우 드물었고, 지원하더라도 일반적인 코드 공유가 거의 없었음
와 같은 문제점을 가지고 있었습니다. 그리하여 LLVM은 컴파일러를 위한 재사용 가능한 라이브러리 세트를 제공하여 코드의 재사용과 프런트엔드, 최적화, 백엔드 간에 협업이 용이하게 했고, 이를 통하여 다양한 프로그래밍 언어의 개발이 가속화되었습니다.
클래식 컴파일러 디자인
전통적인 정적 컴파일러에 대한 가장 인기 있는 디자인은 프런트엔드, 최적화, 백엔드로 대표되는 3단계 디자인입니다.
프런트엔드: 소스 코드를 구문 분석하여 오류가 있는지 확인하고 언어별 추상 구문 트리를 구축하여 입력 코드로 변환
최적화: 코드의 실행 시간을 개선하기 위해 다양한 변환을 수행하는 역할
추상 구문 트리를 최적화하여 새로운 표현으로 변환
일반적으로 언어 및 대상에 대해 어느 정도 독립적
백엔드(코드 생성기): 코드를 대상 명령어 세트로 매핑
지원되는 아키텍처의 특이한 기능을 활용하는 좋은 코드를 생성하는 일도 담당
명령어 선택
레지스터 할당
명령어 스케쥴링: 명령어의 중요도 또는 긴급도, 처리 시간등을 고려하여 우선적으로 처리되어야 하는 명령어 결정
이 모델은 인터프리터와 JIT 컴파일러에 모두 동일하게 적용되며, JVM(Java Virtual Machine)도 이 모델로 구현되었고, 프런트엔드와 최적화 프로그램 간의 인터페이스로 Java 바이트코드를 사용합니다.
클래식 컴파일러 디자인의 중요한 키포인트는 프런트엔트는
첫째, 컴파일할 수 있는 모든 언어에 대해 작성될 수 있고 백엔드는 컴파일할 수 있는 모든 대상에 대해 작성될 수 있다는 점입니다.
둘째, 컴파일러가 하나의 소스 언어와 하나의 대상만 지원하는 경우보다 더 광범위한 프로그래머 집합에 서비스를 제공한다는 것입니다.
그리고 마지막으로 프런트엔드를 구현하는데 필요한 기술이 옵티마이저 및 백엔드에 필요한 기술과 다르기 때문에 이들을 분리하면 "프런트엔드 담당자"가 컴파일러의 해당 부분을 더 쉽게 향상하고 유지 관리할 수 있습니다.
LLVM: 3단계 디자인
LLVM 역시 3단계의 디자인 철학을 따릅니다. LLVM의 프런트엔드는 입력 코드의 오류 구문 분석, 검정과 진단을 수행한 다음 구분 분석된 코드를 LLVM IR(Intermediate Representation) 로 변환합니다. 그리고 그렇게 생성된 IR은 최적화 프로그램을 통해서 코드를 개선하는 분석과 최적화 작업을 수행하고 이를 기계어 코드를 생성하기 위한 백엔드에서 처리하여 마지막으로 머신 코드를 생성하게 됩니다.
LLVM 의 장점
LLVM IR 은 코드를 완벽하게 표현
LLVM 은 라이브러리들의 집합
LLVM 라이브러리에는 많은 기능이 있지만 실제로 자체적으로는 아무 것도 수행하지 않습니다. 그것을 잘 활용하는 것은 라이브러리를 이용한 클라이언트의 개발자에게 달려 있습니다.
대상이 변경 가능한 코드 생성기
LLVM 코드 생성기는 LLVM IR 을 특정 타겟의 기계어 코드로 변환하는 역할을 수행합니다.
타겟 디스크립션 파일을 통하여 자신의 아키텍처에 적합한 것을 선택할 수 있으며 다양한 대상에서 대량의 코드를 재사용할 수 있습니다.
기타
각 단계가 실행되는 시기와 단계를 선택할 수 있습니다.
옵티마지저 단위 테스트
LLVM 의 장점은 IR(Intermediate Representation) 이란 완벽한 중간 단계의 코드 표현으로 다양한 프런트엔드로부터 생성되어서, 다양한 백엔드를 통하여 코드를 생성할 수 있다는 것입니다. 그리고 이런 IR 의 장점을 통하여 컴파일러 구축을 위한 라이브러리 세트를 만들고 그것을 제공했다는 것입니다. 그런 라이브러리 세트를 통하여 사용자(컴파일러 개발자)에게 많은 자유도와 다양한 구현을 가능하도록 했다는 것입니다.
https://llvm.org/
다음 내용이 궁금하다면?
이미 회원이신가요?
2024년 1월 6일 오전 7:28
최
... 더 보기외국어를 사용해서? 돈을 더 많이 벌어서? 새로운 기회가 많아서? 글로벌 경력을 쌓을 수 있어서?
... 더 보기프로덕트 매니저(PM)로 일하면서 늘 지표 이야기를 듣게 됩니다. 대부분 PM은 선행지표(leading indicator)와 후행지표(lagging indicator)의 개념을 잘 이해하고 있습니다. 하지만 선행지표에 영향을 미치는 '인풋(input) 지표, '아웃풋(o
... 더 보기직장인으로서 10년 정도 일하게 되면 피할 수 없는 순간이 바로 조직에서 리더의 역할을 받게 되는 인사발령이다. 팀원이었을 때는 내게 주어진 업무를 내가 가진 능력과 주변 동료들의 도움으로 해결하고, 그에 합당한 평가와 보상을 기다리며, 나쁘지 않는 리워드와 내 위치에 안도하며 또 새해를 맞이하고 하루하루를 버텨나가는 과정에 큰 어려움이 없다.
... 더 보기하나부터 열까지 리더가 상세히 설명해 주기를 바라는 구성원이 있습니다. 반대로 큰 얼개만 듣고 나머지는 자율적으로 하고 싶어 하는 경우도 있죠. 회식에 참여하는 것을 너무나 힘겨워 하는 구성원이 있는 반면, 동료들과 함께 시간을 보내며 가까워지는 것을 원하는 구성원도 있습니다.
... 더 보기매
... 더 보기