본문 바로가기

스터디/리눅스 커맨드라인

[리눅스] 23. 프로그램 컴파일

 

1. 컴파일링이란?

소스 코드(프로그래머에 의해 작성된, 사람이 읽을 수 있는 형태의 프로그램 서술)를 컴퓨터 프로세서의 언어로 번역하는 절차이다.

컴퓨터 프로세서(또는 CPU)는 기본적인 단게에서 동작을 하는데, 이 것을 기계어로 프로그램들을 실행하는 것이다. 기계어는 "바이트 더하기", "메모리 위치 가리키기" , "바이트 복사하기" 등와 같이 간단한 명령들을 설명하는 숫자코드이다.
기계어 예시

각각의 명령어들은 2진법으로 표현되고 하나의 명령어를 해석하는데 상당히 많은 크기의 기계어를 차지한다. 크기도 상당하고 2진법으로 이루어져 있기 때문에 어떤 명령어로 해석되는지 설명이 어렵고 해석하기도 난해하다.

이러한 문제는 어셈블리어의 출현으로 해결되었다.
숫자 코드를 대신하기 위해 CPY(copy), MOV(move)와 같은 더 쉽게 사용할 수 있는 연상기호(니모닉)을 사용하였다.
어셈블리어로 짜인 프로그램들은 어셈블러라는 프로그램에 의해 기계어로 처리된다, 어셈블리어는 디바이스 드라이버임베디드 시스템 등과 같은 특정 작업에서 여전히 오늘날까지 사용되고 있다.

그 다음으로 나타난 것은 고급 프로그래밍 언어이다.
고급 프로그래밍 언어는 프로세서 동작의 세부사항에 대해 덜 고민하게 만들고, 문제를 더 쉽게 해결할 수 있게 도와주기 때문에 이렇게 불렸다.
고급 프로그래밍 언어로 작성된 프로그램은 컴파일러라고 하는 프로그램에 의해 처리되어 기계어로 변환된다.

컴파일링과 함께 자주 사용되는 절차를 링킹이라고 한다. 프로그램들은 파일 열기와 같은 공통적인 작업들을 많이 수행하는데 이러한 루틴들을 반복적으로 하는 것은 굉장히 비효율적이다. 파일을 여는 방법처럼 일정 루틴이 정의된 프로그램 코드를 지원해준느 것이 라이브러리이다. 

링커라는 프로그램을 통해서 컴파일러의 출력무로가 컴파일된 프로그램이 필요한 라이브러리를 연결하는 데 사용된다.

이러한 과정을 통해서 프로세스의 최종 결과물은 사용할 준비가 완료된 실행파일이다.


!   모든 프로그램이 컴파일이 되는가?  !
쉘 스트립트와 같은 일부 프로그램들은 컴파일은 필요 없고 직접 실행된다. 이러한 것들을 스크립트 또는 인터프리트 언어로 알려진 프로그래밍 언어로 작성되었다.
예를 들면 펄, 파이썬, PHP, 루비 등과 같은 언어가 이에 해당한다.

스크립트 언어는 인터프리터라고 불리는 특수한 프로그램에 의해 실행된다. 인터프리터는 프로그램 파일을 입력 받아 읽고 파일 내부의 각 명령어들을 실행한다. 일반적으로 인터프리터된 프로그램은 컴파일된 프로그램보다 아주 느리게 실행된다. 그 이유는 인터프리트된 프로그램 내의 소스 코드 명령이 매번 번역되고 실행되기 때문이다. 반면, 컴파일된 프로그램의 소스 코든느 한 번만 해석되고 이 내용은 최종 실행 파일에 영구적으로 기록된다.

 

 

실습은 책으로...