Qaupot Blog
Software Engineering, Trip

104. 컴퓨터와 프로그램 파일

🕐 Sat, 29 Sep 2012 09:00:00 GMT 🕓 Tue, 17 Aug 2021 13:50:00 GMT

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) 의 형태로 프로그램을 실행합니다.

이 블로그는 개인 블로그입니다. 게시글은 오류를 포함하고 있을 수 있지만, 저자는 오류를 해결하기 위해 노력하고 있습니다.
게시글에 별도의 고지가 없는 경우, 크리에이티브 커먼즈 저작자표시-비영리-변경금지 4.0 라이선스를 따릅니다.

This blog is personal blog. published posts may contain some errors, but author doing efforts to clear errors.
If post have not notice of license, it under creative commons Attribution-NonCommercial-NoDerivatives 4.0.