-
프로그램은 컴퓨터에서 어떻게 동작하는것일까?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.
'Computer Science > Computer Architecture and Organization' 카테고리의 다른 글
Processors and Memory (0) 2021.03.21 아이패드를 해부해보자 (사진으로만) (0) 2021.03.17 컴퓨터 구조와 장치, 그리고 Pixel (0) 2021.03.16 컴퓨터 아키텍처를 발전시킨 위대한 아이디어: 무어의 법칙 (0) 2021.03.14 컴퓨터의 종류: PC, Server, Supercomputer and Embedded Computers 그리고... (0) 2021.03.11