ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [컴퓨터 시스템] 1. 프로그램이 실행되는 과정
    컴퓨터 구조 2020. 12. 29. 01:53

    프로그램은 다른 프로그램에 의해 다른 형태로 번역된다.

     

    hello 프로그램이 실행되고, hello를 출력하기 까지 어떤 과정을 거치는지 알아보자.

     

    hello 프로그램은 우리가 이해할 수 있는 형태의 고급 C 프로그램으로 일생을 시작한다. 하지만, 이 프로그램이 시스템에서 실행되려면, 저급 기계어 인스트럭션(명령어 집합)들로 번역되어야 한다.

     

    linux> gcc -o hello hello.c

     

    GCC 컴파일러 드라이버는 소스파일 hello.c를 읽어서 실행파일인 hello로 번역한다.

    이 과정은 Pre-processor, Compiler, Assembler 그리고 Linker를 통해 일어난다. 이들을 합쳐서 컴파일 시스템이라고 부른다.

     

     

    Compile system

    Preprocessor 

    Preprocessor는 본래의 C 프로그램을 #문자로 시작하는 디렉티브에 따라 수정한다. hello.c 파일 첫 줄의 #include<stdio.h>는 전처리기에게 시스템 헤더파일인 stdio.h를 프로그램 문장에 직접 삽입하라고 지시한다. 그 결과 hello.i라는 새로은 C프로그램이 생성된다.

     

    Compiler

    컴파일러는 텍스트파일인 hello.i를 어셈블리어로 번역해 다른 텍스트 파일인 hello.s를 생성한다.

     

    어셈블리어는 기계어와 일대일 대응이 되는 컴퓨터 프로그래밍의 저급 언어이다.
    기계어는 실제로 컴퓨터의 CPU가 읽어서 실행할  수 있는 0과 1로 이루어진 명령어의 조합이다. 이 명령어들을 사람이 알아보기 쉽게 mnemonic symbol을 정해 사람이 쉽게 컴퓨터의 행동을 제어할 수 있도록 한 것이 어셈블리 언어이다.

    아래의 코드는 hello를 출력하는 어셈블리어로 구현한 프로그램이다.

    adosseg
    .model small
    .stack 100h
    
    .data
    hello_message db 'hello',0dh,0ah,'$'
    
    .code
    main proc
          mov    ax, @data
          mov    ds, ax
    
          mov    ah, 9
          mov    dx, offset hello_message
          int    21h
    
          mov    ax, 4C00h
          int    21h
    main endp
    end main

     

    Assembler

    Assembler는 어셈블리어로 이루어진 hello.s를 기계어 인스트럭션으로 번역하고, 이들을 목적 프로그램으로 묶어서 hello.o라는 목적 파일에 결과를 저장한다. 기본 컴퓨터 명령어들을 CPU가 기본 연산을 수행하는데 사용할  수 있는 비트 패턴으로 변환시키는 프로그램이다.

     

    Linker

    컴파일러가 만들어낸 하나 이상의 목적 파일을 가져와 이를 단일 실행 프로그램으로 병합하는 프로그램이다.

    hello를 호출하기 위해서는 printf함수가 필요한데, printf함수는 이미 컴파일된 별도의 목적파일인 printf.o에 들어있다. 이들을 링커가 hello.o파일과 통합시켜 하나의 실행가능 목적파일을 만들게 된다. 이 목적파일은 메모리에 적재되어 시스템에 의해 실행된다.

    오브젝트 파일 및 라이브러리 파일에 대한 링킹(통합)역할을 한다.

     

     

    해당 포스팅은 [컴퓨터 시스템-David R. O'Hallaron]을 바탕으로 작성되었습니다.

    '컴퓨터 구조' 카테고리의 다른 글

    B-Tree - intro  (1) 2021.01.11
    단순 연결 리스트  (0) 2021.01.10
    C - Pointer  (0) 2021.01.08
    ./Missing Semester - 셸(Shell) 스크립팅  (0) 2021.01.05
    ./Missing Semester - 수업 개요 + shell  (0) 2021.01.04
Designed by Tistory.