본문 바로가기

CS/컴퓨터 시스템

Chap 3. 고급 언어의 기계어 변환 및 실행

고급 언어에서 기계어로 변환되는 과정을 설명

 

고급언어 -> 기계어로 변환되는 과정 

“고급 언어 프로그램(source file)”

[컴파일러] → “어셈블리 프로그램”

[어셈블러] → “기계어 프로그램(object file)” or “기계어 프로그램(object file 또는 library file)”

[링커(linker)] → “기계어 프로그램(executable file)” or “공유 라이브러리”

[로더(loader)] ⇒ “메모리”

도표화

 

 

먼저, 각 변환기에 대해서 살펴보자. 

[ 컴파일러 ]

고급 언어 프로그램을 어셈블리 프로그램으로 바꾸는 것이다.

여기서 고급 언어 프로그램으로 작성한 것은 시스템 종류에 무관하다. 

ex) 씨언어로 작성된 파일인 a.c라는 소스파일을 각 시스템들이 가지고 있는 컴파일러로 컴파일한다.

 

하지만 어셈블리 프로그램은 시스템 마다 다르다. 시스템마다 instruction set이 다르기 때문에 어셈블리 프로그램이 다르다. 

예를 들어 MIPS에 맞는 어셈블리 프로그램이 따로 있다. 

 

[ 어셈블러 ]

어셈블리언어로 작성된 소스코드를 기계어 프로그램으로 바꾸는 것

ex) 어셈블리언어 add라는 명령어를 0100로 바꾸는 것

어셈블러 예시 = MIPS, Sun Sparc, HP PA-RISC

 

[ 링커 ]

object file 및 library file(static)을 하나의 executable file(실행 파일)로 만든다.

 

[ 로더 ]

실행파일은 파일일 뿐 진짜로 실행하기 위해서는 메모리에 올려놔야 한다. (로딩해야 한다) 그래야 메모리에서 실행할 수 있게 된다. 

executable file 또는 object file을 메모리로 올린다. 

하드디스크와 같은 외부 저장장치에 있는 특정 프로그램을 찾아 주기억장치에 적재하고, 그 프로그램이 실행되도록하는 역할 (컴퓨터 운영체제(유닉스, 윈도우 등)의 일부분이다)

 

- 상용 컴파일러 소프트웨어 (gcc, visual C, 이클립스)는 컴파일러, 어셈블러, 링커 등을 내포하고 있어 소스 파일에서 실행 파일 변환이 한 번에 이루어진다. 

  • 통상적으로 “컴파일”했다고 한다면 컴파일, 어셈블러, 링커까지 다 수행하여 .exe파일을 성공적으로 이루었다고 하는 것이다.

 

 

다음으로 변환된 결과들에 대해서 살펴보자. 

[ 고급 언어 (High Level Language) ]

인간이 이해하기 가장 쉬운 언어

머신과 상관없다. (machine independent) ex) 리눅스에서 씨코드를 짜든지 윈도우에서 씨코드를 짜든지 상관없다.

컴파일러라는 소프트웨어를 통해서 실제로 고급 언어로 만든 파일 전체를 어셈블리어로 바꾸어주고 그 다음 기계어로 바꾸어준다. (한 번에)

인터프리터는 한 줄 한줄 바로 해석하여 바로 실행해준다. (실행해서 바로 보여준다)

이 둘은 변환 과정은 똑같다고 볼 수 있다. (고급 언어 → 어셈블리어 → 기계어)

ex) python (인터프리터), 쉘 스크립트(인터프리터), C (컴파일러)

 

[ 어셈블리 언어 (Assembly Language) ]

- 0과 1의 조합을 상징적인 코드로 변환하여 인간의 이해도를 향상한다. 

- Machine language 와 1대1 매핑 가능하다. (기계와)

- 기계와 의존적인 관계이다. (각각의 CPU마다 다른 어셈블리어가 있음)

- 이전에는 빠른 처리를 위해 바로(다이렉트) 어셈블리 언어로 코딩하는 경우도 있었는데 최근에는 그렇게 하지 않고 씨같은 것으로 코딩을 하고 나머진 알아서 기계가 번역하여 하는 방향이다. 그래서 어셈블리 언어를 알아야 할 필요는 없는데 사람이 기계어를 이해할 수 없기 때문에 실제로 어셈블리 언어를 통해서 기계에 대해서 처리하는 것들을 이해를 편하게 하기 위해서 사용하는 것이다.

 

[ 기계어 (Machine Language) ]

- 컴퓨터가 직접 이해 가능한 언어, 0과 1의 조합이다.

- CPU에 따라서 기계어 set구조가 다르기 때문에 머신 의존적이다.

    ex) 어떤 머신은 32비트 기계어 단위로 처리하고 어떤 머신은 64비트 단위로 처리한다.