Unity가 제공하는 scripting backend 로서 빌드시 mono 대신 사용함.

 

C#은 msc.exe 라는 프로그램에 의해 IL 코드로 변환되며 유니티에서는 C# 코드를 빌드하면 Assembly-CSharp.dll 이라는 결과파일이 나오는데 이것을 IL 이라고 지칭한다.

이를 기계에 넣어서 실질적으로 실행시키기 위해선 Assembly코드, 즉 Binary로 변환해야 하는데 이 역할을 기존의 Mono가 함.

이 Mono가 코드를 한줄씩 읽으면서 실시간으로 Assembly 언어로 변환하는데, 이러한 일련의 과정을 JIT컴파일링 이라고 함 (Just In Time : IL을 해석하고 기계어로 변환하는 과정만을 JIT컴파일링 이라고 함)

 

IL2CPP도 msc.exe를 이용해 IL코드를 생성하는건 동일하지만, il2cpp.exe라는 프로그램을 통해 IL을 C++로 변환한후 이를 기계어까지 생성한다 (현재 대부분의 컴파일러들은 C++을 이용해 기계어를 생성할 수 있기 때문에 C++로만 바꿔도 따로 기계어로 번역하는 시스템을 안써도 됨 = Mono 로부터의 자유)

이렇게 되면 JIT컴파일링과는 다르게 이미 기계어로 변환되어 있기 때문에 실행중에 변환하는 Interprete 과정이 생략되어 성능이 향상됨

(외국인에게 얘기할때 중간에 통역자가 있으면 의사소통이 느리지만, 영어로 바로 얘기하면 서로 의사소통이 빠른것과 같음. 여기서 통역자는 Mono 되시겠다)

이런식의 실행도중 컴파일 과정이 없는 형태를 AOT컴파일링 이라고 하며 JIT와 반대개념이다.

물론 Mono에서도 AOT컴파일링을 제공한다. C++을 거치지않고..

 

여기서 한가지 의문점 발생

아니 그럼 Mono써서 그냥 AOT컴파일링 하면 되잖아. 왜 굳이 C++로 변환을 하지? 라고 생각이 들것이다.

몇가지 이유를 찾아봤는데,

  • 성능, 보안 및 플랫폼 호환성을 개선하는 용도
    • 성능 - 사용하지 않는 유니티 모듈들을 C++변환과정애서 제거할 수 있음 (link.xml 에 해당정보가 있음)
    • 보안 - Mono로 빌드시 디컴파일러 툴을 이용해 쉽게 소스코드로 변환이 가능한데 IL2CPP로 빌드된건 디컴파일해도 쉽게 해킹 불가능
    • 호환성 - iOS 64bit 호환 가능 (Mono는 지원하지 않음)
    • 구버전의 Mono로 최신 플랫폼등을 대응하기가 어려움

정도이다.

 

장점만 나열하니 우와 좋은거네 라고 할 수도 있지만, 단점도 분명 존재한다.

  • 컴파일 시간이 길다.
    • iOS의 경우 Xcode 프로젝트로 뽑아내는 시간 + Xcode 에서 앱빌드하는 시간
    • 중간에 C++로 변환하는 단계를 거치기 때문에 다소 시간이 더걸림
  • AOT 컴파일만 지원

'Unity' 카테고리의 다른 글

Quaternion 공간변환  (0) 2020.11.23
rigidbody, collider 개념 및 정리  (0) 2020.10.08
Addressables  (0) 2020.07.28
Mobile 최적화  (0) 2020.06.12
좌표계  (0) 2020.06.09

+ Recent posts