랑아
article thumbnail

01. 프로그램 언어와 번역

06. 링커(Linker)

1) 링커

  • 번역 프로그램에 의해 번역된 여러 개의 목적 프로그램과 프로그램에서 사용되는 내장 함수(라이브러리, 지원 함수, 지원 프로그램)를 하나로 모아서 실행 가능하도록 프로그램을 생성하는 기능을 하는 것
  • 여러 개의 목적 모듈들을 로드 모듈로 생성해 주는 것
  • 링커는 각각 컴파일된 목적 프로그램들과 라이브러리 프로그램들을 묶어서 로드 모듈이라는 실행 가능한 한 개의 기계어로 통합함
  • 재배치 형태의 기계어로 된 여러 개의 프로그램을 묶어서 로드 모듈을 작성하는 것을 링키지 에디어(Linkage Editor)라고 함

2) SLL(Static Link Library)

  • 하나의 프로그램이 번역될 때 내장 함수가 링크되어 프로그램에 삽입됨
  • 사용자 프로그램과 라이브러리의 연결 작업은 사용자 프로그램이 실행되기 전에 이루어짐
  • 실행 프로그램의 메모리 크기는 커짐
  • 실행 파일 용량이 커지며, 실행 속도가 느림
  • 여러 개의 사용자 프로그램들이 한 개의 라이브러리를 공유할 수 없음
  • SLL은 변경과 갱신이 어려움

3) DLL(Dynamic Link Library)

  • 내장 함수가 하나의 프로그램이 번역될 때에는 링크되지 않고 프로그램이 실행되면서 동적으로 링크됨
  • 사용자 프로그램과 라이브러리의 연결 작업은 사용자 프로그램이 실행된 후 이루어짐
  • 실행 프로그램의 메모리 크기가 작아짐
  • 실행 파일 용량이 적어지며, 실행 속도가 빠름
  • DLL 방식을 사용하면 SLL 방식을 사용할 때보다 메모리와 디스크의 공간을 절약할 수 있음
  • 여러 개의 사용자 프로그램들이 한 개의 라이브러리를 공유할 수 있음
  • DLL의 변경과 갱신은 SLL의 변경과 갱신보다 용이함

4) 라이브러리(Library)

  1. 라이브러리의 개념
    • 도서관처럼, 필요할 때 찾아서 쓸 수 있도록 모듈화되어 제공되는 부품화된 프로그램
    • 일반적으로 내장 함수, 지원 함수, 지원 프로그램 등을 말함
  2. 라이브러리의 구성
    • 라이브러리는 도움말, 설치 파일, 샘플 코드 등으로 구성됨
    • 도움말 : 라이브러리를 사용할 수 있도록 하는 도움말 문서
    • 설치 파일 : 라이브러리를 적용하기 위해 제공되는 설치 파일
    • 샘플 코드 : 라이브러리를 이해하고 손쉽게 적용하기 위해 제공되는 샘플 원시 코드
  3. 표준 라이브러리
    • 프로그래밍 언어가 기본적으로 가지고 있는 라이브러리를 의미함
    • 각 프로그래밍 언어의 표준 라이브러리는 여러 종류의 모듈과 패키지를 가지며, 표준 라이브러리를 이용하면 별도의 파일 설치 없이 사용할 수 있음
  4. 외부 라이브러리
    • 표준 라이브러리와 달리 별도의 파일을 설치해야 함
    • 누구나 개발하여 설치할 수 있으며, 인터넷 등을 이용하여 공유할 수도 있음
  5. 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) 로더의 일반적인 기능

  1. 할당(Allocation)
    • 실행 프로그램을 실행시키기 위해 주기억 장치 내에 옮겨 놓을 공간을 확보하는 기능
    • 여러 개의 분할된 주기억 장치의 한 영역을 할당받음
    • 하나의 물리적인 주기억 장치는 여러 개의 프로그램을 실행하기 위해 논리적으로 분할하여 사용하게 됨
    • 실행 전에 분할된 영역의 한 영역을 사용할 수 있도록 로더는 운영체제에서 할당을 받아야 함
    • 적재할 공간이 없을 경우에는 주기억 장치를 할당 받을 수 없으며 다른 프로그램이 종료될 때까지 기다려야 함
  2. 연결(Linking)
    • 두 개 이상의 목적 프로그램을 연결함
    • 여러 개의 목적 프로그램을 하나의 프로그램 내에서 실행시키기 위해 연결하는 기능
    • 하나의 프로그램은 여러 개의 파일로 분할되어 존재하게 되며, 분할된 파일들을 하나의 프로그램에서 동작될 수 있도록 로더는 연결 정보를 가지고 있어야 함
    • 주기억 장치에 적재할 프로그램의 위치가 정해졌으면 여러 개로 분할된 목적 프로그램들의 연결 정보를 링크 에디터에 기록함
    • 여러 개로 분할된 목적 프로그램 중 메인 목적 프로그램이 나머지 목적 프로그램의 연결 정보를 갖게 됨
      • 메인 목적 프로그램 : 하나의 프로그램은 하나의 파일로 구성되어 있지 않고 여러 개의 프로그램 파일로 구성되어 있다고 할 때, 그 중 여러 개의 프로그램 파일을 통제하고 연결시키는 중요한 프로그램
    • 두 개 이상의 목적 프로그램(목적 파일)을 합쳐서 실행 가능한 프로그램으로 만듦
  3. 재배치(Relocation)
    • 디스크 등의 보조 기억 장치에 저장된 프로그램이 사용하는 각 주소를 할당된 기억 장소의 실제 주소로 배치시키는 기능
    • 제한된 주기억 장치의 공간을 효율적으로 사용하기 위해 이미 적재된 프로그램이 다른 공간으로 이동하는 경우의 정보로 로더가 관리해야 함
    • 실행 프로그램이 주기억 장치 내에 위치가 변경될 때 변경 정보를 관리하는 기능
    • 주기억 장치의 특정 위치에 있는 프로그램은 컴퓨터의 효율적인 사용을 위해 위치를 변경하게 되는데, 로더는 이러한 변경 정보를 가지고 있어야 함
  4. 적재(Loader)
    • 기계어로 번역된 목적 프로그램을 실행하기 위해 주기억 장치로 적재하는 기능
    • 로드 모듈을 주기억 장치로 읽음
    • 기계어 명령을 기억 장치에 적재함
    • 할당, 연결, 재배치 정보를 준비한 후에 보조 기억 장치에 있는 프로그램 파일이 주기억 장치로 적재됨
    • 프로그램을 실행하기 위하여 프로그램을 보조 기억 장치로부터 컴퓨터의 주기억 장치에 올려놓음

