[ 一日30分 인생승리의 학습법 ] LLVM이란

 

안녕하세요 :) Zedd입니다.

오늘은 LLVM에 대해서 공부해보겠습니다!

제 수준에 맞춰서..차근차근 공부해볼 예정입니다.

 

# 컴파일러

특정 프로그래밍 언어로 작성된 코드를 다른 프로그래밍 언어로 옮기는 프로그램. 

좁은 의미의 컴파일러는 주로 고수준 언어로 쓰인 소스 코드를 저수준 언어(어셈블리어, 기계어 등)로 번역하는 프로그램을 가리킨다.

 

# LLVM의 로고

 

 

용의 일종인 와이번. 

1977년쯤에 영향력 있는 컴파일러 서적은 표지에 용이 있었다고 한다.

 

 

뭐..이게 옛날 책들인지는 모르겠지만 컴파일러쪽에서는 용이 RxSwift의 뱀장어 느낌인 것 같다..? 

로고는 그냥 재미로 넣은건데,

 

 

WWDC발표자료에서도 이런식으로 쓰이곤 하니..알아두면 좋을 것 같다.

LLVM의 로고다.

 

# LLVM

- Low Level Virtual Machine  → 해석하면 "저수준 가상 머신". 

이것만 보고 LLVM이 특정 하나의 큰 기술...? 아무튼 하나의 가상 머신이다! 이런식으로 생각하면 안됨.

"LLVM 프로젝트"는 modular / 재사용 가능한 컴파일러(reusable compiler) / 툴체인 기술의 집합체.

LLVM이라는 이름에도 불구하고 가상 머신과 거의 관련이 없음.

⚠️LLVM이라는 이름 자체는 약어가 아님. 그냥 프로젝트의 full name일 뿐.⚠️

(The name "LLVM" itself is not an acronym; it is the full name of the project.)

 

LLVM을 보면서 Low Level Virtual Machine이라고 생각 안하면 될 것 같다.

그냥 "LLVM"인거.

 

# LLVM 프로젝트의 시작

2000년 일리노이 대학교에서 크리스 래트너(Swift만든 사람..) 외 몇명이 시작.

 

# LLVM 프로젝트

"LLVM 프로젝트"는 modular / 재사용 가능한 컴파일러(reusable compiler) / 툴체인 기술의 집합체임. 

컴파일러이자 toolkit이라고 하면 이해가 빠를듯.

LLVM 프로젝트의 서브 프로젝트로는

LLVM Core

Clang(!!)

LLDB(!!!!!)

그 외 여러가지..

github.com/llvm/llvm-project

 

# 그럼 정확히 LLVM이 어떤일을 하는가?

LLVM은 중간(intermediate) / 이진(binary) 기계 코드를 구성, 최적화 및 생성하는데 사용되는 라이브러리.

App Thinning. 그리고 Bitcode 여기에도 썼는데..

 

프로그래머는 사람이 "읽을 수 있는" 프로그래밍 언어로 코드를 작성. 하지만 기계는 이 언어를 이해못함.

이때 컴파일러가 기계가 실행 할 수 있는 코드로 변환해줌. 

LLVM은 intermediate 또는 binary machine 코드로 내 코드를 컴파일 하는데 사용되는 라이브러리이다. 

LLVM에는 두 부분이 있는데,

먼저 Objective-C, Swift, Python 또는 Ruby와 같이 앱을 만들기 위해 사용하는 "프론트 엔드"

해당 앱을 컴퓨터 코드로 컴파일하는 "백엔드".

(중간을 미들엔드라고 부르기도 하나봄)

가 있다. 

 

https://stackoverflow.com/a/49081640

 

- 프론트 엔드

프론트엔드는 C++, C, Objc, Swift, Python, Ruby와 같은 고-급 언어를 읽고 파싱한다.

파싱이 되면 이 언어들은 IR(Intermdediate Reperesntation)이 된다. 

(대충 LLVM이 고급 언어들을 파싱하여 IR로 만든다는 뜻)

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

 

- 백엔드

백엔드는 이 IR을 가지고 최적화를 하고 최종적으로 타겟머신에 맞는 기계어로 만든다. 

 

https://www.omnisci.com/technical-glossary/llvm

 

참고로 Clang(클랭)은 C, C++, Objective-C, Objective-C++를 IR로 만드는 컴파일러이다.

Swift는 위에서 볼 수 있다시피 swiftc라고 적혀있는데 이는 Swift-Clang을 말하는 것 같다. 

기본적인 구조는 Clang과 유사하다. Swift-Clang을 거치고 나면

 

 

Swift IL(Intermediate Language)이라는 중간 언어가 또 만들어진다. (IR아니라 IL맞음)

Swift는 파싱 후 AST(Abstract Syntax Tree 추상적인 문법 트리..) 생성 후

Swift-Clang을 거쳐 SIL이 만들어진 뒤, 또 이것저것 하여 LLVM IR이 만들어지는 것이다.

Swift는 총 2번 최적화된다고 볼 수 있다.

 

일어나는 일들이 궁금하다면,

 

swift.org/swift-compiler/#compiler-architecture

 

