비트(Bit)와 바이트(Byte)

앞서 컴퓨터의 연산장치는 2진수 체계로 연산한다고 설명했었습니다. 이때 2진수의 0 혹은 1 하나의 수를 비트(Bit)라고 하고 8개의 비트를 모은 것, 즉 8자리의 2진값을 바이트(Byte)라고 합니다.

컴퓨터는 바이트를 최소 단위로 하여 2진수를 처리(전송, 연산, 저장 및 호출)합니다.

예를 들어 숫자 3은 2진수로 나타내면 11, 즉 2자리 수(2비트)이지만 실제로 컴퓨터 내에서는 최소 1바이트, 즉 8자리 2진값 00000011로 간주됩니다.

다양한 자료(데이터)의 표현

1바이트에는 0부터 255(00000000부터 11111111)까지 2의 8승 개의 값을 저장할 수 있습니다. 255보다 큰 수를 저장하고 싶다면? 바이트의 수를 늘리면 됩니다. 2바이트는 16비트이므로 2의 16승 개의, 즉 0부터 65,535까지의 수를 나타낼 수 있습니다.

음수는 어떻게 나타낼까요? 음수는 2의 보수로 표현합니다. 이 부분은 조금 어려울 수도 있는데, 반드시 암기해야 하거나 기억해야 하는 부분은 아닙니다. 그냥 이러한 방법이 있구나 정도로만 보고 넘어가도 됩니다.

2의 보수를 구하는 방법은 각 비트의 0을 1로, 1을 0으로 바꾼 후 1을 더해주면 됩니다.

예를들어 00000001의 2의 보수를 구하는 방법은 아래와 같습니다.

1) 0을 1로, 1을 0으로 바꿈.. : 11111110
2) 1을 더해줌............... : 11111111

이런 이상한 방식으로 표현하는 이유는 컴퓨터가 연산을 쉽게 하기 위해서입니다. 이 방식으로 음수를 표현하면 음수와 음수, 혹은 음수와 양수 간의 덧셈뺄셈을 간편하게 할 수 있습니다.

(-1) + (-1) 은 11111111(8비트) + 11111111(8비트) 으로 표현할 수 있고 이것을 그냥 2진수로 간주하여 값을 더하면 111111110(9비트)가 됩니다. 한자리가 늘어났죠. 현재 1바이트(8비트)를 기준으로 연산을 하고 있으므로 이 늘어난 가장 앞자리 비트를 무시해버리면 11111110(8자리)가 되고 이 값은 -2를 나타내는 값이 됩니다.

이 방식을 사용하면 첫번째 자리의 값은 양수인 경우 언제나 0, 음수인 경우 언제나 1이 되는 특징이 있습니다.

문자의 경우 문자와 숫자 사이 변환 값을 약속해 놓고 문자를 수로써 저장하고 읽어옵니다. ASCII(아스키) 테이블을 예로 들어 살펴봅시다.

ASCII 테이블은 0부터 127까지 수를 사용해 영문 대소문자와 문장부호, 몇몇 특수 문자를 가지고 있습니다.

a를 ASCII로 저장하면 위 테이블에 따라 숫자 97에 해당하는 1바이트 2진수 01100001가 저장됩니다. 위 테이블에 없는 문자나 기호(한글및 외래어나 특수문자)를 저장하려면 ASCII가 아닌 다른 방식을 통해서 문자를 2진수로 변경하여 저장할 수 있습니다. 대표적으로 Unicode 방식이 있죠.

지금까지 우리는 양수, 음수 그리고 문자를 컴퓨터가 어떻게 2진법으로 표현하는 지를 배웠는데요, 컴퓨터는 01100001이 ASCII로 a를 나타내는지 숫자 97을 나타내는지, 11111111이 양수 127을 나타내는지 음수 -1을 나타내는지, 0000001 0000001이 2바이트로 저장된 257인지 아니면 1바이트로 저장된 1과 또다른 1을 나타내는지 어떻게 구별 할 수 있을까요?

이를 알려 주는 것이 자료형입니다.

