[전산공부] 컴파일(compile) vs 빌드(build)

2020. 2. 17. 13:30프로그래밍-Science/운영체제

정말 익숙하고도 간단해보이는 단어들이지만

개발업무를 진행하다 보면 혼용하는 경우가 많다

 

그래서 간단히 정리!

 

1. 컴파일

 

개발자들은 '소스코드'를 작성한다

근데 멍청한 컴퓨터들은 소스코드를 읽을 수 없다

사람의 언어이기때문!

 

그래서 '컴파일'이라는 작업을 통해(컴파일러가 이 역할을 진행한다)

소스코드를 컴퓨터가 읽을 수 있는 바이너리 코드로 전환한다

 

그렇기때문에 컴파일을 하고나면 항상 목적파일이 뚝 떨어진다

 

자바같은 경우는 JVM이라는 자바가상머신에서 클래스 파일을 뚝 떨어뜨린다

 

내가 자주쓰는 JavaScript의 경우는 조금 더 특이하다

이놈은 토크나이징-파싱-코드생성이라는 세가지 단계를 거친다

 

'스캐너'의 경우 코드를 토큰(Token)으로 만드는 작업이다.

var a = 2;라는 코드가 있다면, var/a/=/2/; 요렇게 말이다

 

'파싱'은 문법구조를 고려하여 얘를 트리라는 자료구조 형태로 만드는 과정

얘를 가리켜 AST(추상 구문 트리) 라고 한다

 

예를 들자면 요런식

문법구문을 하나씩 체크하여 트리형태로 설명을 쭉 적어내려간다

 

이렇게 하고 컴퓨터가 이해할 수 있는 코드를 생성하면 끝!

 

 

2. 빌드

 

그렇다면 빌드는?

 

이를 이해하려면 링크(LINK)에 대해 알아야 한다

링크는 하나의 소스파일을 컴파일 한 후, 해당 소스파일에서 불러야 하는 함수가 다른 소스파일에 있다면 그것을 연결시켜주는 것을 이야기한다.

동적링크/정적링크로 나뉘지만 그건 나중에 얘기하기로 하고..

 

무튼 빌드는 컴파일과 링크이다

 

그러니까 빌드=컴파일+링크가 된다

사전적인 정의로 풀어보면, 소스코드를 실행할 수 있게끔 바꾸는 것을 빌드라고 한다

그래서 일반적으로 빌드툴에는 테스트나 배포 같은 것들도 포함한다

 

MAVEN이 대표적인 툴

요새는 Dev-Ops(개발자가 개발하면서 운영자에게 바로 피드백 받는 프로세스)가 대세이기 때문에

자동빌드가 필수

 

 

+ 한 가지만 더

 

그럼 컴파일러와 인터프리터의 차이는 뭘까?

 

둘 다 하이레벨의 언어를 기계어로 변환한다는 점에선 같으나 작동 기재의 차이가 있다

컴파일러는 소스코드 전체를 한 번 훑고 바로 기계어로 변환하지만,

인터프리터는 하이레벨 언어를 중간언어로 일단 변화시키고 각 행마다 다시 체크한다

물론 체크하다가 에러가 나면 그 뒤의 행은 안본다

 

그림으로 설명하자면 대충 요런 방식