포스트

컴파일, 컴파일러, 어셈블러, 링커, 로더

네이버 블로그 사용 당시 썼던 글을 옮겨온 글 입니다. 일부 오류가 있을 수 있습니다. 참고


  • Compile 컴파일
    • 특정[원시] 언어 (Source) 로 작성된 코드를 다른[목적] 언어 (Target) 의 코드로 변역[해석, 변환]하다, 혹은 그 과정
    • 주로 ‘고급 언어 (High Level) 로 작성된 코드를 저급 언어 (Low Level) 로 번역하는 것, 혹은 그 과정’ 을 의미함
  • Compiler 컴파일러
    • 컴파일[번역, 해석, 변환]하는 프로그램
  • 본래 컴파일은 ‘특정 언어’를 ‘다른 언어’로 번역하는 것, 혹은 그 과정

  • HLL → HLL
    • I.E. Java → C#으로 => Source to Source Compiler, Transcompiler)
  • LLL → HLL
    • I.E. Byte Code → Java, Python / 기계어, 어셈블리어 → C#(추상)으로 => Decompiler)
  • LLL → LLL
    • I.E. 어셈블리어 → 기계어 = Assembly, 기계어→ 어셈블리어 = Disassembly)
  • Compile 사전적 의미
    • (여러 출처에서 자료를 따와) 엮다, 편집[편찬]하다
    • 왜 이런 뜻을 가지고 있는 Compile 이 ‘~ 번역하다(컴퓨터)’ 라는 의미도?
  • → 최초의 컴파일러 ‘A-0’
    • By Grace Hopper
    • 현대의 컴파일러로서 동작하기 보다, 링커 (Linker) 또는 로더 (Loader) 로서 더 많이 동작됐기 때문
  • Linker
    • 여러 파일(Source Code, Library, …)을 하나의 실행 파일로 연결시켜 주는 역할
    • 때문에 ‘A-0’ 를 설명하기 위해 ‘엮다, 편집하다’ 라는 뜻의 Compile + ~er = Compiler 라는 용어 만듦
  • 컴파일(컴퓨터)의 개념이 점차 바뀌면서, 단어의 뜻 역시 ‘~ 번역하다(컴퓨터)’ 로 바뀜
  • 참고 : ‘함께’ 라는 의미의 ‘Com’ + ‘쌓아올리다’ 라는 의미의 ‘Pile’

  • 컴파일의 과정 (I.E. HLL → Machine L)

HLL : Source Code
↓ Compiler
Machine L : Object Code
↓ Linker
실행 파일

언어에 따라
Source Code → Object Code 번역 과정까지만을 의미하거나,
Linker를 통한 실행 파일 생성 과정까지를 의미하는 경우도 있음

C는 전자

  • Object File 오브젝트 파일 : 기계어로 이루어진 파일

  • Linking : 한 개 이상으로 존재하는 오브젝트 코드를 합쳐 하나의 .exe 실행 파일로 만드는 것, 혹은 그 과정
  • Linker
1
2
3
4
5
6
#include <stdio.h>
int main()
{
	printf("Hello, World!");
	return 0;
}

코딩 시 프로그램에 필요한 모든 코드를 작성하지 않고, 이미 만들어진 코드를 가져와 사용

I.E.
printf는 #include 를 통해, stdio.h Library에 이미 만들어진 함수를 가져다 사용한 것

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Program1.c
#include <stdio.h>

extern int age;

int main()
{
	printf("My age is %d", age);
	return 0;
}

// Program2.c
#include <stdio.h>
int age = 20;

또한, 보통 다수의 코드 파일을 다루게 되고, 그 코드들은 서로에게 영향을 줌

→ 작성한 Source Code와, Library 등을 하나로 합쳐 하나의 .exe 실행파일로 만드는 작업 → I.E. C Code와, stdio.h Library를 하나로 합쳐 하나의 .exe 실행파일로 만드는 작업

→ Linking, Linker

  • 컴파일러의 종류
    • 특정 플랫폼 → 다른 플랫폼
      • I.E. Window10 → Android, Crosscompiler
    • 컴파일러에서 컴파일러를
      • I.E. CompilerCompiler
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.