자료형

자료형(Data Type 혹은 Type)이란 컴퓨터에 저장된 2진수를 어떻게 해석해야 하는지를 표시하는 방법입니다. 자료형보다는 타입이라는 말로 더많이 씁니다. 자료형에 따라 컴퓨터는 어떠한 데이터가 몇 바이트 짜리인지, 문자인지 숫자인지, 숫자의 경우 첫번째 자리를 음수/양수를 표현하는 수로 해석할지 아닐지를 알 수 있습니다.

C언어의 경우 1바이트 문자를 저장하는 char 타입, 2바이트 숫자를 저장하는 short 타입, 4바이트 숫자를 저장하는 int 타입등 다양한 타입이 있습니다. 컴퓨터 성능이 좋지 않은 시절에 개발된 언어라 작은 숫자는 적은 바이트를 차지하는 타입에 담고, 큰 숫자들은 많은 바이트를 차지하는 타입에 담아 용량도 줄이고 처리 속도도 증가하는 대신, 프로그래머가 신경써야 하는 부분이 많습니다.

하지만 자바스크립트에서는, 문자및 문자열을 저장하는 타입은 string 타입 하나뿐이고, 숫자를 저장하는 타입은 number 타입 하나 뿐입니다. number 타입은 어떠한 수라도 8바이트로 처리하여 작은 수를 처리하기에 비효율적이지만 그만큼 프로그래머가 신경써야 할 부분이 줄어들었습니다. C언어가 처음 나온 시절에 비해 컴퓨터 성능이 많이 향상되어 효율성보다 편의성과 생산성을 향상시키는 쪽으로 발전한 것이지요.

프로그래밍에서는 문자와 숫자 이외에도 불리언(boolean), 배열, 객체(object)등등의 타입이 있지만 나머지는 차차 알아가도록 하고 이 강의에서는 데이터가 타입에 따라 분류된다는 것만 알아두시면 되겠습니다.

프로그래밍 언어하면 C언어를 떠올리시는 분들이 많은데, 저는 자바스크립트로 프로그래밍을 강의하려 합니다.

프로그래밍 언어를 처음 배울 때 주로 Hello World라는 문자열을 화면에 출력하는 간단한 코드를 작성하게 되는데, C언어는 코딩(coding)을 한줄이라도 하기 위해선 개발 툴을 설치하고 관련 라이브러리들을 불러와야 하는 과정이 필요합니다.

또한 내가 작성한 코드가 다른 컴퓨터에서 정상적으로 작동하기 위해서는 해당 컴퓨터에 관련 라이브러리들이 제대로 설치되어야 합니다. 반대로 다른 사람이 만든 코드 역시 내컴퓨터에 라이브러리들이 제대로 설치되어 있지 않다면 실행되지 않습니다. 프로그래밍을 배울 때 코딩 외에 신경써야 할 부분이 많다는 것이죠.

1. 자바스크립트를 공부하기 위해서는 아무런 프로그램의 설치가 필요하지 않습니다. 자바스크립트는 웹브라우저에서 실행되는데, 브라우저에 코드를 입력할 수 있는 도구인 '콘솔'이 있기 때문입니다. (랩탑이나 데스크탑의 경우에 한함. 만약 타블릿이나 핸드폰으로 이 글을 읽고 계시다면 코드작성 시에는 랩탑이나 데스크탑을 이용해 주세요.) 물론 실제로 프로그램을 작성한다면 개발용 텍스트 에디터를 사용하는 것이 좋지만, 간단한 코드를 작성하고 테스트하기 위해서는 불필요합니다.

2. C언어는 코드 수정후 재실행시 컴파일이라는 과정이 필요해서 전체 코드를 다시 실행해야 하지만, 자바스크립트는 컴파일이 필요하지 않고 프로그램 실행 중에도 변수, 함수를 생성하거나 해당 데이터, 코드를 변경할 수 있습니다. 코딩 연습할 때 굉장히 편리합니다.

