BOOK

세상을 만드는 글자 코딩

UCANON 2020. 7. 4. 11:36

책을 읽으며

  • 이 책을 구입하고 두 번째 다시 읽으면서 메모한 내용과 이 책을 읽다가 추가로 검색한 내용을 정리했습니다.

  • 코딩과 인문학의 폭넓은 통찰력으로 좋은 책을 남겨주신 작가님께 감사드립니다.

  • 최근 기량이 일취월장하고 있는 신진서 9단에게 패한 박정환 9단이 대국 소감으로 남긴 소감으로, 이 책을 읽은 소감을 대신합니다.

    깨달음이 있었고, 배움이 있었다.


Why do you learn Coding?

스티브 잡스는 코딩은 생각하는 방법을 가르쳐주기 때문에, 모든 사람이 코딩을 배워야 한다고 했다. 빌게이츠는 다시 프로그래머로 돌아가고 싶으며, 친구가 코딩하는 것을 보면 질투심이 느껴진다고 했다.


프로그램 속의 코드

스타크래프트는 550만 줄의 코드로 되어 있다.
윈도우 3.1은 250만 줄.
구글 크롬은 670만 줄.
안드로이드 운영체제는 1,200만 줄
윈도우7은 4,000만 줄
페이스북은 6,200만 줄.
구글 20억 줄.


저작권

저작권은 다른 사람이 복제를 못하게 막을 수 있는 권리입니다.
그러니 내가 쓴 소스코드를 다른 사람이 허락도 받지 않고 Copy and Paste해서 쓴다면 엄연한 불법입니다.
그러나 저작권이 아이디어 자체를 보호해 주지는 못합니다.
아이디어를 다른 사람들이 쓰지 못하도록 보호하고 싶다면 특허권을 받아야 합니다.


마이크로 코드

기계어보다 더 LOW 레벨의 언어가 있습니다.
하드웨어를 제어하는 명령어입니다.
CPU 안에는 마이크로 코드가 프로그래밍되어 있습니다.
이 마이크로 코드는 기계어를 하드웨어를 제어하는 명령어로 다시 번역해줍니다.


기계어

앨런 튜닝이 고안한 튜링 머신도 결국 종이테이프에 적힌 0과 1을 읽어서 동작하는 기계였습니다. 앨런 튜닝의 스승 폰 노이만은 0과 1만 사용해서 누구나 코딩을 할 수 있다고 생각했습니다.


어셈블리어

어셈블리어는 기계어와 1대 1로 매핑해서 치환시켜주는 형태의 언어입니다.
명령어를 모두 외우지 않아도 되는 장점이 있었지만, 컴퓨터에게 이야기하는 방법은 기계어와 같은 형태입니다.
폰 노이만은 어셈블리어의 개발을 반대했다고 합니다. 귀중한 컴퓨터의 자원을 어셈블리어를 기계어로 바꾸는 하찮은 일에 사용되는 것이 아까워서 입니다.
어셈블리어를 기계어 다음에 나온 언어라 2세대 언어라고 부릅니다.


C언어

벨연구소의 켐 톰슨은 PDP-7에서 돌아갈 운영체제 유닉스를 코딩하고 있었습니다.
그런데 한창 코딩을 하던 중에 컴퓨터가 PDP-11이라는 최신 기종으로 바뀌면서 업그레이되는 불상사가 벌어집니다.
PDP-7을 대상으로 작성하던 어셈블리어를 코드를 PDP-11을 대상으로 다시 작성해야 하는 상황에 직면했습니다.
기계어와 어셈블리어는 기계에 따라서 코딩하는 방식이 바뀌어야 했습니다.
이런 문제로 고생하던 데니스 리치는 결국 C언어를 개발하기로 결정합니다. C언어는 기계(CPU)마다 새로 코딩할 필요없이 컴파일러라는 번역기를 통해서 C언어 코드를 기계어 코드를 번역해주는 기능을 제공했습니다.
이렇게 탄생한 C언어를 이용해서 리치와 톰슨은 C언어를 이용해서 유닉스를 개발합니다.

C언어는 B언어 다음에 만들어져서 C언어라고 불림. B언어는 데니스 리치의 친구 켄 톰슨이 만듦.
A언어도 있었음.


