The Computer Myth - NAND Gate (Part 01)

2 minute read

컴퓨터는 디지털(digital) 기계다. 디지털은 0과 1, 이 두 가지 값으로만 나뉜다는 것이다. 컴퓨터는 오로지 0과 1로만 연산을 수행하기 때문에 디지털 기계다. 컴퓨터는 전기를 연료로 작동하는데, 그럼 전기 신호도 0과 1로만 들어오나?

전기는 아날로그(analog)이다. 아날로그는 연속적이라는 것이다. 전압의 단위인 볼트(voltage)는 0, 0.1, 0.655, 0.99 등 무한히 연속적인 값으로 들어오므로, 볼트는 아날로그이다. 근데 컴퓨터는 이 아날로그 값을 0과 1이라는 단 두 개의 디지털 값으로 어찌저찌 변환하여 처리한다. 어떻게?

모른다! 우리는 신경쓸 필요 없다. 이것이 컴퓨터공학(Computer Science)에게 주어진 가장 기초적인 추상화(abstraction)이다. 전기라는 아날로그 값을 어떻게 디지털 값으로 변환하여 컴퓨터에게 먹일 것인가를 고민하는 단계는 전기전자공학과(Electrical Engineering)에게 해당하는 몫이다. 우리는 다만 컴퓨터는 항상 0과 1로만 데이터를 처리할거야! 라는 사실을 당연하게 받아들이면 된다(이 원리가 궁금한 사람들은 이 MIT 강의를 추천한다).

Electrical Engineering abstraction
아날로그가 어떻게 0과 1이라는 디지털로 변환되는가? 우리에겐 상관없다!

컴퓨터가 처리하는 하나의 0 또는 1을 bit(binary digit) 라고 한다. 1bit는 0 또는 1, 2bit는 00, 01, 10, 또는 11, 8bit는 00000000 ~ 11111111 사이의 값을 가지고, 이처럼 0과 1로 숫자를 표현하는 방식을 이진법이라고 부른다. 우리가 컴퓨터에 입력하는 모든 숫자와 기호들은 하드웨어 단에서 0 또는 1이라는 bit의 나열로 변환되며, 컴퓨터가 수행하는 모든 연산들은 이러한 bit들을 조작함으로써 가능해진다. 예컨대, 십진법으로 표현되는 숫자 10은 1010이라는 bit 나열로 표현되고, ‘a’라는 알파벳은 97이라는 코드를 가지므로 1100001이라는 bit 나열로 표현된다 (이진법과 십진법 사이의 변환을 잘 모르는 분들은 찾아보길 바란다!).

그래서 컴퓨터는 bit들을 다양하게 조작할 수 있는 함수, 또는 부품들을 가진다. 하나의 bit를 반전시키는 부품도 있고, 두 개의 bit를 받아 둘 다 모두 1이어야 1을 출력하는 부품도 있다. 이렇게 하나 이상의 bit input을 받아 하나 이상의 bit output을 내는 부품을 게이트(gate), 또는 칩(chip)이라고 부른다. 게이트라는건 아래와 같이 실제로 존재하는 물리적인 컴퓨터 부품이다!

NAND gate
게이트는 요런식으로 생긴 아주 조그만 녀석이다

컴퓨터의 하드웨어란 결국 위와 같은 게이트 수천만개가 조합되어 만들어진 커다란 기계이다. 수학의 곱셈 연산을 덧셈이라는 더 기초적인 연산의 조합으로 만들 수 있듯이, 더 복잡한 게이트도 더 기초적인 게이트들의 조합으로 만들 수 있다. 이처럼 단순한 게이트를 조합하여 더 복잡한 게이트를 만들고, 이들을 또 다시 조합하여 더 복잡한 게이트와 칩들을 만들어가면 현재 우리의 컴퓨터가 완성되는 것이다. 게이트와 칩이라는 단어는 동일한 의미로 혼용되어서 사용되는데, 흔히 더 작은 부품은 게이트, 더 큰 부품은 칩이라고 부른다.

컴퓨터는 수천만개의 다양한 게이트로 이루어져 있다. 그렇다면 이들 중 가장 기초적인, 태초의 빛과 같은 게이트는 무엇일까? NAND 게이트다. 물론, 무조건 NAND 게이트일 필요는 없다. 다른 아키텍쳐에선 XOR나 AND와 같은 다른 게이트가 될 수도 있다. 하지만 이 포스트의 기반이 되는 The Elements of Computing Systems에서는 NAND 게이트를 시작점으로 하기 때문에 여기서도 이를 따르도록 한다. NAND를 시작점으로 한다는 것은, 이 게이트가 어떻게 만들어졌는지는 신경쓰지 않겠다는 뜻이다(이 부분도 전기전자공학과의 몫이다).

NAND gate description
NAND 게이트의 정의

NAND는 위와 같이 정의되는 아주 단순한 게이트다. 두 개의 binary digit을 받고 하나의 binary digit을 출력하는데, 그 출력값은 오른쪽의 테이블과 같다. 즉, 두 값이 모두 1일때만 0, 나머지 케이스는 모두 1을 내뱉는 게이트이다(그리하여 Not AND의 줄임말). 이 게이트가 우리에게 주어진 또다른 abstraction이다.

이제 시작이다! 다음 포스트에서는 NAND 게이트를 가지고 필요한 다른 게이트들을 만들어본다.

Leave a comment