3. C언어에서 작성한 프로그램은 운영체제(윈도우, 맥, 안드로이드, IOS 등)에 따라 호환이 안되는 경우가 많습니다. 자바스크립트는 웹브라우저에서 실행되므로 운영체제의 영향을 받지 않습니다. 브라우저간 호환성은 운영체제 호환성에 비해 굉장히 좋습니다. 심지어 모바일, 타블릿에서도 동일하게 실행됩니다.

이 글은 자바스크립트가 C언어보다 좋다는 것을 설명하는 글은 아닙니다. 배울 때 이것 저것 따질 것이 적다는 것이죠. 프로그래밍 언어는 하나를 어느정도 배워 두면 다른 언어를 익히는 것은 그렇게 어렵지 않습니다. 일단 재미를 붙이고 자신감을 얻는게 중요하죠. 나중에 다른 언어가 필요해 지면 그때 다른 언어를 공부하셔도 늦지 않습니다.

자바스크립트란?

자바스크립트(Java script)는 웹브라우저상에 명령어를 전달하는 언어로 자바(Java)와는 전혀 다른 별개의 언어입니다. 할 수 있는 일도 웹브라우저상으로만 제한됩니다만, 요즘은 웹상에서 못하는 것이 거의 없죠. 웹브라우저에서 작동하는 유일한 언어이기도 합니다. 이 때문에 웹 프로그래밍을 하게 된다면 반드시 접하게 되는 언어입니다.

자바스크립트로 Hello World 출력하기

Hello World 출력은 프로그래밍 언어를 배울 때 가장 먼저 배우는 것으로 화면에 텍스트를 출력하는 것을 익히는 것이 목적입니다. 아래 순서대로 따라해보세요.

1. 현재 이 글을 보고 계신 웹브라우저에서 새 창/새 탭을 열고, 주소창에 "about:blank"라고 입력합니다. (about:blank은 빈 페이지를 여는 명령어입니다.)

2. 웹브라우저의 콘솔을 엽니다. 웹브라우저 콘솔은 웹브라우저에 코드를 입력하기 위한 도구입니다. 아래 표를 보고 자신의 운영체제(OS)와 웹브라우저에 맞는 단축키를 누릅니다.

 운영체제  브라우저  콘솔 여는 법
 윈도우  크롬  Ctrl + Shift + J
 파이어폭스  Ctrl + Shift + K
 인터넷 익스플로러/엣지  F12 누른 후 콘솔(Console)탭 클릭
 맥  크롬  Command + Option + J
 파이어폭스  Command + Option + K
 사파리  Command + , 누른 후, 환경설정 > 고급 > '개발자용 메뉴 보기' 체크, 설정을 종료한 후 브라우저로 돌아 와서 Command + Option + C

저는 크롬 브라우저를 사용하여 콘솔 화면을 열었습니다.

커서가 깜박이는 것을 볼 수 있습니다. 이 부분에 코드를 입력할 수 있습니다.

3. 아래 코드를 입력한 후 엔터

1
console.log("Hello World!")
cs

Hello World!가 출력되었습니다.

