01. 프로그램 언어와 번역
06. 링커(Linker)
1) 링커
- 번역 프로그램에 의해 번역된 여러 개의 목적 프로그램과 프로그램에서 사용되는 내장 함수(라이브러리, 지원 함수, 지원 프로그램)를 하나로 모아서 실행 가능하도록 프로그램을 생성하는 기능을 하는 것
- 여러 개의 목적 모듈들을 로드 모듈로 생성해 주는 것
- 링커는 각각 컴파일된 목적 프로그램들과 라이브러리 프로그램들을 묶어서 로드 모듈이라는 실행 가능한 한 개의 기계어로 통합함
- 재배치 형태의 기계어로 된 여러 개의 프로그램을 묶어서 로드 모듈을 작성하는 것을 링키지 에디어(Linkage Editor)라고 함
2) SLL(Static Link Library)
- 하나의 프로그램이 번역될 때 내장 함수가 링크되어 프로그램에 삽입됨
- 사용자 프로그램과 라이브러리의 연결 작업은 사용자 프로그램이 실행되기 전에 이루어짐
- 실행 프로그램의 메모리 크기는 커짐
- 실행 파일 용량이 커지며, 실행 속도가 느림
- 여러 개의 사용자 프로그램들이 한 개의 라이브러리를 공유할 수 없음
- SLL은 변경과 갱신이 어려움
3) DLL(Dynamic Link Library)
- 내장 함수가 하나의 프로그램이 번역될 때에는 링크되지 않고 프로그램이 실행되면서 동적으로 링크됨
- 사용자 프로그램과 라이브러리의 연결 작업은 사용자 프로그램이 실행된 후 이루어짐
- 실행 프로그램의 메모리 크기가 작아짐
- 실행 파일 용량이 적어지며, 실행 속도가 빠름
- DLL 방식을 사용하면 SLL 방식을 사용할 때보다 메모리와 디스크의 공간을 절약할 수 있음
- 여러 개의 사용자 프로그램들이 한 개의 라이브러리를 공유할 수 있음
- DLL의 변경과 갱신은 SLL의 변경과 갱신보다 용이함
4) 라이브러리(Library)
- 라이브러리의 개념
- 도서관처럼, 필요할 때 찾아서 쓸 수 있도록 모듈화되어 제공되는 부품화된 프로그램
- 일반적으로 내장 함수, 지원 함수, 지원 프로그램 등을 말함
- 라이브러리의 구성
- 라이브러리는 도움말, 설치 파일, 샘플 코드 등으로 구성됨
- 도움말 : 라이브러리를 사용할 수 있도록 하는 도움말 문서
- 설치 파일 : 라이브러리를 적용하기 위해 제공되는 설치 파일
- 샘플 코드 : 라이브러리를 이해하고 손쉽게 적용하기 위해 제공되는 샘플 원시 코드
- 표준 라이브러리
- 프로그래밍 언어가 기본적으로 가지고 있는 라이브러리를 의미함
- 각 프로그래밍 언어의 표준 라이브러리는 여러 종류의 모듈과 패키지를 가지며, 표준 라이브러리를 이용하면 별도의 파일 설치 없이 사용할 수 있음
- 외부 라이브러리
- 표준 라이브러리와 달리 별도의 파일을 설치해야 함
- 누구나 개발하여 설치할 수 있으며, 인터넷 등을 이용하여 공유할 수도 있음
- C언어의 대표적인 라이브러리
헤더 파일 | 용도 |
---|---|
stdio.h | 표준 입출력에 사용되는 함수, scanf, printf 등 |
string.h | 문자열 처리에 사용되는 함수, strlen, strcpy 등 |
math.h | 수학 함수, sqrt, abs 등 |
stdlib.h | 자료형 변환, 난수, 메모리 할당 함수, atoi, rand, malloc 등 |
time.h | 시간 처리 함수, time, clock 등 |
07. 로더(Loader)
1) 좁은 의미의 로더
기계어로 번역된 목적 프로그램을 실행하기 위해 주기억 장치로 적재되는 것
프로그램을 실행하기 위하여 프로그램을 보조 기억 장치로부터 컴퓨터의 주기억 장치에 올려놓음
좁은 의미의 로더
- 프로그램을 주기억 장치에 적재하는 자체만을 말함
넓은 의미의 로더
- 할당, 연결, 재배치, 적재를 모두 포함한 로더를 말하며 로더의 일반적인 기능이라고 함
- 반드시 할당 -> 연결 -> 재배치 -> 적재 순으로 진행함
2) 로더의 일반적인 기능
- 할당(Allocation)
- 실행 프로그램을 실행시키기 위해 주기억 장치 내에 옮겨 놓을 공간을 확보하는 기능
- 여러 개의 분할된 주기억 장치의 한 영역을 할당받음
- 하나의 물리적인 주기억 장치는 여러 개의 프로그램을 실행하기 위해 논리적으로 분할하여 사용하게 됨
- 실행 전에 분할된 영역의 한 영역을 사용할 수 있도록 로더는 운영체제에서 할당을 받아야 함
- 적재할 공간이 없을 경우에는 주기억 장치를 할당 받을 수 없으며 다른 프로그램이 종료될 때까지 기다려야 함
- 연결(Linking)
- 두 개 이상의 목적 프로그램을 연결함
- 여러 개의 목적 프로그램을 하나의 프로그램 내에서 실행시키기 위해 연결하는 기능
- 하나의 프로그램은 여러 개의 파일로 분할되어 존재하게 되며, 분할된 파일들을 하나의 프로그램에서 동작될 수 있도록 로더는 연결 정보를 가지고 있어야 함
- 주기억 장치에 적재할 프로그램의 위치가 정해졌으면 여러 개로 분할된 목적 프로그램들의 연결 정보를 링크 에디터에 기록함
- 여러 개로 분할된 목적 프로그램 중 메인 목적 프로그램이 나머지 목적 프로그램의 연결 정보를 갖게 됨
- 메인 목적 프로그램 : 하나의 프로그램은 하나의 파일로 구성되어 있지 않고 여러 개의 프로그램 파일로 구성되어 있다고 할 때, 그 중 여러 개의 프로그램 파일을 통제하고 연결시키는 중요한 프로그램
- 두 개 이상의 목적 프로그램(목적 파일)을 합쳐서 실행 가능한 프로그램으로 만듦
- 재배치(Relocation)
- 디스크 등의 보조 기억 장치에 저장된 프로그램이 사용하는 각 주소를 할당된 기억 장소의 실제 주소로 배치시키는 기능
- 제한된 주기억 장치의 공간을 효율적으로 사용하기 위해 이미 적재된 프로그램이 다른 공간으로 이동하는 경우의 정보로 로더가 관리해야 함
- 실행 프로그램이 주기억 장치 내에 위치가 변경될 때 변경 정보를 관리하는 기능
- 주기억 장치의 특정 위치에 있는 프로그램은 컴퓨터의 효율적인 사용을 위해 위치를 변경하게 되는데, 로더는 이러한 변경 정보를 가지고 있어야 함
- 적재(Loader)
- 기계어로 번역된 목적 프로그램을 실행하기 위해 주기억 장치로 적재하는 기능
- 로드 모듈을 주기억 장치로 읽음
- 기계어 명령을 기억 장치에 적재함
- 할당, 연결, 재배치 정보를 준비한 후에 보조 기억 장치에 있는 프로그램 파일이 주기억 장치로 적재됨
- 프로그램을 실행하기 위하여 프로그램을 보조 기억 장치로부터 컴퓨터의 주기억 장치에 올려놓음
3) 로더의 종류
- Compile-and-go 로더
- 번역 프로그램(어셈블러, 컴파일러)과 로더가 하나로 구성된 로더
- 프로그램 실행 시에 매번 컴파일을 해야 함
- 프로그램을 배포할 경우에는 원시 프로그램을 공개해야 하는 단점이 있음
- 직접 연결 로더(Direct-Linking Loader, 재배치 로더)
- 현재 사용 중인 가장 일반적인 로더
- 할당, 연결, 재배치, 적재를 모두 수행하는 로더
- 동적(Dynamic) 로더
- 프로그램을 한꺼번에 적재하는 것이 아니라 실행할 때 필요한 부분만을 차례로 적재하거나 교체하면서 적재하는 방식
- 주기억 장치가 디스크 프로그램 파일의 크기보다 작은 경우, 주기억 장치에 모두 적재할 수 없기 때문에, 프로그램 파일을 여러 개로 분할하여 주기억 장치 크기에 맞게 여러 번 적재하게 되는데, 이를 동적 로더라고 함
- 분할된 프로그램을 순차적으로 적재하여 실행하면 오버레이(Overlay), 교체하면서 실행하면 스와핑(Swapping)이라고 함
- 절대 로더(Absolute Loader)
- 과거에 사용했던 방식으로 주기억 장치의 할당과 목적 프로그램의 연결은 직접 프로그래머가 당담함
- 절대 로더의 수행 주체
- 할당 : 프로그래머가 직접 함
- 연결 : 프로그래머가 직접 함
- 재배치 : 어셈블러의 지원을 받음
- 적재 : 로더가 함
08. 컴파일러(Compiler)
1) 컴파일러 단계
- 컴파일러는 원시 프로그램을 입력 받아 최종 목적 프로그램을 생성함
- 어휘 분석(Lexical Analysis)
- 구문 분석(Syntax Analysis)
- 의미 분석(Semantic Analysis)
- 중간 코드 생성
- 코드 최적화(Code Optimization)
- 코드 생성(Code Generation)
2) 어휘 분석(Lexical Analysis)
- 어휘 분석 작업
- 원시 프로그램을 하나의 긴 문자열로 보고 문자를 스캐닝하여 문법적으로 의미 있는 단위로 분할해 내는 것
- 원시 프로그램을 읽어 들여, 토큰(Token)이라는 문법적 단위로 분석함
- 어휘 분석의 특징
- 번역의 가장 기본적인 단계로 나열된 문자들을 식별자, 구분 문자, 연산 기호, 핵심어, 주석 등으로 그룹화하는 단계
- 주된 역할은 토큰을 생성하는 것
- 어휘 분석은 일반적으로 파서(Parser)가 파스 트리를 형성해 나가는 과정에서 새로운 토큰을 요구하면 원시 프로그램을 문자 단위로 읽어 토큰을 생성하여 파서에게 주는 방식으로 구성됨
- 파서(Parser) : 어휘 분석 다음 단계인 구문 분석에서 문법적인 오류를 찾기 위해 파스 트리를 만드는 프로그램
- 어휘 분석기는 스캐너(Scanner)라고도 불림
- 프로그래머가 프로그램의 설명을 위해 쓴 주석(Comment)은 어휘 분석기에서 모두 처리됨
3) 구문 분석(Syntax Analysis)
- 구분 분석 작업
- 프로그램 수식 확인
- 후위(Postfix) 형식 변환
- 문법 오류 확인(Stack 메모리 사용)
- 구문 분석의 특징
- 주어진 문장이 정의된 문법 구조에 따라 정당하게 하나의 문장으로써 합법적으로 사용될 수 있는가를 확인하는 작업으로 토큰들을 문법에 따라 분석하는 작업을 수행하는 단계
- 구문 분석 단계의 주요 역할은 프로그램이 주어진 문법에 맞는 가를 검사하여 옳으면 중간 코드를 생성하게 하고 옳지 않을 경우 오류 메시지를 출력하는 것
- 구문 분석기는 그 결과물로써 파스 트리(Parse-tree)를 생성함
4) 의미 분석(Semantic Analysis)
- 의미 분석 작업
- 구문 트리를 보고 어떠한 의미와 기능을 하는지 분석하여 기능이 올바르게 수행될 수 있도록 환경을 조성하는 단계
- 의미 분석의 특징
- 의미 분석의 조요 역할인 자료형 검사를 함
- 실수가 배열의 첨자로 사용되어 검사, 정수의 실수 혼합 연산을 허용할 경우 정수를 실수로 바꾸어 주는 형 변환 작업을 수행함
- 매크로를 처리함
- Symbol 테이블을 유지함
'정보처리기사 > 프로그래밍 언어 활용' 카테고리의 다른 글
프로그래밍 언어 활용 3 (0) | 2023.05.29 |
---|---|
프로그래밍 언어 활용 2 (0) | 2023.05.29 |
프로그래밍 언어 활용 1 (0) | 2023.05.29 |
프로그래밍 언어 기초 3 (0) | 2023.05.29 |
프로그래밍 언어 기초 1 (0) | 2023.05.29 |