brunch

You can make anything
by writing

C.S.Lewis

by 허클베리 Jul 20. 2022

2. 소프트웨어적 사고 - 3

떼려야 뗄 수 없는 관계, 소프트웨어와 데이타


 앞서 '소프트웨어'에 대한 이해를 돕고자 하드웨어에 대한 이야길 꺼냈다. 지금까지의 내용을 토대로 소프트웨어에 대해 '하드웨어가 갖고 있는 물리적인 바운더리 내에서 그 하드웨어로 하여금 목적한 바에 따른 동작을 하도록 하는 그 무엇'이라는 식으로 정의해도 뭐 별로 이상하지도 않고 틀린 말도 아니다. 그런데 뭔가 아쉽고 뭔가 애매하다. 좀 추상적인 느낌도 들고, 위와 같은 문장으로 소프트웨어란 이겁니다 하기엔 찝찝한 느낌마저 든다. 



 왜 그럴까.. 그건 바로 '어떻게'가 빠져 있기 때문이다.



 지금까지는 소프트웨어를 이야기하는 데 있어 추상적, 포괄적, 개념적인 용어들을 사용해 인문학적인 방식으로 접근했다면 지금부턴 '어떻게'에 해당하는 내용을 짚어가며 보다 구체적이고 기술적으로 설명해 볼까 한다. 



 하드웨어가 아닌 소프트웨어의 입장에서 약간은 기술적으로 소프트웨어를 정의하자면 '하드웨어를 이용해 데이타를 처리하는 프로그램'이라고 할 수 있다. 다른 걸 처리하는 것도 아니고 딱 한 가지 '데이타'라고 콕 집어 말할 수 있는 거냐. 말할 수 있다. 데이타에 대해선 이 글 후반부에 좀 더 이야기하고 소프트웨어가 데이타를 처리하는 방식에 대한 이야길 먼저 하려 한다. 



 이 글의 독자 상당수는 아마도 아이가 있는 부모일 가능성이 높다는 가정으로, 나와 비슷하게 아이를 둔 세대라면 주산을 잘 하진 못해도 '주판'에 대해 모르진 않을 듯싶다. 주판은 기원전 메소포타미아 지역에서 처음 사용되다가 그리스, 로마, 중국을 거쳐 조선시대 우리나라에까지 전해졌다고 하는데 딱히 뭐다 정의할 필요조차 없을 정도로 주판의 용도는 명확하다. 계산을 도와주는 도구. 



 근데 이 글의 목적을 위해 주판을 굳이 정의해보자면 '덧셈, 뺄셈 그리고 곱셈, 나눗셈까지 단순한 연산에 사용되는 하드웨어 및 소프트웨어 스펙을 제공하는 도구'라고 할 수 있다. 



 그림에서 맨 윗 줄(row)은 한 알에 5를 그 밑에 넉 줄(row)은 한 알에 1을 의미한다. 기준이 되는 열인 1의 자리(보통 주판에는 위 그림과 같이 검은 점으로 기준 자리를 표시해 놓고 있다)에서 왼쪽으로 한 열(column)씩 옮겨갈 때마다 10의 자리, 100의 자리와 같이 자릿수가 변화하는데 이 규칙이 바로 주판에 탑재된 계산 법칙이다. 



 그런데 하드웨어면 하드웨어고 소프트웨어면 소프트웨어지 하드웨어 및 소프트웨어 스펙을 제공하는 도구라는 건 또 뭔가. 그건 바로 주판엔 실제 돌아가는 소프트웨어가 탑재되어 있지 않고 주판을 사용하는 사람이 소프트웨어 역할을 하기 때문이다. 그렇기에 하드웨어도 아니며 우리가 주판을 사용할 때 실제 하드웨어는 우리의 뇌가 된다. 



 주판은 휘발성 강한 우리의 뇌가 계산하는 동안 중간 결괏값을 잊지 않고 이미지로 기억하도록 도와주는 역할을 할 뿐이다. 따라서 주판을 사용하는 사람에 따라 계산의 퍼포먼스가 달라진다. 정확히는 주판에 대한 두뇌 트레이닝이 얼마나 잘 되어 있는가에 따라 계산의 정확도와 속도가 다르다. 



 아는 사람은 알겠지만 9급과 1급의 차이는 엄청나다. 똑같은 주판을 갖고 똑같은 데이터를 처리하는데 소프트웨어가 다르기 때문이다. 1급 정도 되면 실제 물리적인 주판을 사용하지 않더라도 머리로 주판의 이미지를 그려가며 엄청난 속도로 계산을 하게 된다.



 이렇듯 주판은 실제 하드웨어인 우리의 뇌가 연산에 효과적인 방식을 제공함과 동시에 해당 방식을 완전히 익혔을 땐 사람에 따른 뇌가 수행할 수 있는 바운더리 내에서 효율적으로 결과를 산출할 수 있도록 도와주는 도구가 된다. 





 이제 데이타에 대해 생각해보자. 숫자 즉 아무런 인풋이 없다면 아마 주산 1급이라 할지라도 주산의 뇌는 활용되지 않을 것이다. 뇌로 입력되는 숫자 즉 데이타가 있어야 주판의 계산 법칙을 활용해 돌아가는 '나'라는 소프트웨어가 돌아가게 되는 것이다. 이제 '소프트웨어는 데이타를 처리하는 프로그램이다.'라는 말이 어느 정도는 와닿을지도 모르겠다. 

 

 

 그럼 모든 소프트웨어를 다 그렇다고 할 수 있는가? 그렇다. 모든 소프트웨어는 데이타를 처리한다. 엥? 이쯤까지 왔다면 그럼 데이타라는게 도대체 뭔데 싶을 것이다. 소프트웨어나 프로그램이 뭔가 복잡하고 이해하기 어려운 무언가라 생각했는데 이젠 '데이타(Data)'라는 게 더 모호한 기분이 들지도 모른다. 



 아마 데이타를 일반적인 귀납식으로 설명하자면 이것도 데이타 저것도 데이타 기준에 따라 너무나 많은 유형의 데이타로 인해 주구장창 데이타에 대한 설명만 해도 부족하겠지만 데이타가 뭐다는 아주 심플하게 정의할 수 있다. 데이타는 '정보를 구성하는 의미 단위로 기능할 수 있는 것'을 말한다. 



 정보란 사람이 의미 있다고 생각하거나 인지하게 되는 사물, 상황, 감각, 감정 등에 대해 전달될 수 있는 모든 것을 말한다. 그런 정보 그 자체로든 쪼개져서 존재하나 합치면 그 정보가 되는 것이든 정보를 구성하는 의미 단위로 기능하는 건 다 데이타라고 볼 수 있다. 



 우리가 이 글을 통해 이해하려는 '소프트웨어'는 그런 데이타를 처리하는 프로그램이다. 즉 소프트웨어는 프로그램을 말하며 프로그램은 데이타를 처리한다. 





 그럼 프로그램은 어떻게 데이타를 처리하는 걸까? 아무 데이타든 다 처리할 수 있는 걸까? 데이타를 프로그램에 전달하는 건 어떻게 하는 걸까? 처리된 데이타는 어떻게 되는 걸까? 데이타가 제대로 처리되었다는 건 또 어떻게 알 수 있는 것일까? 좀 더 효율적으로 데이타를 처리할 수는 없는 걸까? 



 위와 같은 무수한 질문들에 대한 대답을 탐구하는 분야가 바로 전산학, 컴퓨터공학, 정보통신공학, 소프트웨어 및 데이타과학 분야다. 그러니 빅데이타니 머신러닝이니 온갖 데이타를 처리하고 다루는 일이 각광받는 4차 산업혁명 시대에 소프트웨어가 주인공이 되어버린 것도 이해가 될 것이다. 



 앞서 소프트웨어는 하드웨어와 밀접한 관계가 있다고 했다. 좀 더 강하게 말하자면 소프트웨어는 하드웨어에 의존적이다. 소프트웨어가 아무리 날고 기어도 하드웨어가 갖는 물리적 한계를 벗어나는 동작을 수행할 수는 없다는 건 마치 사람이 저마다 다르듯 하드웨어 또한 고유의 처리하는 방식이란 게 있다는 것과 그 방식 가운데엔 어떤 걸 데이타로 보아 처리 대상으로 받아들일 것이냐 하는 것도 포함된다. 



 현재 우리가 사용하는 컴퓨터는 그 자체로 여러 가지 부속품들의 조합으로 이루어진 하드웨어이지만 소프트웨어가 돌아가는 관점에서 보면 가장 밀접한 하드웨어는 CPU (central processing unit, 우리말로 중앙처리장치라고 하는데 그냥 CPU라고 하는 게 훨씬 낫다)가 될 것이다. 따라서 이제부터 하드웨어라는 말이 나오면 딱히 네트워크라든지 메모리, 스토리지 같은 용어나 다른 부연 설명이 없는 한 CPU 내지는 프로세서를 의미한다고 보면 된다. 



 CPU는 단순하게 ALU(arithmetic logic unit, 연산장치)와 데이타를 담는 그릇 정도로 보면 되는 레지스터(register)들로 구성된 아키텍처를 갖고 있다. 그릇이 아주 크다면 코끼리도 담을 수 있겠지만 (갑자기 냉장고에 코끼리를 넣는 방법이란 난센스가 떠오른다) 그런 그릇을 만들지 않듯이 레지스터가 온갖 종류의 데이타를 다 담을 수 있다면 좋겠지만 그 작은 body에 효율성을 높이려다 보니 레지스터는 아주 작게 만들 수밖에 없다. 그렇다 보니 레지스터에 담을 수 있는 데이타도 그 형태가 정해지게 된다. 



 참고로 CPU의 레지스터는 담는 데이타의 성격에 따라 대충 다섯 가지 종류가 있다. 처리할 데이타를 담는 메모리 데이타 레지스터(Memory Data Register: MDR), RAM에 존재하는 데이타의 주소를 담는 메모리 어드레스 레지스터(Memory Address Register: MAR), RAM에 존재하는 처리명령(instruction)의 주소(address)를 담는 인스트럭션 레지스터(Instruction Register: IR), 다음으로 처리할 명령의 주소를 담는 레지스터인 프로그램 카운터(Program Counter: PC), 계산된 결과를 저장하는 레지스터인 어큐뮬레이터(Accumulator: AC)인데, 이런 레지스터들이 정확하게 어떤 동작을 하고 몇 개씩 있고 프로그램과 맞물려 어떻게 돌아가는지는 알 필요는 없다. 그저 CPU라는 하드웨어가 처리하는 데이터의 성격에 따른 종류가 몇 가지 되고 데이타가 다르면 담는 레지스터도 다르구나 하면 된다. 



 참고로 RAM(Random Access Memory)은 우리가 컴퓨터 살 때 메모리가 8기가, 16기가 할 때 말하는 그 메모리인데 '기가'라는 건 기가바이트(Gigabyte)를 줄여 그렇게 부르는 것이니 메모리의 크기를 이야기할 때 단위는 '바이트(byte)' 임을 알 수 있다. 그러다 보니 메모리의 주소란 것도 특정 바이트의 위치를 의미하는 것이라 생각하면 된다. 



 어쨌든 이 정도의 지식으로 CPU가 어떤 하드웨어인지 유추해보면, 몇 가지 종류의 데이타를 '정해진 명령'에 따라 처리할 수 있게 만들어져 있고 그 몇 가지 데이타라는 것도 종합해보면 메모리에 올라가는 (처리할, 처리한) 데이타와 메모리의 주소 (데이타 주소, 명령 주소, 다음에 처리할 명령 주소) 데이타로 구분된다는 걸 알 수 있다. 


 

 자 이제 우린 CPU가 처리하는 데이타란 결국 '메모리가 저장하고 있는 데이타'와 메모리의 주소 즉 '메모리에서의 위치 데이타' 두 가지라는 걸 알 수 있다. 소프트웨어인 프로그램은 CPU에게 이 두 가지 형태의 데이타를 생성해 넘겨주는 것이다. 



 여기서 '정해진 명령'이라는 걸 좀 더 기술적으로 표현하면 인스트럭션 셋 (instruction set, 명령 집합)이라고 하는데, 단순하게 말해 CPU는 이 인스트럭션 셋을 물리적인 전자회로로 구현해 놓은 거라 보면 된다. 

셋(set, 집합)이란 표현에서 우린 CPU가 처리할 수 있는 명령의 유형과 수가 정해져 있다는 걸 알 수 있다. 따라서 사람이 코딩한 프로그램이 어떻게 만들어졌든 CPU가 실행할 수 있는 상태라면 CPU가 갖고 있는 인스트럭션들로 표현되어야 한다는 것도 유추해 볼 수 있다.



 우린 CPU가 이해하는 이 4가지 구성요소 즉, 인스트럭션과 레지스터, 메모리 데이타와 메모리 주소로 만들어진 프로그램을 우리가 직관적으로 이해하기 힘들다는 뜻으로 '기계어 프로그램'이라고 부른다. 

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari