컴파일러가 나오게 된 배경
고급언어가 나오기 이전 소프트웨어는 전부 어셈블리어로 작성되어왔음. 어셈블리어는 기계어와 매핑이 되는 저급 수준의 언어임. 하지만 CPU 의 아키텍처가 다르면 해당 아키텍처와 호환히 되는 어셈블리어를 다시 작성해야했음. 이러한 문제점을 해결하기 위해 고급언어가 등장함
고급언어로 프로그램을 작성하면 이를 기계어로 변환하여 CPU 가 해석할 수 있게해야하는데 고급언어에서 기계어로 변환을해주는 소프트웨어가 바로 컴파일러와 인터프리터임
컴파일러
- 전체 파일을 스캔하여 한꺼번에 번역한다.
- 초기 스캔시간이 오래 걸리지만, 한번 실행 파일이 만들어지고 나면 빠르다.
- 기계어 번역과정에서 더 많은 메모리를 사용한다.
- 전체 코드를 스캔하는 과정에서 모든 오류를 한꺼번에 출력해주기 때문에 실행 전에 오류를 알 수 있다.
- 대표적인 언어로 C, C++, JAVA 등이 있다.
인터프리터(interpreter)
- 프로그램 실행시 한 번에 한 문장씩 번역한다.
- 한번에 한문장씩 번역후 실행 시키기 때문에 실행 시간이 느리다.
- 컴파일러와 같은 오브젝트 코드 생성과정이 없기 때문에 메모리 효율이 좋다.
- 프로그램을 실행시키고 나서 오류를 발견하면 바로 실행을 중지 시킨다. 실행 후에 오류를 알 수 있다.
- 대표적인 언어로 Python, Ruby, Javascript 등이 있다.
컴파일 과정
1. 전처리 단계
전처리기 (Preprocessor) 를 통해 (*c) 를 전처리된 소스코드 파일로 (*.i) 변환하는 과정
아래 세가지 작업을 수행함
- 주석 제거
- 소스 코드에서 주석을 전부 제거함
- 헤더 파일 삽입
- 헤더파일에 있는 모든 내용을 복사하여 소스 코드에 삽입함
- 매크로 치환 및 적용
- 매크로 이름을 찾아서 정의된 값으로 전부 변경해줌
2. 컴파일 단계
- 컴파일 과정은 컴파일러(Compiler) 를 통해 전처리된 소스코드를 어셈블리어 파일 (*s) 로 변환하는 과정
- 일반적으로 우리가 맞딱드리는 언어 문법검사를 수행함, Static 영역 (Data, BSS) 영역들의 메모리 할당을 수행함
- Data: 초기화 된 변수 영역
- BSS: 초기화 되지 않은 변수 영역
3. 어셈블리 단계
어셈블러를 통해 어셈블리어 파일을 오브젝트 파일로 변환하는 과정
오브젝트 파일 (Object File)
사람이 이해할 수 없는 기계어 코드를 오브젝트 코드라고 부름. 오브젝트 코드로 구성된 파일을 오브젝트 파일이라고 부르며 특정한 파일 포맷을 가짐
오브젝트 파일 포멧
- 오브젝트 파일 헤더 (Object File Header)
- 텍스트 섹션 (Text Section)
- 데이터 섹션 (Data Section)
- 심볼 테이블 섹션 (Symbol Table Section)
- 심볼은 함수나 변수를 식별할 때 사용하는 이름으로 심볼 테이블 (Symbol Table) 안에는 오브젝트 파일에서 참조되고 있는 심볼 정보(이름과 데이터의 주소) 를 가지고 있음
- 다른 파일에서 참조되고 있는 심볼같은 경우에는 참조할 수 없음
- 외부 파일에서 참조되고 있는 심볼은 외부 함수를 구현한 오브젝트 파일에서 불러와야하는데 연결하는 과정을 Linking 이라고 함
- 재배치 정보 섹션 (Relocation Information Section)
- 디버깅 정보 섹션 (Debugging information Section)
4. 링킹 단계
- 링커를 통해 오브젝트 파일들을 묶어 실행 파일로 만드는 과정
- 오브젝트 파일들과 라이브러리 파일을 묶는 과정
- 정적링킹 (Static Linking) 과 동적 링킹 (Dynamic Linking) 으로 나뉨
링커의 역할
심볼 해석 (Symbol Resolution)
심볼 참조를 어떠한 심볼 정의에 연관시킬지 결정하는 과정 여러개의 오브젝트파일에 같은 이름의 함수 또는 변수가 정의되어 있을 수 있기 때문
재배치 (Reallocation)
데이터의 주소나 코드의 메모리 참조 주소를 알맞게 배치하는 과정 링커가 컴파일러가 생성한 오브젝트파일을 모아서 하나의 실행파일을 만들 때 각 오브젝트 파일에 있는 데이터의 주소나 코드의 메모리 참조 주소가 링커에 의해 합쳐진 실행 파일에서의 주소와 다르기 때문에 알맞게 수정해줘야함.
이를위해 오브젝트 파일안에 재배치 정보 섹션(Relocation Information Section)이 존재함
링킹을 하기 전 오브젝트 파일을 재배치 가능한 오브젝트 파일, 재배치가 완료된 오브젝트 파일을 실행 가능한 오브젝트 파일이라고 부름
참고
'컴퓨터구조' 카테고리의 다른 글
[컴퓨터구조] - 시스템 버스 (0) | 2024.02.02 |
---|---|
[컴퓨터구조] - 캐시 (0) | 2024.01.24 |
[컴퓨터구조] - CPU 구조 및 연산 동작과정 (0) | 2024.01.24 |
[컴퓨터구조] - 개요 ~ Address mode (0) | 2024.01.22 |