3) 로더의 종류

  1. Compile-and-go 로더
    • 번역 프로그램(어셈블러, 컴파일러)과 로더가 하나로 구성된 로더
    • 프로그램 실행 시에 매번 컴파일을 해야 함
    • 프로그램을 배포할 경우에는 원시 프로그램을 공개해야 하는 단점이 있음
  2. 직접 연결 로더(Direct-Linking Loader, 재배치 로더)
    • 현재 사용 중인 가장 일반적인 로더
    • 할당, 연결, 재배치, 적재를 모두 수행하는 로더
  3. 동적(Dynamic) 로더
    • 프로그램을 한꺼번에 적재하는 것이 아니라 실행할 때 필요한 부분만을 차례로 적재하거나 교체하면서 적재하는 방식
    • 주기억 장치가 디스크 프로그램 파일의 크기보다 작은 경우, 주기억 장치에 모두 적재할 수 없기 때문에, 프로그램 파일을 여러 개로 분할하여 주기억 장치 크기에 맞게 여러 번 적재하게 되는데, 이를 동적 로더라고 함
    • 분할된 프로그램을 순차적으로 적재하여 실행하면 오버레이(Overlay), 교체하면서 실행하면 스와핑(Swapping)이라고 함
  4. 절대 로더(Absolute Loader)
    • 과거에 사용했던 방식으로 주기억 장치의 할당과 목적 프로그램의 연결은 직접 프로그래머가 당담함
    • 절대 로더의 수행 주체
      • 할당 : 프로그래머가 직접 함
      • 연결 : 프로그래머가 직접 함
      • 재배치 : 어셈블러의 지원을 받음
      • 적재 : 로더가 함



08. 컴파일러(Compiler)

1) 컴파일러 단계

  • 컴파일러는 원시 프로그램을 입력 받아 최종 목적 프로그램을 생성함
  1. 어휘 분석(Lexical Analysis)
  2. 구문 분석(Syntax Analysis)
  3. 의미 분석(Semantic Analysis)
  4. 중간 코드 생성
  5. 코드 최적화(Code Optimization)
  6. 코드 생성(Code Generation)

2) 어휘 분석(Lexical Analysis)

  1. 어휘 분석 작업
    • 원시 프로그램을 하나의 긴 문자열로 보고 문자를 스캐닝하여 문법적으로 의미 있는 단위로 분할해 내는 것
    • 원시 프로그램을 읽어 들여, 토큰(Token)이라는 문법적 단위로 분석함
  2. 어휘 분석의 특징
    • 번역의 가장 기본적인 단계로 나열된 문자들을 식별자, 구분 문자, 연산 기호, 핵심어, 주석 등으로 그룹화하는 단계
    • 주된 역할은 토큰을 생성하는 것
    • 어휘 분석은 일반적으로 파서(Parser)가 파스 트리를 형성해 나가는 과정에서 새로운 토큰을 요구하면 원시 프로그램을 문자 단위로 읽어 토큰을 생성하여 파서에게 주는 방식으로 구성됨
      • 파서(Parser) : 어휘 분석 다음 단계인 구문 분석에서 문법적인 오류를 찾기 위해 파스 트리를 만드는 프로그램
    • 어휘 분석기는 스캐너(Scanner)라고도 불림
    • 프로그래머가 프로그램의 설명을 위해 쓴 주석(Comment)은 어휘 분석기에서 모두 처리됨

3) 구문 분석(Syntax Analysis)

  1. 구분 분석 작업
    • 프로그램 수식 확인
    • 후위(Postfix) 형식 변환
    • 문법 오류 확인(Stack 메모리 사용)
  2. 구문 분석의 특징
    • 주어진 문장이 정의된 문법 구조에 따라 정당하게 하나의 문장으로써 합법적으로 사용될 수 있는가를 확인하는 작업으로 토큰들을 문법에 따라 분석하는 작업을 수행하는 단계
    • 구문 분석 단계의 주요 역할은 프로그램이 주어진 문법에 맞는 가를 검사하여 옳으면 중간 코드를 생성하게 하고 옳지 않을 경우 오류 메시지를 출력하는 것
    • 구문 분석기는 그 결과물로써 파스 트리(Parse-tree)를 생성함

4) 의미 분석(Semantic Analysis)

  1. 의미 분석 작업
    • 구문 트리를 보고 어떠한 의미와 기능을 하는지 분석하여 기능이 올바르게 수행될 수 있도록 환경을 조성하는 단계
  2. 의미 분석의 특징
    • 의미 분석의 조요 역할인 자료형 검사를 함
    • 실수가 배열의 첨자로 사용되어 검사, 정수의 실수 혼합 연산을 허용할 경우 정수를 실수로 바꾸어 주는 형 변환 작업을 수행함
    • 매크로를 처리함
    • Symbol 테이블을 유지함
profile

랑아

@RangA

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!