자연어의 수

7,099개의 자연어.
5000만 명 이상이 모국어로 사용하는 언어는 23개.
중국어, 스페인어, 영어, 힌두어, 아랍어 순서로 사용됨.
일본어가 9위, 한국어가 12위.
7,720만명이 한국어 사용.


프로그래밍 언어의 수

700개.
사용 순위는 2016년도 기준으로 C, JAVA, Python, C++, R, C##, PHP, Javascript, Ruby, Go.


R언어

R언어는 뉴질랜드 오클랜드 대학에서 개발한 통계계산과 그래픽 처리 전문 언어입니다. 오픈소스이고 무료입니다. 최근에는 빅데이터를 다루기 위해서 R언어를 배우는 사람이 늘고 있습니다.


디지털 신호로 만들어지는 감각

손으로 들어오는 감각 신호나 귀로 들어오는 청각 신호 역시 뇌가 해석하는 것입니다.
손이 없거나 귀가 없더라도 적절한 디지털 데이터를 만들어서 뇌세포에 입력을 하면 우리는 '만진다' 또는 '듣는다'고 착각합니다.
인간이 경험하는 세상이란 결국 뇌가 디지털 데이터를 해석한 세상이기 때문입니다.
그러니 어떤 사람의 뇌에 잘 배열된 0과 1을 집어넣는 것만으로도 그가 무언가를 경하게 만들 수 있습니다.
영화 <매트릭스>는 이런 사실을 기반으로 만들어졌습니다.
초인공지능이 사람의 뇌에 디지털 데이터를 집어넣어서 사람들이 마치 현실을 살아가고 있는 것처럼 착각하게 만든다는 것이 영화의 기본 배경입니다.


우리는 컴퓨터 시뮬레이션 속에 살고 있다

옥스퍼드대학교 교수이자 철학자인 닉 보스트롬은 아예 인류가 컴퓨터 시뮬리에션 속에서 살고 있는 가능성을 주장했습니다. 이것을 모의현실가설이라고 부르는데, 모의현실은 진정한 현실과 구별할 수 없다는 점에서 가상현실과 구별됩니다.

테슬라의 CEO이자 영화 <아이언맨>의 실제 모델로 알려진 일론 머스크는 자신이 정교한 컴퓨터 시뮬레이션 속에 살고 있는 것으로 믿고 있다고 밝혀 사람들에게 충격을 주었습니다.

사실 이런 모의현실가설은 인류 역사에서 새롭게 등장한 것이 아닙니다. 18세기 칸트와 17세기 '의심의 대가'인 데카르트는 자신이 경험하는 모든 상황들이 실제가 아닐 수 있다고 생각했습니다. 플라톤의 이데아론과 장자의 호접몽 역시 이런 모의현실가설과 맥을 같이 합니다.


펌웨어

하드웨어 장치에 포함된 소프트웨어.
소프트웨어를 읽어 실행하거나, 수정되는 것도 가능한 장치를 뜻함.
PC의 바이오스
스마트 폰
다양한 가전 제품


바이오스

운영 체제 중 가장 기본적인 컴퓨터의 입출력을 처리하는 소프트웨어.
PC의 바이오스는 하드웨어 부품을 초기화하고, 검사하는 역할과 부트로더 또는 대용량 저장장치에 저장된 운영체제를 RAM으로 읽어오는 기능을 수행한다.


지능과 의식

사람의 뇌에서 벌어지는 일들 중에 어떤 것이 지능에 의한 것이고 어떤 것이 의식에 이한 것인지를 명확하게 나눌 기준은 없습니다.
만일 우리 뇌에서 수행되는 뉴런 간의 신호 전달 행위가 생물학적으로 기록된 알고리즘이 실행된 결과라면, 어떤 알고리즘이 지능을 관할하고 어떤 알고리즘이 의식을 관할하는지 나누기 힘들 것입니다.
결국 인간 스스로 인간의 의식이나 감정을 이해하지 못하는 한, 기계에서 그와 비슷한 것을 만들어주기는 불가능할 수밖에 없습니다.
영화<매트릭스>에서 인간들은 초인공지능이 만들어낸 가상현실을 살아가지만, 어떤 인간들은 자꾸 이것이 가상현실이라는 것을 눈치챕니다.
그 이유는 초인공지능이 인간의 '의식' 세계는 완벽하게 시뮬레이션했지만, '무의식'의 세계는 제대로 시뮬레이션하지 못했기 때문입니다. 결국 인간의 무의식을 이해하지 못한다면, 인간의 자아, 감정, 마음과 같은 것들을 제대로 흉내 낼 수 없을 것입니다.


