컴파일이란?

  • 고급 프로그래밍 언어로 작성된 소스 코드를 컴파일러를 통해 컴퓨터가 이해할 수 있는 저급 언어(기계어 또는 바이트 코드)로 한꺼번에 변환하는 프로세스
  • 컴파일러 : 소스 코드 전체를 스캔하여 기계어로 변환하는 프로그램
  • 과정
    1. 전처리 과정 : 주석 제거 → 헤더 파일의 내용을 소스 코드에 삽입 → 매크로 치환 및 적용
    2. 컴파일 : 컴파일러를 통해 전처리 된 소스 코드 파일을 어셈블리어 파일로 변환(여기서 언어의 문법 검사가 이루어지고 Static한 영역들의 메모리 할당 수행)
    3. 어셈블리 : 어셈블리어 파일을 오브젝트 파일로 변환 하는 과정
    4. 링킹 : 링커를 통해 오브젝트 파일들을 묶어 실행 파일로 만드는 과정 이 과정에서 오브젝트 파일들과 프로그램에서 사용하는 라이브러리 파일들을 링크하여 하나의 실행 파일을 만든다.

컴파일 언어와 인터프리터 언어

  • 컴파일 언어 : 고급 프로그래밍 언어로 작성된 소스코드를 컴파일러로 통해 컴퓨터가 이해할 수 있는 저급 언어로 한꺼번에 변환해서 사용하는 언어
    • 컴파일 단계와 실행 단계가 각각 분리되어 있으며 컴파일은 한번만 수행한 다음 실행 파일을 실행 시킴으로써 코드 실행 속도가 빠르다. 단 프로젝트의 규모가 클 경우 컴파일 시간이 오래 걸릴 수 있다는 단점이 있음
  • 인터프리터 언어 : 프로그래밍 언어의 소스 코드를 바로 실행하는 언어
    • 소스 코드를 한꺼번에 변환하지 않고 소스 코드를 한 줄씩 읽고 실행한다.
    • 컴파일하는 과정이 없기 때문에 컴파일 시간은 소요되지 않으나 실행 파일을 별도로 생성하지 않기 때문에 실행시마다 소스 코드를 한 줄씩 읽고 실행하는 과정이 반복 수행되어 실행 속도가 느리다는 단점이 있음

블루프린트의 컴파일 과정

  1. 클래스 소거
    • 같은 UBlueprintGereratedClass를 재사용 하기 위해 기존 내용을 비운다
    • CleanAndSanitizeClass() 가 프로퍼티와 함수를 휘발성 패키지의 쓰레기 클래스로 옮기고 데이터를 소거
  2. 클래스 프로퍼티 생성
    • NewVariables 배열과 컨스트럭션 스크립트 등을 순회하면서 필요한 UProperty를 모두 찾아 CreateClassVariablesFromBlueprint() 로 생성한다.
  3. 함수 목록 생성
    • 이벤트 그래프 처리
    • 함수 그래프 처리
    • 함수 미리 컴파일
  4. 클래스 바인딩과 링크
    • UProperty, UFunction이 확정되면 프로퍼티 체인, 프로퍼티 크기, 함수 맵을 채우며 이 시점에서 클래스 헤더와 CDO(Class Default Object)가 생김
  5. 함수 컴파일
    • 노드 핸들러의 Compile() 함수가 AppendStatementForNode()로 FKismetCompiledStatement 객체 생성
  6. 클래스 컴파일 완료
    • 클래스 플래그 마무리, 부모 클래스에서 플래그와 메타데이터 전파, 최종 검증
  7. 백엔드, 생성된 코드 방출
    • 백엔드는 각각의 함수 컨텍스트에서의 구문 모음을 코드로 변환
      • FKismetCompilerVMBackend : FKCS 를 UnrealScript VM 바이트코드로 변환, 이후 함수의 스크립트 배열로 시리얼라이즈
      • FKismetCppBackend : 순수 디버깅 용도의 C++같은 코드를 방출
  8. 클래스 디폴트 오브젝트 프로퍼티 복사
    • 컴파일러는 특수 함수 CopyPropertiesForUnrelatedObjects() 를 사용하여 이전 클래스의 클래스 디폴트 오브젝트(CDO) 값을 새 CDO 로 복사
    • 프로퍼티는 태깅된 시리얼라이제이션을 통해 복사되므로 이름이 일관되기만 하다면 제대로 전송될 것
    • CDO 의 컴포넌트는 이 단계에서 다시 인스턴싱되고 적절히 수정됨
    • GeneratedClass CDO 는 authoritative
  9. 다시 인스턴싱
    • 클래스 크기나 프로퍼티가 변경됐을 수 있으니 TObjectIterator로 기존 인스턴스를 찾고 새 것을 스폰
    • CopyPropertiesForUnrelatedObjects() 함수를 사용하여 이전 인스턴스에서 새 인스턴스로 복사

+ Recent posts