데이타와 프로그램의 재구성, 그리고 컴파일러
우린 일상에서 '정보를 처리'한다는 말을 종종 보거나 듣는다. 정보처리기사 같은 자격증도 있고, 이건 데이타를 처리하는 것과는 뭔가 다른 뉘앙스로 쓰인다는 것도 어렴풋이 알고 있다. 뭐가 다른 것일까? 데이타를 처리하는 게 결국 정보를 처리하는 거 아닌가?
비슷해 보이는 둘의 차이는 정보와 데이타를 구분하면 간단히 해결된다. 아래 텍스트는 2022년 8월 17일 오후 3시 30분에 인터넷에 올라온 기사 중 일부를 발췌한 것이다.
17일 서울 용산구 대통령실에서 '대통령에게 듣는다'를 주제로 진행된 기자회견은 윤 대통령이 모두 발언에 이어 취재기자들의 질문에 답하는 순서로 진행됐다. 윤 대통령이 그간의 성과를 발표한 모두발언은 20분, 질의응답은 30분 안팎의 시간이 할애됐다. 기자회견장에 참석한 기자들 120여 명 중 질문을 원하는 기자들이 손을 들면 강인선 대변인이 질문자를 선정했다.
위 텍스트에서 정보는 뭐고 데이타는 뭘까?
난센스 같겠지만 전달하려는 내용은 정보이고 텍스트 자체는 데이타다. 텍스트 자체라는 건 17, 20, 30, 120 같은 숫자들, 따옴표나 마침표 같은 문장부호를 포함한 문자 일체를 의미한다.
정보는 true or false 즉 진위여부 혹은 사실여부의 판단 대상이다. 이와는 달리 데이타는 존재 여부에 대한 판단 대상이 될 뿐이다. 실제로 존재하지 않는 데이타를 존재하는 것인 양 정보를 생성했을 때 우린 그 엉터리 데이타를 '거짓데이타' 속어로 '가라데이타'라고 한다.
IT 쪽에서도 아카데미든 산업계든 '가라데이타'라는 말이 간혹 나오기도 하는데, 보통은 예상치 못한 결과를 받아들여야 할 경우나 신뢰성 없는 테스트 혹은 사람의 통계치, 실험 결과 그래프 같은 걸 보게 되었을 때 '어떻게 저런 값이 나와? 가라데이타 넣고 조작한 거 아냐?' 같은 말을 하기도 한다.
위 기사 텍스트의 경우 기자가 작성해(만들어) 온라인 미디어에 이미 게재한 데이타로 우린 이런 의문을 가질 수 있다. 만약 위 기사에서 '대통령에게 듣는다'라는 주제 문장이 원래는 '대통령에게 듣는다'가 아니라 '대통령이 말한다'였다면? 기자는 거짓데이타를 삽입한 것이다.
그러나 '위 텍스트엔 거짓데이타가 삽입되었다'라고 말하는 것은 항상 참일까?
그렇지 않다. 왜냐하면 위 텍스트가 웹에 발행된 이후 위 텍스트로부터 요구하는 정보가 '사실관계가 확인된 정확한 기사 내용'인 경우는 참일지 몰라도, 기사를 작성한 OOO기자가 2022년 8월 17일 작성한 기사의 글자 수는? 과 같은 정보를 요구한다면 거짓데이타는 존재하지 않게 되기 때문이다.
우린 정보를 구성하는 요소가 데이타라는 걸 이미 알고 있다. 중요한 건 똑같은 데이타로부터 어떤 정보를 요구하는 가이다.
기자가 작성한 의도대로라면,
17일 서울 용산구 대통령실에서 '대통령에게 듣는다'를 주제로 진행된 기자회견은 윤 대통령이 모두 발언에 이어 취재기자들의 질문에 답하는 순서로 진행됐다.
윤 대통령이 그간의 성과를 발표한 모두발언은 20분, 질의응답은 30분 안팎의 시간이 할애됐다.
기자회견장에 참석한 기자들 120여 명 중 질문을 원하는 기자들이 손을 들면 강인선 대변인이 질문자를 선정했다.
일차적으로는 이렇게 각각의 문장 내용이 정보일 것이고, 보다 인사이트 있는 독자들까지 감안한다면 겨우 30분 안팎의 질의응답 시간으로 인해 기자회견장에 참석했던 120명의 기자들 입장에선 질문 기회를 얻지 못해 답답했을 거란 것, 또 그렇게 진행한 이유가 최근의 윤 대통령의 행보와 관련해 뭔가 꺼리는 게 있어서라든지 많은 질문시간을 허용했던 이전 정부와의 차이를 부각하고자 함이거나 강인선 대변인이 선정한 질문자들은 120명 중 미리 선정된 건 아니었는지에 대한 의구심 등도 의도된 정보일 수 있다.
따라서 위와 같은 정보를 구성하는 데이타 집합은 한 글자 한 글자가 아닌 '17일', '서울 용산구 대통령실에서', '... 선정했다' 같은 문맥 위주의 단어 및 단어들의 조합으로 인식될 것이다.
그러나 기자의 의도가 어찌 되었든, 8월 17일 오후 3시 이후 해당 기자가 미디어에 작성한 기사의 한글 문자 수가 얼마나 되는지를 요청하는 편집장의 입장에선 정보는 글자 수가 되고 글자 수에 포함되는 각 한글 문자들이 모두 데이타가 된다.
이렇듯 동일한 텍스트도 어떤 정보를 요청하는가에 따라 전혀 다른 데이타로 해석된다는 것을 알 수 있다. 바로 데이타를 바라보는 '뷰'가 다르기 때문이다.
빅데이타 시대를 살고 있는 우린 너무도 빈번하게 이를 체감하며 살아가고 있다. 시시각각 쏟아지는 텍스트, 이미지, 소리, 영상, 센서, 트랜잭션 데이타들이 각종 정보로 재구성되어 우리가 의도했는지와는 관계없이 다양하게 제공되거나 활용되기 때문이다.
요즘 유행하는 '마이데이타'라는 것도 결국 데이타를 다양한 정보로 재구성할 수 있음에 다름 아니다. 스마트폰으로 금융업무 혹은 주식거래 등을 해본 사람이라면 '지금 마이데이타 신청 버튼을 누르면 커피 한 잔 쏜다!'와 같은 할까 말까 망설여지는 문구를 본 적이 있을 것이다. 금융기관이나 특정 서비스를 제공하는 업체들은 스타벅스 커피 한 잔 값에 나의 어떤 행위에 의해 생성된 개인정보 및 금융데이타들을 한데 모아 각종 다른 '뷰'로 재조합해 활용할 권리를 사려한다. 나 그리고 다른 사람들의 데이타들로부터 추출될 정보들이 비즈니스적으로 그들이 지불한 비용 '사람 수 X 커피 쿠폰 값' 보다 큰 가치를 지니기 때문이다.
이렇듯 문자들의 조합으로 만들어진 의미 있는 단어들을 데이타로 볼 것인지, 글자 자체를 데이타로 볼 것인지, 그중 일부를 재조합한 것을 데이타로 볼 것인지에 따라 그 소스가 되는 데이타(source data) 엄밀히 말해 데이타 셋은 전혀 다른 데이타들의 집합이 된다.
이것이 왜 중요하냐면 컴퓨터가 바로 정보를 처리하는 시스템이기 때문이다. 앞서 컴퓨터의 가장 중심이 되는 하드웨어인 CPU는 레지스터를 통해 메모리에 쓰인 무언가를 읽어 들여 명령 인스트럭션이나 데이타로 처리한다고 했다. 그리고 전기전자적 소자들로 만들어진 메모리엔 모든 내용이 0과 1의 배열로 표현된다고도 했다.
따라서 일단 메모리에 올라오면 프로그램도 마찬가지이고 데이타도 마찬가지다.
0010100010101001010101010001111011011111110... 와 같이 메모리에 0과 1의 배열로 표현된 프로그램 코드와 데이타가 유의미한 단위로 구분되고 조합되어 이건 명령어, 이건 데이타, 이건 데이타가 위치한 메모리 어딘가의 주소 등으로 해석되려면 그렇게 해석하는 규칙 같은 게 있어야 할 것이다.
그리고 0010100010101001010101010001111011011111110... 배열은 프로그램의 코드 영역은 어디부터 어디까지인지, 프로그램 내에서 선언된 변수나 상수값은 어디에 위치하는지, 실제로 처리되는 데이타들은 어디에서 읽어 들일 것인지 한 번에 처리되어야 하는 0과 1의 덩어리는 어디부터 어디까지인지 그리고 그 덩어리는 어떻게 해석할 것인지 등 프로세서가 갖고 있는 뷰 즉 정보를 어떻게 해석할 것인가에 관한 규칙대로 재조합된 것이다.
그럼 누가 언제 재조합한 걸까?
우리가 코드를 작성하면 우린 그걸 프로그램이라 부른다. 프로그래밍 책을 보며 나와있는 예시대로 에디터에 쳐본 사람도 있을 것이고 그냥 눈으로만 보고 만 사람도 있을 것이나 전혀 코드란 게 어떻게 생겨먹은 건지 모르는 사람들을 위해 오래전 한 회사에서 내가 썼던 C++(프로그래밍 언어 이름) 코드 중 일부를 가져와 봤다. 아래처럼 생겼는데 우리가 작성하는 프로그램은 0과 1이 아니라 대략 이렇게 생겨먹었구나 생각하면 된다.
개발자가 아닌 다음에야 위 코드 역시 외계어로 보일 수 있지만 어쨌든 맨 윗부분에는 한글도 보이고, Global이니 Transaction, Count, Node, List, Coordinator 같은 영어 단어들이 보일 것이다. 문법을 몰라 그렇지 그래도 사람이 쓴 거구나 하는 느낌이 온다.
이 프로그램이 0과 1의 배열로 바뀌면서 프로세서가 처리 가능한 블록들로 재조합되는 것이다.
우린 이 과정을 컴파일(compile)이라고 하며 이걸 하는 별도의 소프트웨어를 컴파일러(compiler)라고 부른다. 어렵게 생각할 것 없다. 사람이 작성한 프로그램 파일을 프로세서가 이해할 수 있는 기계어 파일로 바꿔주는 것뿐이다.
따라서 컴파일러가 없다면? (혹시나 싶어 얘기지만 당장은 어디선가 들어봤을 '인터프리터'같이 다른 방식으로 프로그램을 인식하는 방식에 대해서는 무시하자) 우리가 수개월 혹은 수 년동안 아무리 머릴 싸매고 설계해서 코드를 작성해봐야 돌아가지 않는 일반 텍스트 파일일 뿐이다.
즉 컴파일러는 하드웨어인 프로세서가 갖고 있는 규칙대로 위와 같은 대상 프로그램을 0과 1로 재구성해주는 기능을 갖고 있는 소프트웨어다. 그러다 보니 컴파일러는 하드웨어인 프로세서의 스펙은 물론 프로그래밍 언어가 갖고 있는 문법과 특이사항에 대해서도 알고 있어야 한다. 그래서 컴파일러는 프로그래밍 언어마다 별도로 존재하게 된다. 뭐 여러 회사 혹은 개발자가 만들 수 있으니 하나의 프로그래밍 언어 당 다수의 컴파일러가 존재할 수도 있다.
우리가 익히 아는 윈도우즈(Windows)나 리눅스(Linux), MacOS 같은 OS도 소프트웨어다. 프로그램이란 얘기고 각각의 OS를 작성한 언어의 컴파일러로 컴파일된 프로그램으로 컴퓨터 전원이 꺼져도 지워지지 않는 어딘가에 저장되어 있다. 그리고 컴퓨터는 전원을 켜면 항상 정해진 그곳부터 읽어 들여 실행하도록 만들어져 있기에 늘 우리가 같은 화면을 보게 되는 것이다.