1000011100111110001001000101=434F4445

[테크월드=정환용 기자] EMBEDDED BASICS - 컴퓨터의 언어, 코드(CODE)

제목의 알 수 없는 숫자는 장난이 아니라 ‘코드’의 철자 CODE를 아스키(ASCII, American Standard Code for Information Interchange) 코드의 2진수로 변환한 숫자다. 7자리로 표현할 수 있는 각 철자를 기계어 0과 1로 대입하면 C=1000011, O=1001111, D=1000100, E=1000101가 된다. 영화 ‘마션’에서 화성에 조난당한 와트니가 화성탐사선 패스파인더를 찾아 지구의 모델과 동기화한 뒤, 카메라 렌즈로 의사를 전달하기 위해 16진법 아스키코드를 사용하는 것을 볼 수 있다. 같은 방법으로 CODE를 16진법으로 변환하면 각 철자는 43, 4F, 44, 45가 된다.

지구상의 수많은 인간(그리고 어쩌면 우주 너머에 있을 수많은 외계인)들은 사용하는 언어도 제각각이다. 바로 앞 한 단락만 읽어봐도 한글과 한자, 영어와 숫자 등 4개가 사용됐다. 사람마다 문화에 따라 정해진 규칙의 언어를 습득해 생활하는 것이 일반적이다. 하지만 컴퓨터는 이렇게 다양하고 복잡한 언어를 이해할 만큼 똑똑하지 못하다. 컴퓨터를 구성하는 소프트웨어의 기저에는 2진법의 0과 1만 있을 뿐이다. 컴퓨터는 어떤 명령을 수행할 때 전기 신호가 있으면 1, 없으면 0으로 표현한다.

컴퓨터는 이진법의 표기 숫자 한 칸을 비트(Bit)로 나타내고, 하나의 문자를 8비트=1바이트(Byte)라 칭한다. 이런 이진코드가 수없이 모여 기계에게 원하는 말을 알아듣게 하기 위한 기계어(Machine Code), 그리고 이것이 조합되는 하나의 결정체인 운영체제(Operating System)를 만들 수 있게 하는 것이 코드의 힘이다. 2개의 숫자로 구현할 수 있는 프로그램과 그 기능, 성능은 마치 고성능 하드웨어도 숫자 2개를 감당하기 어려워하는 것처럼 그 조건이 향상되고 있다. 컴퓨터의 언어 코드에 대해 알아보자.

 

대화가 필요해
인간이 계산을 하는 데 머리 대신 기계를 쓰기 시작한 것은 1942년 공개된 ‘어태너소프-베리 컴퓨터(Atnasoff-Berry Computer, ABC)다. 대부분은 1946년에 개발된 ‘에니악’(ENIAC, Electronic Numerical Integrator And Computer)을 최초의 컴퓨터로 알고 있는데, 1973년 소송을 통해 ABC가 최초의 기계식 연산을 사용하는 컴퓨터로 인정받았다. 심지어 에니악은 최초의 실용화 컴퓨터란 타이틀도 영국이 암호 해독을 위해 1943년에 만든 ‘콜로서스’(Colossus)에게 내줬다. 콜로서스는 영화 ‘이미테이션 게임’에서 간단하게나마 그 원리를 알 수 있다.

▲1943년 공개된 ‘콜로서스’ 마크 1은 프로그래밍을 할 수 있는 최초의 전자식 컴퓨터다. 1944년 개발된 마크 2는 초당 2만 5000자의 연산 성능을 낼 수 있었다.

에니악의 개발 이후 수학자 폰 노이만(John von Neumann)이 에니악의 단점을 보완해 만든 ‘폰 노이만 구조’를 적용한 ‘에드삭’(EDSAC, Electronic Delay Storage Automatic Calculator)을 만들었다. 기존의 컴퓨터는 A 작업을 하다가 B 작업을 하려고 하면 하드웨어를 B 작업에 맞게 재배치해야 했다. 그러나 폰 노이만 구조는 하드웨어 교체 없이 소프트웨어만 교체하면 돼 편의성과 범용성이 비약적으로 향상된다. 이 구조는 구조적인 한계가 있기는 하지만 현재까지 거의 모든 컴퓨터에 적용되고 있고, 앞으로도 신경망 구조, 양자 컴퓨팅 등 새로운 솔루션이 적용될 때까지 한동안 지속될 것으로 보인다.

▲폰 노이만이 자신이 제안한 폰 노이만 구조에 따라 만든 컴퓨터 ‘에드삭’.

군용 목적으로 개발된 에니악은 원래 목적이었던 포탄의 탄도 계산을 비롯해 난수, 설계, 예보 등 다양한 연구에 필요한 연산에 사용됐다. 개발 목적이 현재의 컴퓨터보다 훨씬 단순했기 때문에, 거대한 계산기라고 봐도 무방하다. 실제로 에니악의 성능은 현재 소형 계산기에 사용되는 아주 작은 칩보다도 훨씬 떨어졌다. 게다가 당시 연산 회로를 구성하는 데 사용된 1만 8800개의 진공관은 내구도가 너무 약해 오래 사용하기도 어려웠다.

당시에는 ‘전자계산기’에 더 가까웠던 디지털 컴퓨터로 인간보다 훨씬 빠르게 계산을 수행할 수 있었다. 앨런 튜링 역시 2차 세계대전 당시 독일군이 암호를 주고받던 에니그마를 풀기 위해선 복잡한 연산을 빠르게 처리할 수 있는 기계가 필요하다는 걸 깨닫고 콜로서스를 만들었다. 지금은 계산기로 아무리 복잡한 사칙연산을 입력해도 ‘=’ 버튼을 누르는 순간 결과를 얻을 수 있다. 그리고 이런 연산을 활용할 수 있는 분야가 점점 다양해지며 컴퓨터의 용도는 이제 모든 분야에서 없어서는 안 될 필수 아이템이 됐다.

▲2진법을 완벽하게 구사할 수 있다면, QWERTY 자판이 필요 없이 0과 1 두 키만 있으면 모든 것이 해결된다.

 

기계어, 컴퓨터와의 소통의 시작
컴퓨터는 사람이 만든 기계다. 전동 드릴이나 전기톱처럼 직관적인 목적을 가지지 않고, 2차 목표를 수행하기 위한 도구로서 그 가치를 지니고 있다. 컴퓨터에게 명령을 수행하기 위해서는 어떤 형태로든 인간과 소통할 수 있는 언어가 필요했다. 키보드나 마우스 등 일반적인 입력장치를 사용하면 간단하지만, 흔히 볼 수 있는 키보드가 1970년대에 등장했을 때는 가히 획기적이었다. 원하는 명령어를 천공 카드나 마그네틱테이프에 물리적으로 입히는 것이 아니라, 모니터에 ‘A’를 출력하고 싶다면 키보드의 A를 누르면 되기 때문이다.

이 과정은 지금 보면 지극히 단순해 보이지만, 컴퓨터가 이를 인식하는 과정은 생각보다 복잡하다. 기자가 현재 작업하는 것처럼 문서 작성 프로그램에서 한글 원고를 작성하는 것을 예로 들어보자. 이 상황은 CPU, RAM, 저장장치, PSU 등 기본 PC 하드웨어가 조합되고, 운영체제와 문서 작성 프로그램, 각종 드라이버가 설치돼 PC를 사용할 수 있는 환경이 갖춰져 있다는 것을 전제로 한다.

1. 컴퓨터가 메인보드의 2번 USB 포트에 연결된 기기를 ‘키보드’로 인식한다.
2. 사용자가 숫자 5를 입력한다.
3. 키보드는 100여 개의 입력문자 중 숫자 5에 해당하는 스위치에 입력된 신호를 키보드 컨트롤러로 전송한다.
4. 케이블을 통해 숫자 5 입력 정보가 컴퓨터로 옮겨지고, 컴퓨터는 방금 전달받은 명령이 숫자 5를 화면에 표시하라는 신호라는 것을 파악한다.
5. 화면의 정해진 위치에 숫자 5를 표시한다.

이 과정은 적게는 300단어, 많게는 3000단어가 넘는 원고 작업을 하면서 하루에도 수없이 반복된다. 이런 작업을 컴퓨터에 요청하기 위해서는 오타를 줄여 원하는 작업을 수행할 수 있어야 하고, 반응속도도 빨라야 다음 명령을 받을 수 있다. 때문에 컴퓨터가 입력을 받아들이는 방식은 모든 명령에 있어 ‘on’(1)과 ‘off’(0) 두 가지 숫자로만 인식한다. 그리고 무수히 많은 0과 1로 조합되는 명령어를 사용자가 알아볼 수 있는 기호로 정리한 것이 어셈블리 언어(Assembly Language)다. 폰 노이만이 만든 에드삭도 어셈블리어를 통해 실행 코드를 작성, 입력시켜 원하는 답을 얻어냈다.

