고급 언어에서 기계어로 변환되는 과정을 설명
고급언어 -> 기계어로 변환되는 과정
“고급 언어 프로그램(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비트 단위로 처리한다.
'CS > 컴퓨터 시스템' 카테고리의 다른 글
Chap 5. 컴퓨터 시스템 구조 (0) | 2022.05.19 |
---|---|
Chap 4. 운영체제란? (0) | 2022.05.18 |
Chap 3 - 3. static 라이브러리와 shared 라이브러리 (0) | 2022.05.14 |
Chap 3 - 2. 부분 컴파일 (0) | 2022.05.13 |
Chap 1. System Software와 ISA (0) | 2022.03.24 |