앨런 튜닝

독일군 암호 해독을 위해서 최초의 컴퓨터를 만들 사람.
그는 자신이 구상한 기계를 '이산(discreate) 상태 기계'라고 불렀다.
이산(discrete)는 '별개의', '불연속적'이라는 의미를 담고 있다.
즉, 0과 1을 읽어 들이고, 0과 1을 쓰는 '디지털' 기계를 의미한다.
그는 인간의 뇌도 이산 상태의 기계로 간주되어야 한다고 생각했다.


인공지능의 시대, 인간을 다시 묻다

철학자 김재인 교수는 인간이 마음이 무엇인지 이해하지 못하고 있기 때문에 프로그래머가 코딩을 통해서 초인공지능을 만들 수는 없다고 주장했습니다. 다만 그도 뇌의 커넥텀을 복제하는 방식으로는 초인공지능이 만들어질 가능성이 있다고 언급했습니다. 즉, 인간이 마음의 동작 원리를 이해하지 못한다 해도 뇌를 스캔해서 그 정보를 업로드한다면 인간과 같은 지능이 컴퓨터상에서 만들어질 수 있다고 본 것입니다.


뉴런의 신호 전달 방식

인간의 뇌에 들어 있는 신경세포인 뉴런의 신호 전달은 디지털적이다.


인간의 DNA

아리스토텔레스는 생명체 안에 숨겨진 '정보'를 추정했다.
폰 노이만은 이러한 정보가 있어야 함을 수학으로 증명했다.
와슨과 크릭은 이 정보의 정체를 최로로 밝혀냈다.
생명의 설계도는 'DNA'로 밝혀 졌고, 관리자는 'RNA'로 밝혀졌다.
DNA이 안에는 A,T,C,G라는 알파벳 30억개가 나열되어 있다.
아직 우리는 어디까지가 내 코를 만드는 코드이고, 또 내 눈을 만드는 코인지 알 수가 없다.
생명이 있는 존재는 DNA가 있고, 생명이 없는 존재는 DNA가 없다.


프로그래밍된 우주

우주에 존재하는 모든 하드웨어도 다 코딩되었다.
우주가 수학의 언어로 쓰여 있다.
갈릴레오는 "수학은 신이 우주를 쓴 언어다."라고 말했다.


DNA 코드 버그

노화, 햇빛, 발암물질, 방사선 같은 물질이 DNA에 버그를 발생시킨다.
몸에 좋지 않은 음식이나 습관은 DNA에 적힌 글자를 바꾸어 버린다.
새로운 복제시 오류로 인해서 DNA 글자가 바뀌기도 한다.
우리가 건강을 위해서 먹는 식품들, 건강을 위해서 하는 운동들 모두 DNA라는 소스 코드가 잘 보존되록하는 것이다.
우리가 늙거나 병이 드는 이유는 DNA 원본 소스코드에 버그가 발생했기 때문이다.


언어의 비트화

영어 알파벳은 1바이트 (아스키 코드)로 표현이 가능하다.
한글은 1바이트로는 부족하고, 2바이트가 필요하다.


다양한 0과 1을 기록 방법

천공카드는 종이에 구멍을 뚫어서 0과 1을 기록한다.
HDD는 자석을 이용해서 전극(N,S)으로 0과 1을 기록하는 방식이다.
CD과 DVD는 플라스틱 원판에 레이저 빛으로 태워 홈이 파진 부분(피트)을 만들어서 안 파진 부분(랜드)로 0과 1을 기록한다.
플래시 메모리는 반도체 셀 안에 전자를 채우는 방식으로 0과 1을 기록한다. 전자가 채워진 상태와 안 채워진 상태를 0과 1으로 구분한다.
램은 전하를 충전시키면 1, 전하를 방전시키면 0으로 기록한다. 램은 전원이 꺼지면 데이터가 소실되는데, 전원이 켜진 상태에서도 주기적으로 전하를 재충전해서 전하의 유실을 막아야 한다.
인류는 DNA에 글자를 기록하려는 시도를 하고 있다. 지금까지 나온 어떤 물질보다 DNA는 많은 양의 데이터를 기록할 수 있는 저장 매체이다.
DNA는 여러 개의 원자에 하나의 글자를 새기는 방식이라면, 원자에 글을 새기는 방식은 1개의 원자의 1개의 글자를 새기겠다는 시도이다. 이 기술이 현실화 된다면 전세계의 모든 영화를 USB 1개의 담을 수 있게 된다.


메모장

메모장 프로그램은 아스키 코드 테이블 같은 것을 참조해서 0과 1을 우리가 인식할 수 있는 문자로 치환해주는 프로그램이다.


도레미파솔라시

'도레미파솔라시' 음계는 기원전 6세기 피타고라스라는 수학자가 발명했다.
피타고라스는 대장간 앞을 지나다가 대장장이 4명이 서로 다른 망치로 쇠를 내리치는 소리를 듣고, 소리가 발생하는 원리는 공기의 진동에 의한 것임을 알아 차렸다. 그후 그는 공기와 진동수 사이의 연관성을 찾아 '음과 숫자' 사이의 관계를 정립했다. 음을 디지털 코드로 전화한 것이다.


오디오 기기의 헤르츠

헤르츠는 1초에 몇 번 진동하는지를 가르키는 것이다.
262 헤르츠인 '도'는 1초에 262번 진동하는 음인 것이다.


kbps (Kilo Bit Per Second)

320kbps란 초당 320 킬로 개의 0과 1로 음악 파일을 만들었다는 뜻이다.


128kbps로 4분 정도의 음악 파일을 만든다면 파일 크기는?

128kbps 음질로 4분 정도 플레이되는 음악 파일을 만든다면 약 3.9 메가 바이트가 된다.
((128 x 1024) / 8) x 4 = 3,932,160 bytes = 3.9 MB


Pixcel

스마트폰 화면은 수많은 점으로 이루어져 있다.
어떤 스마프폰이 가로 1,440개, 세로 2,560개의 점으로 이루어져 있다면,
1,440 x 2,560 = 3,686,400
약 370만개의 점을 우리는 보는 것이다.


TV의 헤르츠

TV가 120헤르츠라면, 1초에 120번의 모든 점을 바꾸서 표현한다는 뜻이다.
그러니까 200만 화소의 화면이라고 한다면, 1초에 200만개의 점을 찍는 작업을 120번 한다는 뜻이다.
화면 1개의 점을 표현하는데 1개의 점마다 24개의 0과 1이, 즉 3바이트가 필요하다.


이미지 파일

어떤 파일이 너비는 4,128 픽셀, 높이는 2,322 픽셀, 비트의 수준은 24비트라고 가정하자.
이것이 의미하는 바는 가로 4,128개의 점(픽셀)이 찍히고, 세로로 2,322개의 점(픽셀)이 찍히고, 각 점은 24개(3바이트)의 0과 1로 이루어져 있다는 의미이다.


FPS(Frame per Second)

동영상을 보여주기 위해서 초당 몇 장의 사진이 들어갔냐는 의미다.
10fps는 1초에 10장의 사진으로 동영상을 만들었다는 의미다.


압축

BMP 압축은 원을 조금도 손실 시키지 않고 압축하는 방식이다.
이미지에서 반복되는 픽셀을 반복해서 저장시키 않는 방법, 동영상에서 변경된 위치의 정보만을 저장하는 방법 등을 통해서 데이터를 압축한다.


MPEG

동영상 압축 기술을 연구하는 단체인 MPEG는 전 세계의 수많은 전문가가 참여해서 수십 년째 연구 활동을 지속하고 있다.
MPEG에 등록된 특허권의 개수만도 수천 개가 넘는다. 우리는 무심코 TV를 보고, 유튜브로 영상을 보지만 그 안에서 플레이되는 영화들은 수천 개의 특허 기술로 압축되어 있다. 바로 0과 1의 개수를 절약하는 방법에 관한 특허들이다. 그래서 동영상이나 음악을 플레이하는 기계를 만들고 싶은 사람은 기계 1대당 이런 MPEG 같은 단체에 일정 금액을 특허 라이선스 비용으로 지불해야 한다.