swift.org에 있는 공식 문서를 보면 된다.

 

출처 : https://nshipster.com/swiftsyntax/

 

전체과정은 이렇게 되는 것 같다.

 

# LLVM IR

 

https://ko.wikipedia.org/wiki/LLVM

 

이렇게 생겼다고 하는 것 같다. 

 

# bitcode?

LLVM을 공부하고, App Thinning. 그리고 Bitcode 이 글을 읽으면 이러한 궁금증이 생길 수 있다. 

bitcode는 아직 기계코드도 아니고 내가 이해 할 수 있는 코드도 아닌 중간단계의 코드입니다.

라고 했는데..즉 IR이라는 거다.

그럼 LLVM IR과 bitcode의 차이점이 무엇일까?

찾아보니

LLVM IR은

  • .ll 형식을 가진 LLVM 어셈블리(LLVM Assembly)
  • .bc 형식을 가진 LLVM 비트코드(LLVM Bitcode)
  • .o 형식을 가진 C++ 목적 코드(C++ Object Code)

로 분류된다고 한다.

 

Bitcode를 on하면, 

LLVM어셈블러인 llvm-as가 LLVM IR을 LLVM bitcode로 바꿔준다.

ex. test.ll → llvm-as → test.bc

 

 

이정도...LLVM에 대해 봤는데..각잡고 정리하니까 확실히 어떤 느낌의 친구인지 알겠어요.

혹시나 틀린 내용을 발견하셨다면.. 댓글로 알려주시면 정말 감사하겠습니다.

 

참고 :

llvm.org

ko.wikipedia.org/wiki/컴파일러

stackoverflow.com/questions/2354725/what-exactly-is-llvm

namu.wiki/w/LLVM

swift.org/swift-compiler/#compiler-architecture

www.omnisci.com/technical-glossary/llvm

출처: https://zeddios.tistory.com/1175 [ZeddiOS:티스토리]

 

 

 

 

 

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
1096 [ 一日30分 인생승리의 학습법 ] 우분투(리눅스) 에서 EBS 라디오 자동녹음 만들기 졸리운_곰 2022.11.11 9
1095 [ 一日30分 인생승리의 학습법 ] EBS FM 라디오, rtmp 서비스 중단 졸리운_곰 2022.11.11 9
1094 [ 一日30分 인생승리의 학습법 ] 악보 읽는 방법 file 졸리운_곰 2022.11.08 12
1093 [ 一日30分 인생승리의 학습법 ] 13가지 주요 오픈소스 프로젝트 file 졸리운_곰 2022.10.09 15
1092 [ 一日30分 인생승리의 학습법 ] 극상의 학습 난이도로 입문자 울리는 프로그래밍 언어 Top 10 졸리운_곰 2022.09.03 15
1091 [빅데이터의 활용의 오해] 데이터가 당신을 스마트하게 만들고 있을까? 졸리운_곰 2022.09.01 10
1090  [ 一日30分 인생승리의 학습법 ] [Git] Git 명령어 정리 졸리운_곰 2022.08.16 19
» [ 一日30分 인생승리의 학습법 ] LLVM이란 file 졸리운_곰 2022.08.13 22
1088 [ 一日30分 인생승리의 학습법 ] Build Your Own Remote Desktop Application using Javascript, Python & WebRTC — Part 2 file 졸리운_곰 2022.08.05 25
1087 [ 一日30分 인생승리의 학습법 ] Build Your Own Remote Desktop Application using Javascript, Python & WebRTC — Part 1 file 졸리운_곰 2022.08.05 13
1086 [ 一日30分 인생승리의 학습법 ] REST API 규칙 졸리운_곰 2022.08.03 15
1085 [ 一日30分 인생승리의 학습법 ]REST API 설계 (네이밍) 졸리운_곰 2022.08.03 11
1084 [ 一日30分 인생승리의 학습법] [2탄!!] KrakenD Demo 면을 알아보죠! file 졸리운_곰 2022.08.01 13
1083 [ 一日30分 인생승리의 학습법] [1탄!!]KrakenD가 무엇인가? 과연 Api Gateway로 으뜸인가요? file 졸리운_곰 2022.08.01 12
1082 [ 一日30分 인생승리의 학습법] 오픈소스 라이선스 별 의무사항 졸리운_곰 2022.07.29 18
1081 [ 一日30分 인생승리의 학습법] The complete guide to (external) Domain Specific Languages file 졸리운_곰 2022.07.08 24
1080 [ 一日30分 인생승리의 학습법] [Elasticsearch] 기본 개념잡기 file 졸리운_곰 2022.06.02 23
1079 [ 一日30分 인생승리의 학습법]node - pm2로 node.js 프로세스 관리하기 - 기본 명령어, 실행하기 file 졸리운_곰 2022.05.28 17
1078 [ 一日30分 인생승리의 학습법][1탄!!]KrakenD가 무엇인가? 과연 Api Gateway로 으뜸인가요? file 졸리운_곰 2022.04.15 15
1077 [ 一日30分 인생승리의 학습법][API Gateway] Kong Gateway 설치 file 졸리운_곰 2022.04.15 31
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED