언어의 컴파일 과정

     

    📌 컴파일이란 ?

    컴파일은 인간이 이해할 수 있는 언어로 작성된 소스코드를 CPU가 이해할 수 있는 언어(기계어)로 번역하는 작업을 말한다.


    여기서 CPU란 무엇일까⁉

    cpu는 프로그램을 실행하기 위해서 메인 메모리에서 명령어를 인출하여 해독하고 실행하는 것을 의미한다.

     

    먼저 도체, 반도체, 부도체에 대해 알아보자. ( 중학교때 배웠던걸 이제 써먹네요 ㅎ)

    도체 : 전기가 흐르는 것을 뜻하고

    반도체 : 전기가 흐를 때도 있고, 흐르지 않을 때도 있다.

    부도체 : 전기가 흐르지 않는다.

     

    cpu반도체에 해당한다.


    💻 컴퓨터는 왜 2진수로만 이루어져 있을까?

    cpu에서 전기가 흐르면 1 흐르지 않으면 0을 돌려주기 때문이다.


    📌 언어의 컴파일 과정

    컴파일 과정에는 4가지 단계가 있다!

     

    전처리 과정 → 컴파일 과정 → 어셈블리 과정 → 링킹 과정 으로 나뉜다

    위의 4가지 과정을 묶어서 컴파일 과정과 빌드 과정이라고 부르기도 하고, 컴파일 과정과 링킹 과정을 따로 나눠서 부르기도 한다.


    전처리 과정 !! 

    • 소스코드에서 주석을 전부 제거해야합니다.주석은 사람들이 알아볼 수 있게 남긴 메시지이지 컴퓨터가 알 필요는 없기 때문에 제거해야한다.
    • c언어를 예로 들어 설명하자면, c언어에는 #include 지시문을 만나면 해당하는 헤더 파일을 찾아 헤더 파일에 있는 모든 내용을 복사해서 코드에 삽입한다. 즉!, 헤더 파일은 컴파일에 사용되지 않고, 소스코드 파일 내에 전부 복사된다.
    • 헤더 파일에 선언된 함수 원형은 후에 링킹 과정을 통해 실제로 함수가 정의되어 있는 오브젝트 파일(컴파일된 소스 코드 파일)과 결합한다.
    • 매크로 치환 및 적용 : #define 지시문에 정의된 매크로를 저장하고 같은 문자열을 만나면#define 된 내용으로 치환한다. 간단하게 말해 매크로 이름을 찾아서 정의한 값으로 전부 바꿔준다. 

     

    전처리 과정에서는 주석제거, 헤더 파일 삽입, 매크로 치환 및 적용 단계로 이루어진다.

     

    컴파일 과정 !!

    컴파일 과정은 컴파일러를 통해 전처리된 소스 코드 파일을 어셈블리어 파일로 변환하는 과정이다.

    이 과정에서 우리가 일반적으로 컴파일하면 생각하는 언어의 문법 검사가 이루어진다. 또한 Static한 영역들의 메모리 할당을 수행한다.

     

    어셈블리어란?

    기계어는 다른 말로 명령어라고 부르는데 명령어는 01010101과 같은 이진수로 이뤄진 숫자로 CPU 종류마다 고유한 내용을 가지고 있다.

     

     

    어셈블리어는 이런 명령어를 사람이 이해할 수 있게 보호화한 것으로 cpu명령어와 1대 1로 매칭 된다.'

    어셈블리 과정!!

    어셈블리 과정은 어셈블러를 통해 어셈블리어 파일을 오브젝트 파일로 변환하는 과정이다.

    그렇다면… 오브젝트 파일은 어떤 것일까?

    오브젝트 파일은 어셈블리 코드를 이제 더 이상 사람이 알아볼 수 없는 기계어로 변환되는데 이를 오브젝트 코드라 부른다.

     

     

    링킹 과정!!

    링커를 통해 오브젝트 파일들을 묶어 실행 파일로 만드는 과정이다.

    이 과정에서 오브젝트 파일들과 프로그램에서 사용하는 라이브러리 파일들을 링크하여 하나의 실행파일을 만든다.

    이때 라이버러리를 링크하는 방법에 따라 정적 링킹동적 링킹으로 나눌 수 있다.  

     

    링커의 역할 : 크게 심볼 해석재배치로 나눌 수 있다.

     

    심볼 해석?

    오브젝트 파일에 있는 심볼 참조를 어떤 심볼 정의에 연관시킬지 결정하는 과정이다. 여러 개의 오브젝트 파일에 같은 이름의 함수 또는 변수가 정의되어 있을 때 어떤 파일의 어떤 함수를 사용할지 결정한다.

     

    재배치?

    오브젝트 파일에 있는 데이터의 주소나 코드의 메모리 참조 주소를 알맞게 배치하는 과정이다.

    링커가 컴파일러가 생성한 오브젝트 파일을 모아서 하나의 실행 파일을 만들 때,

     각 오브젝트 파일에 있는 데이터의 주소나 코드의 메모리 참조 주소 가 링커에 의해 합쳐진 실행 파일에서의 주소와 다르기 때문에 그것을 알맞게 수정해줘야 한다.


    📌 컴파일 언어 종류

    c , c# 등..

    📌 컴퓨터가 어떻게 받아들일까?

    기계어로 변환시킨 파일이 컴퓨터에서 받아들일 것이다

    📌 컴파일하는 이유

    우리가 작성한 소스코드를 컴퓨터에게 이해할 수 있도록 전달하려면 통역사가 필요로 한다. 통역사가 없다면 이해하지 못하고 에러를 발생시킬 것이다. 이처럼 

    대부분의 사람들에게 이해하기 쉬운 형태의 고수준 언어를 알아들을 수 있도록 변환시켜주는 것이다.

     

    자! 이제 우리는 컴파일의 중요성과 개념을 알았다! 오늘은 여기까지~ 수고하셨어요~👍👍

     

     

    728x90
    반응형

    '개발 상식' 카테고리의 다른 글

    🌐 네트워크 기초 + json  (0) 2022.10.31
    📚 프레임워크와 라이브러리의 차이  (0) 2022.10.26
    객체지향 프로그래밍이란?  (0) 2022.10.22
    🐞 코딩의 시작과 끝 🐞  (0) 2022.10.13
    🤓 클린 코드란? 🤓  (4) 2022.10.10

    댓글