MONO
C#은 “Mono C# 컴파일러”에 의해서 IL코드(CPU와 OS에 독립적인 기계어 코드)로 변환된다. Assembly-CSharp.dll 를 확인하면 IL코드를 볼 수 있다.
이제 Unity에서 Mono로 빌드를 하게되면 IL코드는 Mono Framework상에서 돌면서 다시 Assembly(Binary)로 변환한다.
그런데, 이 Mono는 런타임 중에 그때그때 필요할 때 마다 코드를 한줄 씩 읽으면서 Assembly언어로 변환한다.
이러한 과정을 JIT컴파일링(Just In Time)이라고 한다.

<첨언 : 추가 상식1>
C#은 .Net Framework 위에서 동작하는데 이는 Windows 프로그램을 구동시키자는 취지로 개발되었기 때문에 Windows 환경에 제한되어 있음. 따라서 오픈 소스 개발 그룹이 mono를 만들어서 멀티 플랫폼을 지원함.
현재, MS는 .Net Framework를 오픈 소스로 공개했고 Mono의 메인테이너인 자마린을 인수하고, Windows, macOS, Linux환경에서 모든 .Net Framework기반 언어를 사용하여 개발/실행이 가능한 오픈 소스 프레임워크인 .Net Core를 공개함.
<첨언 : 추가 상식2>
중간 언어는 CPU와 OS에 독립적인 기계어 코드이다.(어셈블리에 비해 사람이 읽을 수 있음) 이 중간언어는 CPU가 바로 해석할 수 없는데, “가상 머신”이라는 놈이 CPU가 이해할 수 있도록 해석해줌.
이런 구조의 장점은 CPU와 OS에 독립적으로 프로그래밍할 수 있다는 것. 윈도우용 가상머신/리눅스용 가상머신 등..을 사용하면 어디서든지 실행가능한 멀티플랫폼을 지원한다는 것. C#뿐만 아니라 C++도 C++컴파일러가 IL로 바꿔줌.
IL2CPP
일단, “Mono C# 컴파일러”가 C# IL코드로 변환해주는건 동일하다.
여기서 IL2CPP.exe라는프로그램을 통해 IL을 C++로 변환한 후 이를 기계어까지 생성한다.(현재 대부분의 컴파일러들은 C++을 통해 기계어까지 생성하기 때문에 C++로만 바꿔도 기계어로 번역하는 시스템을 안써도 된다고 한다. 그게 아니면 gcc에 의해 어셈블리로 변환시킴.)
이렇게되면, JIT컴파일링과는 다르게 이미 기계어로 변환되어 있기 대문에 Interprete과정이 생략되어 성능이 향상된다. 이를 AOT컴파일링이라고 한다.

<첨언 : 근데, MONO도 따지고 보면 AOT컴파일링을 제공할 수 있을텐데 왜 C++변환 방식을 선호할까?>
성능, 보안 및 플랫폼 호환성을 개선하는 용도
- 성능 - 사용하지 않는 유니티 모듈들을 C++변환 과정애서 제거할 수 있음 (link.xml 에 해당정보가 있음)
- 보안 - Mono로 빌드시 디컴파일러 툴을 이용해 쉽게 소스코드로 변환이 가능한데 IL2CPP로 빌드된건 디컴파일해도 쉽게 해킹 불가능
- 호환성 - iOS 64bit 호환 가능 (Mono는 지원하지 않음)
- 구버전의 Mono로 최신 플랫폼등을 대응하기가 어려움
그래서 결국은?

유니티 에디터에서는 MONO(JIT방식)으로 돌려서 테스트함.
실제 멀티플랫폼에서 빌드할 때에는 IL2CPP(AOT방식)로 빌드함.
https://www.youtube.com/watch?v=-9X965jXrn8
https://chp747.tistory.com/334
https://shkim0811.tistory.com/34
'게임엔진 > Unity' 카테고리의 다른 글
클래스와 구조체 차이 (0) | 2023.07.03 |
---|---|
제네릭 한정자 in,out 공변성과 반공변성 (0) | 2023.07.03 |
제네릭 타입 추론 (0) | 2023.07.03 |
List를 사용할 때 Reserve해야하는 이유 (0) | 2023.07.03 |