프로그래밍 초보자가 C언어나 파이썬 공부할 때 먼저 알아두면 좋은 튜링머신. 튜링머신은 컴퓨터가 동작하는 기본 원리를 이해하는데 기반입니다. 튜링머신에서 C언어까지 어떻게 이어지는지 흐름을 살펴봅니다!
튜링 머신이란?
튜링 머신은 앨런 튜링(Alan Turing)이 제안한 이론적인 컴퓨터 모델입니다.
(사진은 앨런 튜링 선생님. 그리고 영화에서 튜링 역할을 한 컴버배치)
이 분이 제시한 건 간단한 동작들로도 복잡한 계산이 가능하다는 개념인데요. 튜링 머신에는 세 가지 요소가 있습니다: 무한히 긴 테이프(메모리 역할), 그 테이프 위에서 움직이는 헤드(읽고 쓰는 장치), 그리고 상태(동작 모드)입니다.
튜링머신에서 말하는 상태(동작 모드)란 헤드가 현재 칸의 값을 읽었을 때, 그 값에 따라 어떻게 동작할지를 정의하는 것입니다. 아래에서는 right, carry, done 이라는 동작 모드들을 정의했습니다.
right | - 0이나 1이면 오른쪽으로 이동 - 빈칸이면 왼쪽으로 이동, 모드는 carry로 |
carry | - 1이면 그 칸에 0을 적고, 왼쪽으로 이동 - 0이나 빈칸이면 그 칸에 1을 적고 왼쪽으로 이동, 모드는 done으로 |
done |
- 아무것도 안함 |
논리적인 정의라서 복잡해 보이지만, 사실 각 모드는 현재 칸을 읽은 후, 그 칸의 값을 수정하기도 하고, 왼쪽이나 오른쪽으로 이동하고, 다른 모드로 상태를 변경하는 동작 밖에는 없습니다.
아래 그림은 튜링머신 실험 사이트 https://turingmachine.io/ 에서 위의 모드들을 동작하게 해본 예제입니다.
세개의 모드 right과 carry, done 만으로 주어진 2진수에 1이 더해지는 것(1011
-> 1100
)을 볼 수 있습니다. 즉 덧셈 기계를 만든 셈입니다! (사이트에서 직접 눌러보세요!)
튜링 머신은 이렇게 단순한 동작으로 이루어지지만, 충분한 시간과 올바른 규칙만 있다면 어떤 계산이라도 수행할 수 있는 보편적인 계산 장치의 개념입니다. 현대 컴퓨터의 논리적 원리입니다.
기계어란?
기계어(Machine Code)는 실제 컴퓨터가 이해하는 가장 낮은 수준의 언어입니다. 기계어가 튜링 머신과 동일하게 구현되지는 않았지만, 메모리(테이프)에서 하나씩 읽고, 내부 상태(레지스터의 상태 등)에 따라 결과를 내며, 다시 다음 명령어로 넘어가는 구조는 튜링 머신과 원리와 같습니다. 컴퓨터의 CPU는 튜링 머신의 헤드처럼 메모리에서 명령들을 차례로 읽어 실행하는데, 이 명령들이 바로 기계어로 작성되어 있습니다. 기계어는 0과 1로 이루어진 이진수들로써 전기 신호의 켜짐(1)과 꺼짐(0)에 대응합니다.
(그림. math.hws.edu)
초기의 컴퓨터 프로그래머들은 기계어를 입력하기 위해 패널의 스위치를 직접 0과 1에 맞춰 올리고 내리기도 했습니다. 사진에 보이는 Altair 의 초기모델은 주소를 지정하는 16개의 스위치와 데이터나 명령어를 입력하는 8개의 스위치로 각각의 비트를 직접 설정합니다. 그리고 RESET
, RUN
같은 버튼도 달려있었습니다.
(사진. computercloset.org )
천공카드에 구멍을 뚫어서 기계어를 입력하기도 했는데요. 꽤 번거롭고 사람이 실수하기 쉬웠겠죠.
(사진. 천공카드, 선배님들 중에는 실물을 보신분도 있다고 들었습니다.)
아무튼, 기계어에 대해서 설명을 이어가면, 2진 코드는 하나의 명령어를 나타내는데요. 사람에겐 기억하기 어려운 값이지만, CPU는 이해할 수 있는 명령입니다. 실제로 x86 CPU에서 "AL 레지스터에 값 5를 대입하라"는 명령어는 10110000 00000101
입니다. 이처럼 기계어는 숫자로만 이루어져 있어 사람이 직접 다루기엔 너무 불편합니다. 컴퓨터는 이해할 수 있지만 인간에게는 난해한 언어인 것이죠.