[iOS] LLVM 프로젝트(컴파일러)

Soomin Kim·2024년 6월 16일

iOS

목록 보기
2/2
post-thumbnail

iOS 앱 개발은 LLVM 프로젝트 (컴파일러)를 이용하여 Objective-C 또는 Swift 코드를 iOS 디바이스에서 실행 가능한 바이너리 코드로 변환한다.

LLVM 프로젝트를 이해하기 위해선 컴파일러와 인터프리터의 차이를 먼저 알아야한다.

컴파일러 VS 인터프리터

C, C++, Java, Python 등과 같이 사람이 쓰는 개발언어를 기계어(010110...)로 번역 하는 것이 바로 컴파일러(Compiler)인터프리터(Interpreter) 다.

이 두가지의 목적은 같지만 작동하는 방식과 개발 언어의 특성에 따라 차이점이 있다.

컴파일러 (Compiler)

  • 전체 파일을 스캔하여 한번에 번역한다.

  • 초기 스캔시간이 오래 걸리지만, 한번 실행 파일이 만들어지고 나면 빠르다.

  • 기계어 번역과정에서 더 많은 메모리를 사용한다.

  • 전체 코드를 스캔하는 과정에서 모든 오류를 한번에 출력해주기 때문에 실행 전에 오류를 알 수 있다.

    주요 언어 ) FORTRAN, COBOL, C, C++, Java, C#, Objective-C, Swift

인터프리터 (Interpreter)

  • 프로그램 실행시 한번에 한 문장씩 번역한다.

  • 한번에 한문장씩 번역후 실행 시키기 때문에 실행 시간이 느리다.

  • 컴파일러와 같은 오브젝트 코드 생성과정이 없기 때문에 메모리 효율이 좋다.

  • 프로그램을 실행시키고 나서 오류를 발견하면 바로 실행을 중지 시킨다. 실행 후에 오류를 알 수 있다.

    주요 언어 ) BASIC, Python, Ruby, JavaScript


컴파일러의 구조

컴파일러는 크게 Front-end, Middle-end(Optimizer), Back-end 세가지로 나눌 수 있다.

Front-End

소스 코드의 구문을 분석하여 오류를 확인하고 언어별 추상 구문 트리(AST)를 생성한다.

Middle-End (Optimizer)

코드의 실행 시간을 개선하기 위해 죽은 코드 제거, 중복 계산 제거, 루프 언롤링(Loop Unrolling) 등과 같이 다양한 변환 작업을 수행한다.

Back-End

코드를 명령어 집합에 매핑해서 기계어 코드를 생성하고 아키텍쳐의 특성에 맞는 최적화를 진행하기도 한다.


기존 컴파일러와 GCC 컴파일러의 문제

기존 컴파일러의 문제점

  • 대부분의 컴파일러가 위와 같은 디자인임에도 불구하고 실제로는 [펄, Python, 루비] 컴파일러 사이에는 어떤 코드도 공유되고 있지 않다.

  • 자바와 .NET에서 사용하는 가상 머신 모델을 C/C++ 같은 네이티브 언어에는 적용할 수 없다.

⇒ 디자인이 같음에도 불구하고 언어가 다르면 서로 호환이 안된다.

GCC 컴파일러의 문제점

GCC 컴파일러는 단일 프로그램으로 구현되어 있어 다른 애플리케이션에서 GCC 전체 혹은 일부 모듈만 따로 가져와서 사용하는 것이 불가능하다.


Apple의 LLVM 프로젝트 개발

기존의 컴파일러와 GCC 컴파일러는 위와 같은 한계점이 있었고
결국 Apple은 독자적인 컴파일러를 만들기위해 LLVM 프로젝트 개발을 시작한다.

LLVM 프로젝트

LLVM 프로젝트는 컴파일러의 Front-end와 Back-end를 개발하는데 필요한 기능을 제공하는 컴파일 인프라를 말한다. 즉, 모듈식 및 재사용 가능한 컴파일러 및 툴체인 기술의 모음이라고 할 수 있다.

  • Front-end에서 다양한 언어를 지원할 수 있고, Front-end에서 처리된 결과는 언어에 독립적인 IR(Intermediate Representation)으로 나온다.

  • 이를 Middle-end에서 최적화하여 모든 Front-end가 같은 Middle-end를 공유할 수 있게 된다.

  • 또한 Back-end에서는 다양한 컴퓨터 아키텍쳐를 지원한다.

결론적으로 LLVM으로 원하는 컴퓨터 언어에 대응하는 Front-end만 만들면 나머지 Middle-end, Back-end는 이미 있는 LLVM에서 제공하는 기능으로 쉽게 컴파일러를 만들 수 있다.

정리

Xcode에서 SwiftObjective-C가 다른 언어임에도 불구하고 함께 빌드 가능한 이유는 LLVM이 목적코드를 생성하기 위해 Swift Compiler와 Clang이라는 Front-end를 갖고 있기 때문이다.
SwiftObjective-C는 둘 다 LLVM을 위한 중간 언어로 변환된 후에 실제 어셈블리어로 변환되기 때문에 같은 LLVM 안에서 컴파일 될 수 있는 것이다.

0개의 댓글