인코딩과 디코딩, 그리고 코덱

인코딩은 대상이 되는 글자를 특정 목적을 가지고 바꾸는 것을 의미한다.
인코딩의 반대는 디코딩이다.
글자를 보내려는 컴퓨터는 글자를 인코딩해서 보낸다.
그리고 글자를 받는 컴퓨터는 인코딩된 글자를 디코딩해서 본다.
따라서 인코더와 디코더는 컴퓨터 간의 글자 교환 시에 필수적인 요소다.
이런 인코더와 디코더를 합쳐서 코덱이라고 부른다.


패리티 비트

데이터 복사 시 데이터의 오류 발생 여부를 검사하는 가장 쉬운 것은 패리티 비트를 사용하는 것이다. 이 기법은 일정 길이의 글자마다 에러 검출을 위한 비트를 집어 넣는 것이다.
예를 들어 짝수 규칙을 따르는 경우에는 전체 데이터의 1의 개수가 짝수가 되도록 패리티 비티를 삽입하는 것이다.
짝수 규칙으로 한다면, 10101100인 경우 0을 패리티 비트로 넣는다.


체크섬(Checksum)

체크섬은 0과 1이 중간에 바뀌지 않았는지 체크할 수 있는 체크용 비트를 더 보내는 것이다
10101001 // 전송 글자 1
00111001 // 전송 글자 2
11100010 // 두 글자의 합계
00011101 // 합계의 보수
10101001 00111001 00011101 // 보내는 글자
글자를 수신한 시스템에서는 수신받은 글자 3개를 모두 더해서 11111111 이 나오면 수신한 글자의 오류가 없다고 판단하고, 아니면 오류가 있다고 판단해서 다시 데이터를 보내달라고 요청합니다.


CPU

CPU는 복사하기, 연산(더하기,빼기,곱하기,나누기,AND,OR,NOT)하거나, 분기(점프) 밖에 할줄 모른다. AND, OR, 곱하기, 더하기, 나누기 등을 여러번 했을 뿐인데 알파고가 바둑을 두고, 자동차가 자율 주행을 하는 것이다.
프로그래머가 코딩한 소스코드는 모두 복사, 연산, 분기로 분해되어 번역된다. 컴퓨터는 이런 단순 명령을 어려 번 실행해서 우리를 인터넷 서핑이 가능하도록 해준다.


CPU 헤르츠

3.5 기가 헤르츠의 클럭(Clock) 스피트를 갖는 CPU는 이런 단순 명령을 1초에 35억번 실행할 수 있는 CPU이다. 저차원적인 단순 명령이 초당 수십억번 실행되면 우리 눈앞에는 고차원적인 일들이 펼쳐진다.


프로토콜

인터넷이라는 길이 열린다고 해서 서로 다른 2대의 컴퓨터가 글자를 주고 받을 수 있는 것은 아니다. 둘 사이에는 사전에 약속이 있어야 한다.
봉화 신호 체계처럼 횟불 몇 개가 어떤 신호인지를 약속해 두어야 한다.
이런 네트워크 상에서의 약속을 '프로토콜'이라고 한다.
이 약속이 지켜지지 않은면 컴퓨터 간의 통신은 불가능하다.


HTTP(HyperText Transfer Protocol)

컴퓨터에서 웹브라우저를 실행해서 웹서버로부터 웹페이지를 받을 때 사용하는 약속은 HTTP다. 이 약속은 웹 브라우저 웹서버로 HTML 문서를 어떻게 요청할 것인지 같은 것을 정해 놓았다. 웹브라우저의 주소창에 'http://'라고 쓰는 것 자체가 이 약속에 따라서 글자를 보내겠다는 뜻이다.


TCP(Transmission Control Protocol)

HTTP라는 약속은 다시 TCP이라는 약속을 따른다. 이 TCP에 따르면, 글자를 보내려는 컴퓨터가 상대방에게 먼저 메시지를 보낸다. 그러면 상대방은 나도 글자를 받을 준비가 되었다는 응답 메시지를 보낸다. 그 후 글자를 보내려는 컴퓨터가 상대방에게도 응답 메시지를 보낸다. 이렇게 약속대로 메시지를 주고받고 나면 두 컴퓨터는 연결 상태가 된다.


