ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로그램은 컴퓨터에서 어떻게 동작하는것일까?
    Computer Science/Computer Architecture and Organization 2021. 3. 14. 14:03

    애플리케이션, 운영체제, 컴파일러 그리고 하드웨어

     

    MS 프로그램, 컴퓨터 게임, 혹은 데이터베이스는 수만 - 수억 개 라인의 코드로 되어있을 것이고, 또한 다른 수준 높은 소프트웨어 라이브러리를 사용하고 있을 것이다. 하지만, 하드웨어는 아주 간단한 동작만 할 수 있다. 지난번 포스트에서 봤듯, 결국에 circuit 은 아주 단순하다. 컴퓨터는 1 그리고 0으로 이루어져 있다. 도데체 아주 복잡한 애플리케이션이 어떤 방식으로 간단한 명령으로 변하는 것일까? 상상만으로는 이해하기 쉽지 않다.

     

    복잡한 프로그램에서 간단한 명령까지, 몇가지 계층(layer)의 소프트웨어가 있고, 그것들은 복잡한 동작/코드들을 이해하고 더 쉬운 언어로 변화시켜서 더 아래의 레이어에 전달한다. 아래 이미지에서 보듯, 애플리케이션들은 가장 바깥쪽에 있고, 다양한 종류의 Systems software는 Applications와 Hardware 사이에 위치해있다. 다양한 Systems software들이 있지만, 두 가지의 타입으로 나눌 수 있다: Operating System & Compiler. 

    A simplified view of hardware and software as hierarchical layers.

    운영체제 (Operating System) 

    OS 라고도 불리는 운영체제는 사용자의 프로그램과 하드웨어 사이에서 다양한 서비스를 제공하면서 아래와 같은 다양한 함수나 명령어를 관리감독한다.

    • 기본적인 인풋, 아웃풋(I/O)을 관리한다.
    • 스토리지와 메모리를 할당한다.
    • 동시에 여러 가지의 애플리케이션을 구동할 때, 컴퓨터를 안정적으로 사용할 수 있도록 한다. 

     

    컴파일러 (Compilers)

    직역하면 편집자이다. 운영체제와는 다른 역할을 하는 꼭 필요한 존재이다. 보통 필자와 같은 개발자는 high-level의 프로그램 언어를 사용해서 코딩을 한다. 예를 들면, Python, C, C++, Java, Kotlin과 같은 언어를 이용하는데, 컴파일러는 이런 언어로 완성된 코드를 하드웨어가 알아듣고 동작할 수 있는 명령으로 변화시킨다.

     

    종합하자면, 우리가 사용하는 애플리케이션은 너무 수준 높은(?) 말들을 하고 있어서 그것을 번역해서 하드웨어에 말해 줄 역할이 필요하다. 그것을 운영체제 또는 컴파일러가 해준다.

     

    High-level 언어부터 하드웨어의 언어까지

    그렇다면, 실제로 어떤 방식으로 우리가 애플리케이션을 동작시켰을 때, 하드웨어에 전달되는 것일까? 

     

    하드웨어와 소통을 하기 위해서는 전자 신호를 보내야 한다. 이 신호는 아주 간단해야 한다. 컴퓨터가 가장 알아듣기 쉬운 1(on) and 0(off)의 신호로. 컴퓨터에겐 단 2개의 알파벳이 있는 것이다. 우리가 한글 자음 모음을 이용해 마음껏 쓸 수 있는 것처럼, 컴퓨터 또한 수많은 1과 0을 받아서 명령을 수행한다.  컴퓨터가 사용하는 이 레터를 우리는 바이너리 디짓(binary digit) 또는 비트(bit)라고 한다. 컴퓨터는 우리의 명령을 수행하는 노예(영어로는 Slave라고 표현하는데 맞는 단어를 찾기 힘들었다)이며, 이 명령들을 insturunction이라고 한다. 예를 들면 아래와 같다. 아래는 두 숫자를 더하라는 명령이다.

    1000110010100000

    참고: 사람들마다 같은 것들을 두고 다른 단어를 사용해서 말한다. 0과 1로 나타내는 binary digits은 bits, machine language 등의 여러 이름이 있다.

     

     

    최초의 개발자들은 컴퓨터와 이런 binary number들로 대화했다. 하지만 이 방식은 보기에도 매우 어려웠고, 곧 많은 개척자들이 assember라는 것을 개발한다. assembler는 이런 binary number를 심벌을 이용해서 볼 수 있는 방식이다. 예를 들자면, 프로그래머가 두 숫자를 더하고 싶었다고 한다면, 아래와 같은 코드를 쓴다. 아래와 같은 언어를 assembly language라고 한다.

    add A, B

    그 후, assembler는 아래와 같이 번역해준다. 아래와 같은 언어를 machine language라고 한다.

    1000110010100000

    이 instruction은 컴퓨터에게 A와 B를 더하도록 명령한다.

     

     

    Binary Language 보다 훨씬 이해하기도 쉽고 읽고 쓰는 게 효율적이 이었던 assembly language도 사실 가장 최적의 방법은 아니었다. 개발자들은 한 줄에 단 하나의 명령어만 쓸 수 있었고, 개발자를 정말로 컴퓨터처럼 생각하게끔 만들기 때문이었다. 

    "더해,, 1, 2,,,"
    
    "곱해,,, 방금 더한것,,, 3으로,,,"
    
    "곱한것,,, 1을 빼줘,,,"

     

    1과 2를 더해서 3으로 곱한 다음 그 값에서 1을 빼주라는 '명령'을 최소 3번에 나눠서 써줘야 하는 번거로움이 있었다.

     

    그러한 불편함을 해소하기 위에 탄생한 강력한 프로그램 언어들이 바로 high-level programming language이다. 이것이 바로 대부분의 개발자들이 사용하는 C, C++, Java, Python과 같은 언어이다. 아래 그림은 C 언어가 Compiler를 통해서 Assembly language가 되고, 그것이 Assembler를 통해 최종적으로 하드웨어, 즉 컴퓨터가 알아들을 수 있는 언어인 Binary machine language로 되는 과정을 보여준다.

     

     

    C program compiled into assembly language and then assembled into binary machine language

     

    다시 말해, 컴파일러는 아래와 같은 high-level language를

    A + B

    아래와 같은 assembly language로 변환하고

    add A, B

    최종적으로 아래와 같이 binary digits으로 되어있는 machine language로 번역해서 컴퓨터가 알아들을 수 있게끔 한다.

    1000110010100000

     

    High-level Language

    assembly 또는 machine 언어에 비해 High-level 언어는 수많은 장점이 있다. 기존의 두 언어보다, 자연스럽고, 영어 언어와 수학적 기호를 이용해서 우리가 실제 사용하는 언어와 같이 쓸 수 있기 때문에 훨씬 편리하다. 또한, 각 프로그래밍 언어마다 목적에 맞게 쓰일 수 있다. Fortran이라는 언어는 과학적인 컴퓨터 계산을 위해 탄생했고, Cobol은 비즈니스 테이터 처리를 위해, Lisp는 symbol manipulation을 위해 탄생되었다. 게다가, 읽기 쉽고 쓰기 쉬운 high-level 언어들 덕분에 개발자들의 생산량 또한 크게 증가했다. 어떠한 아이디어나 동작을 코딩할 때 기존보다 훨씬 적은 라인(줄 숫자)을 사용해서 개발을 할 수 있기 때문이다. 게다가 컴퓨터에 독립적이기 때문에, 어떠한 컴퓨터에서 개발했더라도, 컴파일러와 어셈 플러를 이용해 binary instructions로 만들어 컴퓨터에 전달해줄 수 있다. 이 부분은 처음 이러한 내용에 접해보는 사람에게는 어렵게 느껴질 수도 있다. 이해가 안 되었다면 중요한 것은 이것이다. 시대에 따라 컴퓨터 언어는 발전되어 왔고, 현대 개발자들이 사용하는 high-level 언어는 기존의 assembly나 machine language보다 유용하게 쓰인다.

     

     

     

    참고문헌

    David A. Patterson and John L. Hennessy. 2013. Computer Organization and Design, Fifth Edition: The Hardware/Software Interface (5th. ed.). Morgan Kaufmann Publishers Inc., San Francisco, CA, USA.

    댓글

Designed by Tistory.