LLVM이란?

LLVM/주절주절 2019. 9. 3. 01:52
LLVM은 오픈소스 컴파일러 개발용 종합 패키지다.

GCC 등의 기존 컴파일러들은 컴파일 과정들인, 코드의 파싱이나 파스트리, 기계어 생성, 코드 최적화 등이 명확한 구분 없이 모놀리하게 설계되어있다.
이 말은 뭐냐하면, 유지보수하기가 더럽다는 말이다.
게다가 특정 과정 등은 독립적으로 관리해야 더 효율적으로 작동할 수 있는데... 어휘분석과 구문분석 등이 이에 속한다.

여튼 LLVM은 이러한 고질적인 문제들을 해결하기 위해서 탄생했다.
LLVM은 C++로 작성되어 유지보수가 보다 편리하고, 컴파일 과정들을 각각 독립적인 모듈로 제공한다.
그래서 이전에는 컴파일러를 제작하려면 각각의 플랫폼에 맞는 기계어로 치환하도록 일일이 손을 댔어야 했는데 LLVM은 기계어 생성이나 코드 최적화 등의 작업을 알아서 잘 처리해준다.

이런 까닭에 근래에 개발된 컴파일러들은 다수가 이 LLVM으로 제작되었다. Rust, Swift 등등..
게다가 실제 성능도 아주 빼어난 편이다.
LLVM으로 작성된 C/C++ 컴파일러인 Clang은 GCC와 동등하거나, 때로는 앞서는 실행/컴파일 성능을 보여준다고 한다. Rust의 컴파일러도 대체로 C/C++와 동등한 성능을 보인다.

그리고 이름의 뜻은 저수준 가상 머신(Low Level Virtual Machine)인데 특별한 뜻이 있는 건 아니다.
의미부여하지 말라고 공식문서에서도 말한다.


Reference
"LLVM, [위키백과]"
"메이유르 판디&슈오르 사르다 『LLVM Cookbook』, PACKT"

'LLVM > 주절주절' 카테고리의 다른 글

[LLVM-IR] Hello World 찍기  (0) 2019.09.03

설정

트랙백

댓글

[LLVM-IR] Hello World 찍기

LLVM/주절주절 2019. 9. 3. 01:51
일단 세팅을 먼저 해야 한다.
http://releases.llvm.org/download.html

여기서

32비트나 64비트로 인스톨러를 깔아서 실행- 예스맨이 되면 된다.

그럼 해당 비트의 프로그램 파일즈 디렉터리에 LLVM 항목이 생길 것이다.
거기 안에 보면 또 bin 디렉터리가 있는데. 여기에 주요 실행 파일들이 몰려있다.

그리고 저 clang이란 놈이 바로 c/c++ 컴파일러이자 llvm-ir 컴파일러이기도 한 놈이다.
앞으로 우린 저걸 쓸 것이다.

그리고 편하게 쓰기 위해서라도 이 경로를 패스에 저장해주면 된다.
환경변수 설정은 이 글을 볼 정도의 개발자라면 다 알 것이므로 방법은 생략한다.

그리고 c/c++ 라이브러리를 패스에 추가해줘야 한다.
콘솔 입출력 같은 플랫폼 종속적인 행위를 하려면 c/c++의 모듈을 쓸수밖에 없다..

그런데 윈도에서는 llvm에서 제공하는 라이브러리나 gcc 라이브러리는 뭔가 잘 돌아가질 않아서,
msvc의 라이브러리 디렉터리를 써야 한다.
라이브러리의 경로는 대충 이렇다. 더럽게 복잡하다.

저걸 따로 정리해서 include의 경로는 INCLUDE라는 이름의 환경 변수에 넣고,
lib 디렉터리 안에 있는 lib파일들도 따로 모아놓고, 그 경로를 LIB라는 이름의 환경 변수에 넣어주면,
clang이 컴파일할때 갖다 쓴다.


자 그럼 이제 코드를 돌려보자.
코드는 이렇다. 어셈과 유사한 부분이 많다.

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
; 이게 주석임

; 문자열 상수를 전역상수처럼 선언함
@.str = private unnamed_addr constant [13 x i8] c"hello world\0A\00"

; puts 함수의 외부 선언
declare i32 @puts(i8* nocapture) nounwind

; main 함수 정의
define i32 @main()
{   
     ; i32()*
     ; [13 x i8]를 i8 *로 변환함...
    %cast210 = getelementptr [13 x i8],[13 x i8]* @.str, i64 0, i64 0
   
    ; puts 함수를 호출해서 stdout에 문자열을 출력함
    call i32 @puts(i8* %cast210)

    ret i32 0
}

; 이름 붙인 메타데이터
!0 = !{i32 42, null, !"string"}
!foo = !{!0} 
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

이걸 써서 .ll 확장자로 저장한 다음에

clang에 넣고 돌리면 된다.

'LLVM > 주절주절' 카테고리의 다른 글

LLVM이란?  (0) 2019.09.03

설정

트랙백

댓글