본문 바로가기

컴퓨터구조

1.2 컴퓨터에서의 정보의 표현과 저장

정보란 무엇일까?

우린 "정보"란 단어를 정의 할 필요가 있다. 네이버에 당장 컴퓨터만 검색하더라도 수많은 블로그, 동영상, 사진들이 있을 것이다. 하지만 이 모든게 "정보"는 아니다. 수많은 자료(Data)중 우리가 필요로 하는 것이 정보(Information)이다.

똑같은 방법으로 우리가 컴퓨터로 소통하는 방법이 아주 다양하게 있겠지만 컴퓨터가 수용가능한 방법은 이진수가 있다. 컴퓨터가 사용하는 정보는 비트(1과 0)으로 이루어져 있으며, 그중 크게 분류되는 것은 프로그램 코드와 데이터가 있다.

우리가 코딩을 한다하면 처음으로 배우게 되는 C, Python은 모두 우리가 이해하기 쉬운 알파벳으로 이루어져 있지만, 이것이 컴퓨터가 사용하는 정보(비트)가 아니다. 컴퓨터는 비트들로 이루어져있는 코드, 프로그램 코드와 컴퓨터가 이해할수 있는 이진수 데이터가 있어야 앞에서 이야기한 "읽고, 처리하고, 출력하고"를 수행할 수 있을 것이다.

 

C로 코딩을 시도한다 하자. 우리는 알파벳을 이용해 코드를 작성하고 실행시킨다.

 

대충 작성한 hello world

 

인간의 관점에서 보았을때는 컴퓨터가 즉각 알파벳을 해석하여서 작성된 구문을 따른다고 생각할 수 있지만, 사실은 다르다. 컴퓨터는 굉장히 복잡한 구성품으로 이루어져있고 그 구성품을 완전한 통제를 하기 위해서는 컴퓨터가 이해할수 있는 언어를 주입해야한다. 컴퓨터가 이해할수 있는 언어는 굉장히 단순하다. 그 언어는 기계어라고 하며 이 언어는 알파벳과 1:1로 매칭이되는게 아니라 컴파일러라는 소프트웨어에 의해 기계어로 번역되게 된다. 

 

자주보게될 컴파일러의 디자인(출처: 위키피디아)

 

쉽게 설명하자면 한국인, 중국인, 일본인, 미국인, 러시아인 등등 모든 인구가 모여 사는 동네가 있다고 이야기 했을때, 한국인인 내가 한국어로 다른 나라의 사람에게 이야기 한다고 가정하면 러시아어를 하는 사람은 내 이야기를 못알아들을 것이다. 하지만 통역가가 있다면 나의 이야기를 이해할수 있게 된다. 여기서 통역가의 역할이 컴퓨터 언어의 컴파일러(Compiler)가 되겠다. 

 

사용자가 입력하는 고급언어인 C, Python에서 컴퓨터가 이해할 수 있는 비트로 이루어진 기계어로 변경되려면 컴파일러만 필요한 것이 아니다. CPU는 다양한 회사에서 생산하고 그에 따른 구조도 다르다. AMD, Intel에서 생산하는 X86_64구조와 모바일 기기에서 이용하는 ARM구조는 전력의 소모와 명령어의 크기로 인해 구조가 전혀 다르기 때문에 CPU가 사용하는 기계어도 전혀 다르다. 따라서 구조에 맞추기 위해 조립(Assemble)하는 소프트웨어가 필요한데 그것이 바로 어셈블러(Assembler)이다. 어셈블리 언어는 앞서 말한것과 같이 컴퓨터 구조마다 다르게 되고 어셈블리 프로그램이 고급언어의 코드와 기계어의 중간 언어인 어셈블리 언어로 변환한다.

 

크게 생각하면 이렇게 동작한다. 

  1. 사용자가 C, Python과 같은 고급언어로 프로그램을 작성한다.
    이 코드는 간단하게 기억장치에 저장되어 있는 A와 B를 더하고 C에 값을 저장하는 프로그램이다.
    ex) C = A + B
  2. 작성된 코드가 컴파일러를 거친다.
    이는 어셈블리 언어로 변환이 된다. ( 모든 프로그램이 아래와 같이 변환되지는 않는다!!! )
    1. LOAD   X,A ( 레지스터 X에 기억장치 주소 A의 내용을 적재한다. ) 
    2. ADD     X,B ( 기억장치 주소 B의 내용을 읽어서 레지스터 X의 값과 더한 후에 레지스터 X에 저장한다. )
    3. STORE  C,X ( 레지스터 X의 내용을 기억장치 주소 C에 저장한다. )
  3. 어셈블리 언어로 변환된 코드를 기계어로 한번 더 변경한다. ( 아래 코드는 진짜가 아니다.. 😀)
    1. 00101100
    2. 00010100
    3. 01011000

또한 기계어는 컴퓨터가 이해하기 위해 비트를 여러가지로 나누는데 그 전에 기본 상식이 필요하다. 우리가 컴퓨터를 구매하거나 사양을 확인 할때 32bit, 64bit를 많이 마주할 것이다. 이는 컴퓨터가 한번에 수행하는 비트수이다. 이를 단어(Word)라고 하는데, 앞으로 컴퓨터 구조를 더 알아 갈때마다 많이 보게 될것이다. 여기서 우리는 이해하기 쉽게 16bit 프로세서를 이용한다고 가정하자. 

또한 기억장치는 데이터만 가지고 있는 것이 아니라 프로그램도 같이 저장하게 되는데  이는 뒤죽박죽 섞여 있지 않고 주소를 통해 구분되게 된다. 아래의 표는 대부분의 기억장치의 형태를 나타낸 것이다.

기억장치 주소 워드(16bit) 구분
0(물론 기억장치도 주소는 0부터 시작이다! ) 0010 0000 0010 0101 명령어
1 0010 0110 0110 0101
2 0010 1100 0110 0101
...
A 0000 0000 0000 0011 데이터
B 0000 0000 0000 1000
C 0000 0000 0000 0000

기계어는 두개 이상의 필드로 구성되어있는데 이번에는 연산코드 필드와 오퍼랜드 필드로 설명하겠다.

  • 연산코드 필드 : 대체로 CPU가 지원하는 연산의 갯수만큼 연산코드의 필드의 크기가 정해진다. 
  • 오퍼랜드 필드 : 기억장치에 저장되어 있는 데이터를 가르키거나 데이터를 나타낸다. 

컴퓨터는 고급언어에서 어셈블리어, 어셈블리어에서 기계어로 전환을 거쳐 사용자의 코드를 변환한다. 

 

출처 : (en.wikipedia.org/wiki/Instruction_set_architecture)

반응형