IP(Internet Protocol)

TCP라는 IP라는 약속을 따른다. IP는 우리가 주소라고 부를 때 그 IP이다. 컴퓨터끼리 글자를 주고 받을 때, 주는 컴퓨터와 받는 컴퓨터는 각자 주소를 갖고 있어야 한다. IP라는 약속에는 주소를 부여하는 법, 받는 주소와 보내는 주소를 쓰는 방법 같은 것이 정의 되어 있다. 인터넷이라는 길을 통해서 글자를 보내고자 하는 컴퓨터는 모두 IP 주소를 가지고 있다.


책을 읽으면서 인터넷을 통해서 조사한 컨텐츠


유니코드

  • 컴퓨터 초기에는 1바이트에 영어와 특수문자, 그리고 남은 공간에 자국어를 할당에서 사용했다. 그런데 문제는 이 데이터를 다른 언어를 사용하는 곳에서 컴퓨터를 통해서 열어보면 자국어를 표시하는 부분이 모두 깨지게 되었다. 그리하여 국제적으로 전세계 언어를 모두 표시할 수 있는 표준이 필요해졌고, 이것이 유니코드(Unicode)이다.
  • 전 세계의 모든 문자를 다루도록 설계된 표준 문자 전산 처리 방식유니 코드를 사용하면 한글과 신자체, 간체자, 아랍 문자 등을 통일된 환경에서 깨뜨리지 않고 사용할 수 있다.
  • 유니코드는 가변 인코딩 방식이다. 쉬운 말로 말하면 글자마다 Byte 길이가 다르다는 것이다. 'a'는 1Byte이고, '가'는 3Byte이다. 가변을 구분하기 위해서 첫 바이트에 표식을 넣었는데 2Byte는 110으로 시작하고 3Byte는 1110으로 시작한다. 나머지 바이트는 10으로 시작한다.

Reference :: 나무위키-유니코드


UTF-8

UTF-8은 유니코드를 인코딩(encoding)하는 방식으로, 컴퓨터에 저장하기 위해서 0과 1을 이용해서 유니코드를 컴퓨터에 저장하기 위한 약속이다.

Reference :: Unicode와 UTF-8 간단히 이해하기


UTF-8 방식으로 저장한 글자의 바이트 체크 연습

  • 영문자 1바이트, 숫자 1바이트, 한글 3바이트
  • ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789가나다라마바사아자차카타파하
    • 위 같이 텍스트를 파일에 저장하면
    • 알파벳 대문자 26개 : 26바이트
    • 알파벳 소문자 26개 : 26바이트
    • 숫자 10개 : 10바이트
    • 한글 14개 : 52바이트
    • 모두 합치면 102 바이트이다.

Reference :: Unicode와 UTF-8 간단히 이해하기, Javascript로 UTF-8 바이트 길이 계산하기


DNA

개개인마다 다른, 고유의 유전 정보를 담고 있습니다. 유전 정보는 어떠한 세포들을 만들어야 하는지, 몸속 장기부터 전체적인 모습까지 어떻게 구성해야할지에 대한 정보라고 할 수 있습니다. 결국 우리 몸에 필요한 단백질을 적재적소에 만들기 위한 정보입니다.

Reference :: 동아사이언스 - DNA는 알겠는데 RNA는 뭐지?


RNA

DNA가 지령한 정보를 해석한 뒤, 단백질을 만드는 곳에 전달하는 역할을 하는 것이 RNA입니다. 비유하자면 신제품을 만드는 설계자(DNA)가 있다고 합시다. 그럼 누군가 설계도면을 공장에 가져다 줘야 합니다. 공장의 기술자들은 전달된 도면을 보면서 재료(아미노산)을 주문하고, 재료가 공장에 도착하면 설계 도면에 맞게 조립해서 완제품(단백질)을 만들어 낼 것입니다.단계별로 보자면 DNA의 설계도면을 공장에 전달하는 것이 RNA입니다.

Reference :: 동아사이언스 - DNA는 알겠는데 RNA는 뭐지?