- console.log()는 콘솔에 텍스트를 출력하는 함수입니다.
라는 코드에서 괄호안에 출력하고 싶은 내용을 넣으면 화면에 출력해 줍니다. - "Hello World!"에서 큰 따옴표(")는 텍스트를 출력하기 위해 사용하였고 숫자를 출력하고 싶은 경우에는 큰 따옴표를 사용하지 않아도 됩니다. 괄호안의 내용을 바꿔서 다른 내용을 출력하는 연습을 해봅시다.

"지금 프로그래밍을 한 건가요?"

프로그램을 만들었다기 보다, 명령어를 하나 배운 것 같은 느낌이 드실 겁니다. 이건 자바스크립트가 웹브라우저에서 작동하는 스크립트 언어이기 때문입니다. 이미 웹브라우저라는 프로그램이 실행중인 상태에서, 그 프로그램에 코드를 보내 실행되는 형태입니다.

좀 더 프로그램같은 걸 보고 싶은 분들은 아래코드를 복사해서 웹브라우저 콘솔에 붙여넣기해 보세요.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
var width = 350, height = 250, range = 20;
var player = {x: 150, y: 75, width: 20, height: 20, val:2};
var enemy = {x: 0, y: 0, width: 20, height: 20, val:1};
var score = 0, count = 0, key = [];
var canvas = document.createElement("canvas");
canvas.width = width;
canvas.height = height;
canvas.style.border = "1px solid black";
var ctx = canvas.getContext("2d");
document.body.appendChild(canvas);
setInterval(function(){
  update();
  draw();
},10)
function draw(){
  ctx.save();
  ctx.fillStyle = "white";
  ctx.fillRect(0,0,width,height);
  ctx.fillStyle = "red";
  ctx.fillRect(enemy.x-enemy.width/2,enemy.y-enemy.height/2,enemy.width,player.height);
  ctx.fillStyle = "black";
  ctx.fillRect(player.x-player.width/2,player.y-player.height/2,player.width,player.height);
  ctx.font = "20px Arial";
  ctx.fillStyle = "black";
  ctx.fillText("Score: "+score,0,20);
  ctx.restore();
}
function update(){
  if(player.x >= enemy.x-range && player.x <= enemy.x+range && player.y >= enemy.y-range && player.y <= enemy.y+range ){
    enemy.y = 0;
    score++;
  }
  if(enemy.y > height || enemy.y == 0){
    enemy.x = Math.ceil(Math.random()*width);
    enemy.y = 0;
    enemy.val = 1;
  }
  if(key[37]&&player.x-player.width/2>0) player.x -= player.val;
  if(key[38]&&player.y-player.height/2>0) player.y -= player.val;
  if(key[39]&&player.x+player.width/2<width) player.x += player.val;
  if(key[40]&&player.y+player.height/2<height) player.y += player.val;
  enemy.y += enemy.val;
  enemy.val += 0.02;
}
window.addEventListener("keydown"function(e){
  key[e.keyCode] = true;
});
window.addEventListener("keyup"function(e){
  key[e.keyCode] = false;
});
cs

마우스로 게임화면을 한번 클릭하신 후 키보드 상하좌우 키를 눌러 검은 네모를 움직일 수 있습니다. 검은 네모가 떨어지는 빨간 네모에 닿으면 점수가 올라갑니다. 게임종료는 없습니다. 지금 이 코드는 그냥 흥미위주로 봐주시고 코드의 이해는 하지 않으셔도 됩니다.

이번 글에서는 프로그래밍 언어의 발달 과정을 살펴봅시다. 이 부분 역시 프로그래밍을 하는데 반드시 알아야 하는 부분은 아닙니다. 대강의 흐름을 이해하시고 구체적인 언어의 문법을 이해하거나 외우려고 하시지 마세요.

기계어

처음 프로그래머들은 실제로 0과 1을 사용하여 프로그램을 작성하였습니다. 이를 기계어(Machine Language)라고 합니다.

000000 00001 00010 00110 00000 100000

이런 식이죠. 저는 기계어를 모르기 때문에 위 코드는 영문위키(https://en.wikipedia.org/wiki/Machine_code)에서 가져왔습니다. 내용을 해석해 보면,

[  op  |  rs |  rt |  rd |shamt| funct]
 000000 00001 00010 00110 00000 100000    2진법
    0     1     2     6     0     32     10진법

- 0번 오퍼레이션(op)의 32번 기능(funct)을 사용합니다.
- 이 기능은 rs 레지스트리의 값과 rt 레지스트리의 값을 더하여 rd레지스트리에 저장합니다. 여기서 레지스트리는 CPU에서 데이터를 임시로 저장하는 장치를 뜻합니다(윈도우 운영체제의 레지스트리와는 다릅니다).
- 즉 1번 레지스트리의 값(rs)에 2번 레지스트리값(rt)을 더하여 6번 레지스트리(rd)에 전달합니다.

바로 앞 강의에서 살펴 본 칩과 마찬가지로 0과 1로 구성된 32개의 신호를 CPU에 전달하면 CPU가 위 명령을 수행하기 위한 출력 신호를 생성하게 되고, 다음 장치들이 그 값을 받아 명령을 완수하게 됩니다.

기계어로 작성된 코드는 가독성이 굉장히 떨어지기 때문에 사람이 알아 보기 쉽게 하기 위해 나온 것이 어셈블리어(Assembly Language)입니다.

어셈블리어

10110000 01100001 <- 기계어
MOV AL, 61h <- 위 기계어에 해당하는 어셈블리어

저는 어셈블리어 역시 전혀 모르기 때문에 이 또한 영문 위키(https://en.wikipedia.org/wiki/Assembly_language)에서 가져왔습니다.

AL 레지스트리에 61h(h는 hex로 6진법을 뜻합니다. 6진법 61은 10진법으로 97입니다)를 넣으라(move)는 명령입니다.

10110000이라는 명령이 MOV AL이라는 문자로, 2진수인 01100001이 6진법인 61h가 되어 사람이 이해하기에 조금 더 쉬워졌습니다. 하지만 CPU는 0과 1밖에 모르기 때문에 어셈블리어로 작성된 코드는 CPU로 바로 전달될 수 없고 어셈블러(assembler)라는 프로그램을 통해 기계어로 번역된 후 CPU가 처리할 수 있습니다.

어셈블리어는 기계어를 단순히 사람이 보기 좋게 숫자를 문자로, 2진수를 다른 진수의 수로 변경한 것으로 기계어와 1대 1 변환이 가능합니다.

저급언어

기계어와 어셈블리어처럼 CPU에 직접 명령을 내리는 코드를 작성하는데 사용되는 언어를 저급언어라고 합니다. CPU에 명령어를 바로 전달하는 것은 초창기에는 너무 당연한 일이였겠지만, CPU가 발전하고 종류가 다양해지게 되면서 CPU 아키텍처가 바뀌면 프로그램이 작동하지 않게 되는 문제가 발생합니다. 즉 CPU 종류에 따라 각각의 프로그램을 작성해야 하는 것이죠. 기계어/어셈블리어는 하나의 언어가 아닙니다. 해당 CPU 메뉴얼에 맞춰 프로그래밍을 하는 것이 기계어로 코딩하는 것입니다.

또 다른 문제점은 CPU의 작동 방식이 사람이 이해하기에 난해하다는 점입니다. 예를들어, 2+3을 계산하려면 아래와 같은 명령들을 내려야 합니다.

- 2를 1번 레지스트리에 저장
- 1번 레지스트리의 값에 3을 더해서 2번 레지스트리에 저장
- 2번레지스트리의 값을 꺼내서 출력

굉장히 구체적으로 명령을 내려 줘야하기 때문에 익히기가 힘들고 코드가 복잡해지므로 생산성이 높지 않습니다.

고급언어

C언어, 자바, 자바스크립트, 파이썬 등과 같은 고급언어는 운영체제와 컴파일러/인터프리터 등의 프로그램을 통해 시스템에 맞는 기계어의 번역이 이루어 집니다. 또한 번역시 CPU가 처리해야 할 구체적인 과정이 알아서 처리되어 사람의 입장에서 명령을 내릴 수 있게 됩니다. 이것을 명령이 추상화가 되었다고 합니다. 물론 CPU의 입장에서 추상화가 된 것이죠.

2+3을 계산하는 명령을 그냥 2+3이라고 작성하면 이 명령이 기계어로 번역될 때 번역기가 이 문장을 이해하고 해당 CPU에 맞는 기계어를 알아서 생성하게 됩니다.

CPU의 입장에서 프로그래밍하는 언어가 저급언어, 사람의 입장에서 프로그래밍하는 언어가 고급언어라고 할 수 있습니다.

저급, 고급이 언어 자체의 좋고 나쁨을 뜻하지는 않습니다. 오히려 저급언어로 만들어진 프로그램이 CPU를 직접 제어하므로 고급언어보다 훨씬 빠른 프로그램을 만들 수 있습니다. 하지만 요즘은 컴퓨터 성능이 많이 좋아져서 고급언어로 만든 프로그램이 조금 비효율적이라도 여전히 빠르고, 프로그램을 만드는 효율(얼마나 쉽고 빠르게 프로그램을 만들 수 있는지)이 중요하게 여겨지기 때문에 대부분의 프로그램들이 고급언어로 만들어 지고 있습니다.

컴퓨터의 작동 원리는 프로그래밍을 하는데 꼭 알아야 하는 것은 아니지만 프로그램이 어떻게 컴퓨터를 작동시키는지와 밀접하게 연관되어 있고 몇몇 프로그래밍의 기본 개념을 이해하는데 도움을 줍니다.

컴퓨터는 전자계산기

최초의 컴퓨터는 수학식을 계산하는 도구였습니다. 지금은 컴퓨터로 영화도 보고 게임도 하고 뉴스도 읽을 수 있죠. 하지만 이 기능들은 계산기의 기능을 확장한 것입니다.

키보드로 키를 입력하거나, 마우스를 움직이거나 터치스크린을 터치하는 등의 사람의 동작을 컴퓨터가 처리할 수 있게 전기신호로 변환하는 장치를 입력장치라고 합니다. 반대로 전기신호를 사람이 이해할 수 있게 빛(화면), 소리 등으로 변환하는 장치를 출력장치라고 합니다. 이 신호는 숫자로 나타내어질 수 있고, 컴퓨터는 입력장치를 통해 입력받은 값을 연산하여 출력장치에 전달합니다.

이처럼 현대의 컴퓨터도 여전히 숫자들을 바탕으로 하여 정보를 처리하고 계산하는 장치라는 것을 이해하고 컴퓨터가 어떻게 수를 계산하는지 알아봅시다.

아래 내용에 전혀 흥미가 없으신 분들은 컴퓨터가 2진수 계산을 하는 장치라는 것만 알고 넘어가도 됩니다.

컴퓨터와 2진 신호 체계

흔히들 컴퓨터는 0과 1밖에 모른다고 하죠. 컴퓨터의 중앙처리장치인 CPU가 0과 1로만 계산을 하기 때문입니다. 그런데 CPU는 숫자 0과 숫자 1을 어떻게 구별할까요?

사실 CPU는 숫자 0도, 숫자 1도 모릅니다. CPU에는 모든 신호가 전기로 전달되는데 이 때 전압이 일정한 기준보다 높은 경우 이것을 1, 전압이 일정한 기준 보다 낮은 경우 이것을 0으로 사람들이 표현한 것입니다.

CPU는 <전압이 충분히 높음>과 <전압이 충분하지 않음>의 두가지 신호로 된 2진법을 사용합니다. 혹시 여기서 2진법, 10진법에 대해 잘 모르시는 분들은 따로 검색을 통해서 기본 개념을 익히시고 계속 읽어 주세요.

여기서 "전압이 충분함"이 어떤 기준인지, 왜 높고 낮음 두가지로만 구별하는지(10단계의 전압을 구별하면 10진법을 사용할 수 있을텐데 말이죠!)를 이해하려면 CPU의 구성품인 트랜지스터가 무엇인지 알아야 합니다.

트랜지스터와 논리연산

트랜지스터는 CPU를 구성하는 구성품으로 전기 신호의 흐름에 관여하게 됩니다. CPU에는 트랜지스터가 수십억개가 모여있으며 제작기술이 발달함에 따라 그 수가 늘어나고 있죠. (초창기의 컴퓨터의 CPU는 수천개의 트랜지스터로 구성되어 있었음)

CPU 구성에 사용되는 npn 트랜지스터는 아래와 같이 구성되어 있습니다.

트랜지스터에는 전류가 흐를 수 있는 다리가 3개(이미터, 베이스, 컬렉터) 있으며 베이스에 전압이 일정 수준 이상(0.6볼트 이상) 이면 컬렉터로 들어온 전류가 이미터로 전달될 수 있고 그렇지 않으면 컬렉터에서 이미터로 전류가 흐르지 않게 하는 장치입니다. 즉 베이스에 특정한 전압 이상의 전류가 통하고 있는지 아닌지를 통해 이미터에 CPU에 0, 1의 신호를 주게 되는 것입니다.

트랜지스터의 이러한 특성을 이용하면 '논리 게이트'라는 것을 만들 수 있습니다.

 논리 게이트

 구조

 설명

 AND GATE

 

A와 B에 모두 전압이 있어야
Out에 전류가 흐름

 OR GATE

 

A나 B에 중에 한 곳이라도 전압이 있으면
Out에 전류가 흐름

위 표는 트랜지스터로 어떻게 논리 게이트를 구성하는지 보여주기 위한 2가지 예제일 뿐이고 트랜지스터들을 연결하는 방법에 따라 아래와 같은 다양한 논리 게이트를 만들 수 있습니다.

Symbol에서 왼쪽이 입력신호, 오른쪽이 출력신호이며, Truth Table에서 왼쪽 A 혹은 A, B가 입력 값, 오른쪽 X가 출력값을 나타냅니다. 예를 들어, AND 게이트의 경우 X로 1 신호를 보내기 위해서는 (A, B)가 각각 (1, 1)이 되어야 하며, 나머지 (0, 0), (1, 0), (0, 1)인 경우는 0 신호를 보내게 됩니다.

논리 게이트를 또다시 모아모아 계산을 할 수있는 칩을 만들 수 있습니다. 아래는 두자리 2진수 두개의 합을 구하는 칩 구성입니다.

이 칩은 0과 1을 입력받는 부분이 4개, 0과 1을 출력하는 부분이 3개로, 4가지 입력부에 두자리 2진수 2개를 나란히 입력하면 그 합이 출력됩니다. 입력부에 스위치를 연결하고 출력부에 전구를 연결하면 각각 스위치를 켜고 끔에 따라 전구에 불이 들어오는 순서가 달라지겠죠.

위 칩에서 알 수 있는 중요한 점들!!

1. 입력값인 1011이 순서대로 하나씩 1, 0, 1, 1이 들어가는 것이 아니라 1011이 동시에 쑥 들어가서 오른쪽으로 값이 101이 동시에 쑥 나온다는 것

2. 결국 2진수 1011(10진수로는 11)를 입력으면 101(10진수로 5)를 출력하고 있다는 것입니다. 즉, 규칙을 이해하고 사용하는 것이 요구된다는 점이죠,

3. 출력값 101은 숫자 101이 아니라 세개의 출력선에 전류가 흐르고 있는지 아닌지를 나타낸다는 점! 출력으로 나온 전류를 다시 다른 칩에 넣어 변환하여 모니터나 프린터같은 출력장치에서 그 값을 활용할 수 있습니다.

이런식으로 논리 게이트를 구성하여 CPU를 설계하게 됩니다(정확히는 CPU의 연산부분을 이런식으로 설계).

정리

입력장치, 연산장치, 출력장치와 더불어 또 한가지 중요한 장치가 저장장치인데요, 컴퓨터의 저장장치는 0과 1의 전기 신호를 기록해 두었다가 전류가 흐르면 이전에 기록해놓았던 2진 전기 신호들을 재현하는 장치입니다.

결론적으로 컴퓨터는 0과 1의 전기 신호를 처리하는 장치, 프로그램은 0과 1들의 전기 신호들를 저장장치에 기록해 놓은 것이며 프로그래머는 0과 1들의 전기 신호들을 기록하는 사람들이라고 할 수 있습니다.

그러면 프로그래머들은 프로그래밍을 할 때 0과 1을 써넣는 작업을 하나요? 처음에는 진짜 그랬습니다. 하지만 프로그래밍 언어를 통해 0과 1을 직접 써넣을 필요가 없어졌습니다.

다음글에서는 프로그래밍 언어의 발달 과정을 알아 보겠습니다.

+ Recent posts