Digital 과 Analogue
우리는 흔히 컴퓨터에서 다루는 데이터를 Digital (디지털) 데이터라고 부릅니다.
컴퓨터에서 다루는 Digital 은 전원의 ON과 OFF 로 표현되는, Binary (2진) 입니다.
그리고 이 데이터는 '순간' 만을 의미합니다.
- 사과가 책상위에 3개 놓여져 있다고 한다면, 이것은 '3개' 라는 정량적 데이터입니다.
Analogue (아날로그) 데이터는 연속된 물리량으로 표현됩니다.
- 사과를 고층 건물에서 떨어뜨리면, 지표면에 부딪힐 때까지 계속해서 떨어질 것이며, 연속된 데이터를 가질 것입니다.
컴퓨터는 계산기다.
Compute (계산하다) 에서 알 수 있는 것처럼 회로를 이용한 고속의 전자 계산기, Digital 정보를 계산하는 장치입니다. 컴퓨터 앞에서 우리가 게임을 하고 문서를 작성하고 음악을 듣는 일련의 작업들은 컴퓨터에게는 계산의 일환일 뿐입니다.
왜 Computer 는 Digital 정보를 가지고 계산을 할까요? Analogue 데이터와 Digital 데이터 중 어느 쪽이 계산에 편리할까요?
사과 3개에 사과 3개가 더해지면 6개를 구하는건 쉽고 그 결과가 명확합니다.
그러나 수식으로 표현된 (혹은 규칙적이지 않아 수식으로 표현하기 조차 힘든) 사과의 위치를 구하는건 쉽지 않을 것입니다.
따라서 Computer 는 Digital 정보를 다루며, 이에 파일 역시 Digital 정보입니다.
그것이 프로그램인지, 텍스트 파일인지, 음악이나 영화 파일인지에 대해 Computer 는 관심이 없으며 단지 Digital 데이터 일 뿐입니다.
폰 노이만 구조(Von Neumann architecture)
현재 사용되고 있는 Computer 는 대부분 존 폰 노이만이 고안한 폰 노이만 구조를 기반으로 합니다.
이러한 폰 노이만 구조의 핵심은 stored program concept 입니다.
3 + 1 = 4라는 계산을 한다고 해 보겠습니다.
사람은 이를 3과 1을 더하므로 4라는 결과값을 쉽게 생각해 낼 수 있습니다.
그러나 컴퓨터는 그렇지 않습니다. 3과 1은 어디서 가져와야 하고, 이게 덧셈이라는 사실은 어떻게 알려줘야 할까요?
이를 stored program concept 에서는 이렇게 정의합니다.
- fetch : 3 + 1이라는 명령어를 가져오기
- decode : 3 + 1을 해석
- execute : 3 + 1을 실행 (4를 만들어 냅니다)
- store : 만들어진 4의 결과값을 저장(출력)
파일(File)이란?
사전적 의미로는 하나의 단위로써 처리할 수 있는 연관성이 있는 자료들의 집합 정도입니다.
컴퓨터에서는 자기 디스크, 테이프, 광학저장장치등에 존재하는 일련의 비트들의 집합이 될 수 있습니다.
파일의 Binary(2진) 값
위의 이미지는 방금 우리가 만들었던 'Hello World' 프로그램을 Hex Editor 로 열어본 모습입니다.
Hex Editor 란, 파일의 Binary 값을 Hex(16진수)의 형태로 보여주는 역활을 하는 프로그램입니다.
여기서는 HxD 라는 무료 Hex Editor 를 사용해 보았습니다.
이어서 메모장에 qaupot.com! 이라고 적은 후 qaupot.txt 파일로 저장해서 그 파일을 Hex Editor 로 열어 보았습니다.
마찬가지로 Binary(2진)데이터가 나열되어 있습니다.
프로그램 파일
우리는 앞선 장에서 'Hello World' 코드를 작성해 보았습니다.
#include <stdio.h>
int main(int argc,char** argv)
{
printf("Hello Worldn");
return 0;
}
그리고 컴파일 과정을 거쳐 기계어로 이루어진, '프로그램' 을 만들어 냈습니다.
그렇다면 텍스트 파일과 프로그램 파일의 차이는 과연 무엇일까요?
결과적으로는 둘 다 파일이고, Binary 데이터이지만, 프로그램 파일의 규격을 만족하는지 차이가 있습니다.
- 텍스트 파일은 텍스트 파일의 규격을 만족하지만, 프로그램 파일의 규격을 만족하지는 않습니다.
- 프로그램 파일은 프로그램 파일로서의 규격을 만족하고, 텍스트 파일로서의 규격 역시 만족합니다.
- 다만, 열었을 때 알아보기 힘든 문자들이 가득 차 있을것입니다.
안타깝게도, 프로그램 파일의 규격은 단일화 되어 있지 않습니다.
- Windows 에서 프로그램을 만들면 PE(Portable Executable)라는 규격에 맞추어 생성됩니다.
- Linux 에서 프로그램을 만들면 ELF(Executable and Linkable Format)라는 규격에 맞추어 생성됩니다.
따라서 이 둘의 응용 프로그램은 사용하는 기계어가 같더라도 binary 상태에서는 호환되지 않습니다.
프로그램
만약 '+' 기호에 덧셈이라는 의미를 붙이지 않았다면, 이것은 특수한 그림 취급일 것입니다.
그러나 '+'라는 기호에 '덧셈' 이라는 의미를 부여하기로 약속함으로써 3 + 1이 무엇을 의미하는지를 파악할 수 있습니다.
Digital 데이터는 결국 연속된 숫자들의 집합입니다.
그리고 이러한 숫자에 특별한 의미를 부여함으로써 우리는 새로운 해석방법을 얻을 수 있게 됩니다.
Binary 6자리로 이루어진 명령어를 디자인 한다고 해 보겠습니다.
앞에서 2자리를 명령, 다음 2자리를 첫번째 변수 x, 다음 2자리를 두번째 변수 y라고 하고 명령을 다음과 같이 정의했습니다.
명령어 | 의미 |
---|---|
00 | + |
01 | - |
10 | * |
11 | / |
- 000101 는 01 + 01 = 10 (2진수)
- 011001 는 10 - 01 = 01 (2진수)
프로그램은 특별한 약속을 따르는 명령 (instruction) 들의 집합입니다. 프로그램 파일은 프로그램을 규격에 맞추어 보관하며, 운영체제 (OS) 는 요청에 따라 프로세스 (Process) 의 형태로 프로그램을 실행합니다.