본문 바로가기
IT

컴파일러

by Redking

컴파일러는 고급 프로그래밍 언어(python, java등)를 실행프로그램으로 변경할 때 사용된다. 소스코드를 컴파일하는 과정이 필요한 이유는 작성자가 만든 코드를 컴퓨터가 이해 가능한 저급 언어(어셈블리어, 기계어)로 변환 시켜아 하기 때문이다. 컴파일러는 즉시 결과를 출력하는 인터프리터와는 구분되며 근래에 들어서는 JIT 컴파일과 같은 기술의 등장으로 실시간 컴파일을 수행하기 때문에 컴파일러와 인터프리터의 기술적 구분은 사라지고 있다.

 

컴파일러는 다음과 같은 네 분류로 나뉜다.

  1. 원시 코드를 바로 기계어로 변환하는 정적 컴파일(Static Compilation)
  2. 원시 코드를 바이트코드로 변환하는 바이트코드 컴파일(Bytecode Compilation)
  3. 바이트코드 등의 중간 코드를 기계어로 변환하는 AOT 컴파일(Ahead-Of-Time Compilation)
  4. 실행시 최초 한 번에 한해 컴파일을 거치는 JIT 컴파일(Just-In-Time Compilation)

이제 컴파일러의 종류별로 특징을 알아 보도록 하겠습니다.

 

정적 컴파일

정적 컴파일은 JIT 컴파일과 대응되는 컴파일입니다. 한편, 배포 JIT는 개발 JIT와 다를 수 있으며, 이는 가상 머신이나 라이브러리 코드의 사소한 차이로 인해 문제를 일으킬 수 있습니다. 정적 컴파일과 함께 프로그램은 네이티브 코드로 컴파일되어 개발자가 배포된 것을 정확하게 테스트할 수 있습니다. 반면에 컴파일러에는 버그가 있습니다.. 정적 컴파일러 버그로 인한 충돌은 때때로 컴파일 시간에 발생하기도 하지만 JIT의 버그는 프로그램 실행 시간에 충돌을 일으킬 수 있으며, 그들 중 일부는 프로그램의 일부가 여러 번 실행된 후에야 나타납니다. 게다가 프로그램이 컴파일러나 프로그램 자체의 버그로 인해 충돌할 경우, 정적 컴파일된 코드는 런타임 추적이 더 예측 가능하기 때문에 디버깅하기가 훨씬 쉽습니다.

정적 컴파일은 더 나은 지적 재산권 보호를 제공합니다. 네이티브 코드는 바이트 코드보다 리버스 엔지니어링이 훨씬 어렵기 때문입니다.

정적 컴파일러는 프로그램을 실행하기 전에 자원 집약적 최적화를 수행할 수 있다. 대조적으로, JIT 컴파일러는 실행 시간에 분석을 수행해야 하므로 결합된 컴파일 및 실행 시간에 큰 영향을 미치지 않고 수행할 수 있는 단순한 최적화로 제한된다.

정적 컴파일은 시작 비용을 크게 절감하고 메모리 사용량을 줄이며 OS가 응용 프로그램 간에 코드를 자동으로 공유하며 네이티브 코드와의 연동이 용이하다.

마지막으로, 정적 컴파일링은 JIT 컴파일보다 코드 인증에 더 적합합니다. 신뢰할 수 있는 컴퓨팅 기반에서 컴파일러를 제거함으로써 더 높은 안전 보장을 얻는 것이 훨씬 쉽습니다.

 

바이트코드 컴파일

바이트 코드 컴파일러는 매우 빠른 바이트 코드 인터프리터 또는 가상 머신에서 해석할 수 있는 아주 간단한 언어로 복잡한 고급 언어 변환합니다. 이 간단한 언어의 내부 표현은 바이트 문자열이므로 이름 바이트 코드입니다. 컴파일 프로세스는 변수 조회 및 제어의 비로컬 전송을 위한 종료 설정을 포함하여 인터프리터가 수행해야 하는 많은 비용이 많이 드는 작업을 제거합니다. 또한 일부 인라인을 수행하고 언어를 꼬리 재귀적으로 만듭니다. 이것은 tail calls이 점프로 컴파일되므로 재귀를 사용하여 반복을 구현할 수 있음을 의미합니다.

 

AOT 컴파일

AOT 컴파일러는 응용 프로그램이 실행되는 동안 네이티브 코드를 동적으로 생성하고 생성된 AOT 코드를 공유 데이터 캐시에 캐시합니다. 메소드를 실행하는 후속 VM은 JIT 컴파일된 네이티브 코드에서 경험하는 성능 저하 없이 공유 데이터 캐시에서 AOT 코드를 로드하고 사용할 수 있습니다.

 

AOT 컴파일러는 기본적으로 활성화되어 있지만 공유 클래스가 활성화된 경우에만 활성화됩니다. 기본적으로 공유 클래스는 AOT 활동이 발생하지 않도록 비활성화되어 있습니다. AOT 컴파일러가 활성화되면 컴파일러는 시작 시간을 개선하는 주요 목표로 AOT 컴파일할 메서드를 선택합니다.

 

JIT 컴파일

JIT(Just-In-Time) 컴파일러는 런타임에 바이트 코드를 원시 기계 코드로 컴파일하여 애플리케이션의 성능을 향상시키는 런타임 환경의 구성요소입니다.

프로그램은 다양한 컴퓨터 아키텍처에서 VM이 해석할 수 있는 플랫폼 중립적 바이트코드를 포함하는 클래스로 구성됩니다. 런타임에 VM은 클래스 파일을 로드하고 각 개별 바이트 코드의 의미를 결정하고 적절한 계산을 수행합니다. 해석 중 추가 프로세서 및 메모리 사용량은 Java 응용 프로그램이 기본 응용 프로그램보다 더 느리게 수행됨을 의미합니다. JIT 컴파일러는 런타임에 바이트 코드를 기본 기계 코드로 컴파일하여 Java 프로그램의 성능을 개선하는 데 도움이 됩니다.

 

컴파일 시 사용할 수 있는 몇가지 툴도 부연 설명으로 소개하고자 한다.  IAR Embedded Workbench, WinAVR, Code Vision AVR, EWAVR등이 있고 현재 프로젝트의 상황에 맞게 선택해서 사용하면 되고 대부분 믿을 수 있는 기업에서 제작한 컴파일러이고 성능이 상향 평준화 되어 있기 때문에 어떤것을 사용해도무리 없이 사용 할 수 있다.

 

'IT' 카테고리의 다른 글

운영체제의 종류  (0) 2022.08.13
Instruction Pipeline  (0) 2022.08.13
OSI 7계층 모델  (0) 2022.08.13
프로젝트 시작시 해야할것들  (0) 2021.10.05
ASCII Code, Unicode, encode, decode (2편)  (0) 2021.10.01

댓글