컴퓨터/컴파일러

1. 컴파일러란?

sidedoor 2024. 7. 9. 16:43

컴파일러는 source language로 쓰여진 프로그램을 보수적으로 접근하여 동일한 기능을 하는 target language로 변환하는 것이다.

 - source language : high level language로 인간이 이해할 수 있는 c, c++, java와 같은 언어

 - target language : machine language로 기계가 이해할 수 있는 언어

※ 여기서 python -> c++와 같이 high 에서 high로 compile도 가능하다

 

원래 compiler는 source와 target의 종류별로 해야하기 때문에 n개의 source언어와 m개의 target언어가 있다면 n * m개의 컴파일 과정이 필요하여 불편하고 복잡하다.

이때 IR(intermediate representation)이라는 중간 언어로 한 번 거쳐서 compile을 진행하게 된다면 m + n번의 과정만 거치면 되어서 간편해진다.

이때 source에서 IR로 변환하는 과정을 front-end compilation, IR 서 target으로 변환하는 과정을 back-end compilation이라고 한다.

compile과정

compiler의 역할

1. performance

c++에서 사용되는 컴파일러인 gcc의 최적화 레벨이 O0, O1, O2,... 등이 있다

이때 O0은 최적화를 하지 않고 단순히 변환만 한 것이고, O3는 가장 높은 최적화를 하여 컴파일 시간과 메모리에 최적화를 한것이다.

 

2. programmability

open mp를 사용하여 자동으로 mulitcore processing이 가능하다

만약 for문을 반복한다고 했을 때

#include <omp.h>
#include <stdio.h>
int main()
{
	#pragma omp parallel for num_threads(4)
	for (int i = 1; i <= 10; i++) {
		int tid = omp_get_thread_num();
		printf("The thread %d executes i = %d\n", tid, i);
	}
return 0;
}

이처럼 #pragma omp parallel for num_threads(4)이라는 태그를 통해서 compiler가 자동으로 병렬화를 하여 위의 경우 4개를 동시에 진행한다.

 

3. security

- user after free취약점: 메모리가 해제된 뒤 다시 그 메모리에 접근하는 오류로 컴파일러를 사용하면 이를 사전에 찾아내어 안전하게 처리 가능하다

- buffer over flow attack취약점: 프로그램에 할당된 버퍼를 넘어서 데이터를 쓰는 공격이다.

이를 통해 프로그램의 흐름을 변경하거나 임의의 코드를 실행시킬 수 있다.

compiler는 구조의 boundary를 확인해서 막는다.

 

compiler와 interpreter

interpreter는 JIT(just intime compiler)로 실행시간에 프로그램을 바로 기계언어로 변형해준다

이러한 장점은 만약 프로그래밍을 x86cpu로 보내기 위해서 compile을 진행했으면 이 결과를 arm에서 사용이 불가능하다

하지만 interpreter는 실행시간에 소스코드를 해석하여 실행하기 때문에 별도의 컴파일 없이 바로 실행이 가능하다.

따라서 이식이 더 용이하다.

다만 hardware에서 직접 실행되지 않기 때문에 실행시간이 느리다는 단점이 있다.