이 복잡한 과정은 점점 컴퓨터가 대중에 가까워지면서 좀 더 쉽게 사용할 수 있는 방법이 필요했다. 기존의 천공 카드 방식에서 향상된 코볼, 포트란 등의 언어가 사용되던 1970년대 초, 컴퓨터 공학자였던 데니스 리치(Dennis McAllistair Ritchie)가 만든 C언어가 등장한다. 가장 단순한 설명으로 윈도우, 맥OS, 리눅스 등의 운영체제를 구성하는 것이 C언어라고 보면 된다. 이후로 C++과 C#(여기서 #은 4개의 +를 뜻한다)을 비롯해 자바(Java), 비주얼 베이직(Visual Basic) 등 다 양한 프로그래밍 언어가 등장했고, 이 언어들로 말미암아 PC부터 모바일 기기까지 컴퓨팅 시스템이 적용되는 모든 기계와의 소통을 할 수 있게 됐다.

▲클라우드 개발 환경을 지원하는 repl.it 웹사이트에서 C언어를 간단하게 체험할 수 있다.

 

인간과 컴퓨터 사이의 통역, 코드
0과 1의 나열만으로는 개발자가 어떤 내용인지 알아보기 어렵고, 이 두 숫자만으로 프로그램을 개발하는 것은 불가능에 가깝다. 때문에 어떤 내용을 기계에게 명령하기 위해선 개발자가 내리는 특정 방식의 명령을 기계어로 변환해야 한다. 여기서 개발자는 개발 도구로 앞서 언급한 C, 자바 등의 프로그래밍 언어를 사용해 편집하는데, 이것이 코드 작성(코딩, coding)이다.

▲C언어를 아는 사람이라면 ‘Hello, World!’란 문구가 익숙할 것이다.

이렇게 작성된 코드는 컴파일을 통해 이진법으로 바꿔 컴퓨터에 전달하고, 코드를 제대로 알아들은 컴퓨터는 그 결과물을 만들어낸다. 모든 프로그램은 이와 같이 코드 편집, 컴파일, 실행의 과정을 거치며, 개발자의 의도대로 작동하지 않는다면 코드를 수정(디버그, debug)하며 프로그램을 완성해 나간다.

흔히 어떤 프로그램이나 소프트웨어를 개발하는 과정을 ‘프로그래밍’(Programming)이라 한다. 프로그램은 특정 작업을 수행하기 위한 명령어의 모임이다. 이 원고를 작성하는 데 사용하는 컴퓨터 역시, 하드웨어 성능이 뛰어나도 운영체제, 워드프로세서 등의 소프트웨어가 없다면 무용지물이다.

그렇다면 코딩과 프로그래밍은 다른 개념일까? 혹자는 프로그래머가 코더의 상위 카테고리라고 말하기도 하고, ‘코더는 많은데 프로그래머가 없다’고 말하는 사람도 있다. 사실 개념으로 따지면 코딩과 프로그래밍의 차이는 단순히 한두 개의 요소를 기준으로 나누기 어렵다. 사실 하위개념이라기보다 같은 선상에서 협업해야 하는 직군 구조를 가지고 있어, 개념의 차이보다는 업무의 차이로 나누는 게 더 타당하다.

게임 속 캐릭터를 예로 들면, 마우스의 왼쪽 버튼을 클릭했을 때 들고 있던 소총으로 전방에 사격을 가한다. 프로그래머가 마우스 클릭부터 사격까지의 모든 과정을 제작한다면, 코더는 이 일련의 과정을 오작동 없이 캐릭터가 정해진 규칙대로 움직이는 구조를 만든다. 여기에는 코더나 프로그래머를 비롯해 캐릭터의 생김새나 총을 쏘는 움직임, UI 등을 만드는 디자이너, 게임의 배경에 효과음과 BGA를 배치하는 엔지니어, 게임의 스토리와 흐름 등 콘텐츠 전반을 구성하는 기획자 등 수많은 개발자들이 투입된다. 프로그래머 역시 캐릭터의 움직임과 총의 격발, 각종 수치 등을 계산해 적용하는 게임플레이 파트와 네트워크 파트, 게임 엔진 파트 등 직군이 다양하게 나뉜다.

결국 프로그램 하나를 제작하기 위해서는 코더와 프로그래머의 경계선을 나누기보다 수백·수천만 줄의 코드를 효율적으로 설계·배치·구현하는 것이 더 중요하다. 다만 국내에서는 대부분의 소프트웨어 기업이 새로운 조합을 찾기보다는 기존의 구성을 약간 개선시키는 정도에서 만족하고 있어, 국내에서 운영체제의 빌 게이츠, 게임의 시드 마이어 등 시대를 대표하는 프로그래머가 배출되기 어렵다. 올해부터 의무교육 과정에 코딩 교육 커리큘럼이 신설됐지만, 시작부터 우왕좌왕하는 교육 과정으로 국내 소프트웨어 시장에 변화를 가져올 수 있을지는 의문이다.

이 기사를 공유합니다
저작권자 © 테크월드뉴스 무단전재 및 재배포 금지