프로그래밍 – SK hynix Newsroom 'SK하이닉스 뉴스룸'은 SK하이닉스의 다양한 소식과 반도체 시장의 변화하는 트렌드를 전달합니다 Fri, 14 Feb 2025 08:07:51 +0000 ko-KR hourly 1 https://wordpress.org/?v=6.7.1 https://skhynix-prd-data.s3.ap-northeast-2.amazonaws.com/wp-content/uploads/2024/12/ico_favi-150x150.png 프로그래밍 – SK hynix Newsroom 32 32 [인공지능과 반도체 1편] 챗GPT 등 인공지능의 시대 : 프로그래밍과 인공지능, 그리고 GPU의 등장 (1/7) /jeonginseong-column-ai-1/ /jeonginseong-column-ai-1/#respond Thu, 23 Feb 2023 15:00:00 +0000 http://localhost:8080/jeonginseong-column-ai-1/ 인공지능(AI, Artificial Intelligence)은 최근 전 세계를 가장 뜨겁게 달구는 키워드다. 그래서 SK하이닉스 뉴스룸에서는 [인공지능 반도체] 코너를 마련, 인공지능 전문가 정인성 작가와 함께 총 일곱 편의 기고문을 연재할 예정이다.

이번 연재는 컴퓨터와 반도체의 관점에서 인공지능을 살펴볼 것이다. 기존의 프로그램이 인공지능으로 바뀌면서 0과 1의 세계가 구체적으로 어떻게 변화하는 것인지 알아보고, 이를 실행하는 데 필수적인 반도체는 어떤 중요한 역할을 해야 하는지 확인해볼 것이다. 이를 통해 반도체는 인공지능을 포함한 새로운 ICT 기술의 등장에도 두려워하기보다는 세상을 변화시킬 혁명의 주인공이 될 것이다. (필자 주)

전통적 프로그램이 동작하는 방식

우리는 이미 20년 전에도 컴퓨터 없는 세상을 상상할 수 없었다. 21세기 초, 인터넷 뱅킹이 생겨나기 시작했고, 각종 인터넷 쇼핑몰이 생겨났다. 수많은 회사가 엑셀과 같은 스프레드시트 프로그램을 사용해 회계 작업의 효율성을 높였고, 워드프로세서 프로그램들을 통해 수기 작업을 대체했다. 이후에는 개별 컴퓨터에 보관되던 작업물이 중앙 서버에 집중되기 시작했고, 각 직원은 자신의 물리적 위치에 구애받지 않고 일할 수 있게 됐다. 그렇다면 의문이 하나 생길 것이다. 대체 프로그램이란 무엇인가?

간단한 예를 들어 보자. 한 직원이 문서 내의 모든 행에 있는 숫자를 합하는 프로그램을 만들고 싶어 한다고 가정해보겠다. 그리고 현재 문서가 다섯 줄이라면 어떻게 해야 할까? 제일 첫 단계는 일단 ‘사람이라면 어떻게 하는지’ 고민하는 것이다. 아마도 마음속에 제일 먼저 떠오르는 것은 무언가를 ‘다섯 번 반복’하면 된다는 사실일 것이다.

▲ 그림 1 : 무언가를 다섯 번 반복하기 위한 코드의 흐름

하지만 이렇게 다섯 번 반복해서는 의미가 없다. 수를 모두 합해야 하기 때문이다. 반복할 때마다 사라지지 않고 누적되는 어떤 값을 만들어야 한다. 따라서 프로그램을 다음과 같이 개조할 수 있다.

▲ 그림 2 : 다섯 줄의 숫자를 합하는 프로그램의 흐름

해냈다! 드디어 프로그램의 구조를 만들었다. 이제 이 순서도에 맞춰서 프로그래밍 언어로 코드를 만들면 된다. 파이썬(Python)*이라는 프로그래밍 언어로 만든다면 아래와 같은 모습이 될 것이다. 프로그래밍 언어를 모르는 사람이라도, 아래 코드를 읽는 것에는 큰 어려움이 없을 것이다.

* 파이썬(Python) : 귀도 반 로썸(Guido van Rossum)이 개발한 프로그래밍 언어. 초보자도 사용하기 편하다는 특징이 있다.

▲ 그림 3 : 완성된 다섯 줄의 숫자를 합하는 파이썬 프로그램 코드

만약 지금 만든 프로그램을 다섯 줄의 한계 없이, 어떤 데이터가 입력되더라도 파일의 끝까지 더하는 프로그램으로 개선하고 싶다면 어떻게 해야 할까? 아마도 ‘다섯 번 반복’을 무언가 다른 것으로 바꿔야 한다는 짐작이 가능할 것이다. 다행히도 이미 ‘누군가’가 파일을 읽을 때 EOF(End of File)을 알려주는 기능을 추가했다. 이 기능을 활용하면 된다. 위 그림에서 빨간 네모 친 부분을 바꾸면 된다는 의미다.

이렇게 우리는 전통적 프로그램을 완성하고, 개선까지 해냈다. 우리는 이 과정에서 여러 가지 사실을 알 수 있다. 가장 중요한 것은 순서도를 만드는 것이다. 시키고 싶은 작업이 있다면, 프로그래밍 언어는 달라도 순서도의 모습 자체는 동일하다는 것을 명심해야 한다. 다시 말하면, 순서도를 떠올리지 못하면 프로그램을 만들 수 없다는 의미다.

또, 한 가지 사실은 프로그램을 만드는 과정에서 ‘누군가’ 다른 사람이 만든 코드에 크게 의존하게 된다는 것이다. 사실 위에서 구체적으로 언급하지는 않았지만, EOF 확인 이외에도 ‘파일을 읽는 것’, ‘모니터에 출력하는 것’ 등 역시 다른 누군가가 만든 함수다. 이런 기능들은 운영체제(OS, Operating System)가 제공하기도 하며, 누군가 다른 사람이 특정 프로그래밍 언어로 만들어 두기도 한다. 프로그래머들은 프로그래밍을 시작하기 전 이런 다양한 요소들을 고려한다. 예를 들어, 만약 내가 만들고 싶은 프로그램을 개발하기 위해선 데이터를 매우 특별한 방식으로 바꿔야 하는데, 그 기능이 자바(Java)*에 이미 존재한다면 자바로 코드를 만드는 것이 효율적이다.

우리가 매일 사용하는 워드프로세서, 스프레드시트, 웹 브라우저 등 대부분의 프로그램이 위와 같은 작업을 통해 만들어진 것이다. 그렇다면 인공지능 시대에는 무엇이 바뀌는 것일까?

* 자바(Java) : 오라클(Oracle)사가 개발한 프로그래밍 언어의 일종

신경망과 인공지능

위에서 우리가 살펴본 프로그래밍 방법은 완벽한 것 같지만 사실은 그렇지 않다. 여기에는 두 가지 문제가 있다. 하나는 프로그램이 스스로 배우지 못한다는 것이다. 우리는 프로그램을 고치기 위해 순서도를 고쳐야 했다. ‘다섯 번 루프’를 ‘EOF로 대체하지 않는 이상, 프로그램은 영원히 파일의 첫 다섯 줄만을 가져와 처리했을 것이다.

더 큰 문제는 따로 있다. 바로 인간이 순서도를 만들지 못하는 프로그램은 만들 수 없다는 것이다. 프로그래밍의 첫 단계를 해내지 못하니 다음 단계로 가지 못하는 것이다.

사진이 입력되면 동물의 종류(개와 고양이)를 구분하는 프로그램을 만들어야 한다고 해 보자. 여러분은 개와 고양이를 어떻게 구분하는가? 아마 바로 떠오르는 것은 주둥이의 모습일 것이다. 그래서 아래와 같은 순서도를 만들었다고 해 보자.

▲ 그림 4 : 개와 고양이를 구분하는 간단한 프로그램의 흐름

그런데 문제가 생긴다. 누군가 동물 주둥이가 가려진 사진을 두 개 가지고 온 것이다. 이제 프로그램이 작동하지 않는다. 프로그래머는 놀라 허겁지겁 새로운 알고리즘을 만들기로 한다. 눈동자의 모양을 확인하는 코드를 추가하면 개와 고양이의 구분이 가능할 것이다. 하지만 새로운 개, 고양이 사진을 가지고 올 때마다 이런 일이 계속 생겨날 것이다. 위와 같은 순서도 기반의 프로그램으로는 도저히 개와 고양이를 구분하는 안정적인 프로그램을 만들 수 없을 것이다. 현실에서는 개와 고양이를 구분하는 눈, 코 등의 요소들을 찾아내는 것도 힘든데, ‘주둥이, 눈동자 모양’만 골라내는 코드를 만드는 것 역시 매우 힘들다. 특정 사진에서는 쉽게 찾아낼 수도 있지만, 수백만 개의 다양한 사진에서 특정 요소를 골라내기는 매우 어려운 일이다.

▲ 그림 5 : 개와 고양이 구분하는 프로그램을 구성하기란 매우 어렵다.

하지만 인간은 사진을 보면 ‘척 보면 딱’ 개와 고양이를 구분해낸다. 스스로 어떻게 구분했는지는 잘 모르지만, 할 수 있다. 그렇다면, 인간과 비슷한 구조의 프로그램을 만든다면 어떻게 동작하는지는 몰라도, 개와 고양이를 잘 구분할 수 있게 될 것이라는 가정이 가능하다. 따라서 아래의 구조와 같은 프로그램을 만들어 보게 된다. 이제 프로그램에는 순서도가 없고, 수 없이 연결된 인공적인 신경세포가 가득하다. 이를 ‘인공신경망’이라 부른다.

인공신경망의 입력 부분에 사진을 투입하면, 출력 부분에서는 개인지 고양이인지가 출력되는 것이다. 이제 프로그래머가 해야 하는 일은 저 수많은(수백만~수백억 개) 신경세포들 사이의 연결 강도를 지정해 주는 것이다. 하지만 순서도가 없으니 각 세포가 뭘 하는 것인지 하는지 알 수가 없다. 개와 고양이를 구분하기위해 첫 번째, 두 번째… 백만 번째 인공 뇌세포는 무엇을 해야 하는 건지 어떻게 알 수 있겠는가? 이 문제로 인해 인공신경망이라는 개념은 1960년대에 처음 등장했음에도 50년 가까운 세월 동안 빛을 보지 못했다. 우리가 학습이라고 부르는 것은 일종의 프로그래밍 방법이다.

▲ 그림 6 : 인공신경망이 동작하는 방식

* 입력층 : 입력을 받아들이는 층
* 은닉층 : 입력층으로부터 입력값을 받아 가중치를 계산하는 부분으로 가중치의 수정으로 인한 학습이 진행되는 층
* 출력층 : 결과를 출력하는 층

오랜 연구 끝에, 과학자들은 역전파(Backpropagation)*, 초깃값 세팅 등 다양한 방법을 개발했다. 위 방법들과 함께 대량의 학습 데이터를 투입할 경우, 우리들이 개별 세포들의 역할을 모르더라도 잘 동작하는 프로그램, 즉 인공지능을 만들 수 있게 된 것이다. 이렇게 해서 새로운 세상이 열리게 됐다. 새로운 이론들을 통해 신경망을 학습시키자, 신경망 내 다양한 은닉층은 각자의 역할을 가질 수 있게 됐다.

* 역전파(Backpropagation) : 맨 마지막 층의 값부터 비교하는 방법으로 학습하면서 차례차례 역으로 원하는 곳까지의 결과값을 얻어내는 과정

이 대목에서 우리는 반도체 엔지니어들이 인공지능 기술을 어떻게 접근해야 하는지 알 수 있다. 예를 들면, 우리가 인공지능의 ‘학습’이라고 부르는 것은 결국 수백만 개가 넘는 인공 뉴런 사이의 연결 세기를 ‘제대로’ 지정해 주는 일이었을 뿐이다. 반도체 엔지니어가 인공지능에 접근하는 방법에 대해 다음 예를 통해 설명해보겠다.

▲ 그림 7 : 인간의 얼굴을 찾아내는 가상의 인공신경망 예

<그림7>의 예는 사람의 얼굴만을 골라내 출력하는 가상의 인공신경망이다. 우리가 이 신경망을 구성한 뒤 학습시키게 되면, 각 층은 대략 위와 같은 역할을 가지게 된다. 일단 입력층에 가까운 은닉층이 원, 가로선, 세로선, 대각선 등 특정 도형들에 활성화가 되게 학습된다. 그다음 은닉층은 인간의 얼굴을 찾기 위해, 눈 코 입 등을 찾으려 한다. 이때 사진 원본 대신 그 전 단계 은닉층이 제공해준 정보를 사용하는 것이다.

눈을 탐지하는 은닉층은 눈이라는 신체 부위의 특징상, 원에는 크게 반응해야 하지만, 세로선에는 거의 반응하지 않아야 할 것이다. 만약 입을 찾아야 한다면, 가로선이 가장 중요하고 세로선은 별로 중요하지 않을 것이다. 과학자들이 발견한 학습 방법론의 의의는 사람이 일일이 눈, 코, 입 등을 얼굴 구분에 중요한 요소를 지정해주지 않아도 데이터만 투입해 주면 자동으로 내부의 신경망이 층을 나눠 위와 같은 역할을 가지게 만들 수 있다는 것이었다.

당연하지만 인공신경망을 키우고 은닉층이 깊어질수록 더욱 세밀한 분석을 할 수 있게 된다. 더 많은 은닉층이 있다면, 대각선에 반응하는 선이 학습 과정에서 생겨날 수 있고, 눈과 코 출력 결과를 또 모아서 눈과 코 사이의 거리를 확인하는 세 번째 은닉층이 생길 수도 있다. 이 과정에서 점점 인간 얼굴을 구성하는 더 많은 요소를 고려할 수 있게 되며, 정확도가 높아지게 되는 것이다.

현재 인공지능의 학습이란 것은 수많은 소수점을 변경하고 저장하는 것을 반복하는 것이다.’

이것이 여러분이 반도체를 알기 위해서 프로그램을 이해해야 하는 이유다. 위와 같은 이해를 해야만 이후 중요한 변화가 생겼을 때 대응할 수 있다. 만약 인공지능 기술의 트렌드가 바뀌어, 신경망의 크기가 매우 작아지면? 역전파를 대체할 학습 방법론이 생겨나면? 이런 세세한 트렌드 변화는 프로그램들이 원하는 반도체의 특성을 바꾼다. 만약 ‘인공지능은 큰 메모리가 필요하다’라고 암기식으로 접근한다면, 이때 잘못된 결론을 내리게 될 것이다.

프로그램을 위해 진화해 온 CPU

반도체 입장에서의 프로그램을 조금 더 자세하게 살펴보자. 앞서 우리는 순서도 기반으로 만들어진 프로그램을 살펴봤다. 이런 프로그램들은 그 자체로는 의미가 없으며, CPU(Central Processing Unit, 중앙처리장치)가 있어야만 의미를 가진다. 프로그래머는 앞서 만든 순서도를 컴퓨터가 이해하는 기계어로 변환한 뒤, 메모리에 저장한 다음 CPU에 프로그램을 실행해 달라고 요청하는 것이다.

위 예에서 알 수 있지만, 프로그램을 수행하기 위해서는 크게 세 가지의 연산 종류가 필요함을 알 수 있다. 하나는 덧셈, 뺄셈 등의 사칙연산, 메모리 입출력, 비교와 분기다. 분기라는 것은 조건에 맞춰 선택지를 택하는 것을 의미한다. 인간 입장에서 ‘1부터 5까지 더한다’라는 작업은 컴퓨터 입장에선 아래와 같이 보이게 된다. 일반적으로 CPU 내부에 레지스터라는 고속 저장소가 있으므로, 변수 2개(N, S) 정도는 메모리 접근 없이 처리할 수 있지만 설명을 간단히 하기 위해 이런 부분은 과감히 생략하겠다.

▲ 그림 8 : 연산 칩 입장에서 1에서 5까지 더하는 프로그램의 흐름과 CPU와 메모리의 역할

위 작업을 분석해 보면 메모리 접근과 산술 연산이 매우 빈번하지만, 분기 역시 자주 발생함을 알 수 있다. 이와 마찬가지로 현대 컴퓨터 프로그램의 상당 부분은 분기 처리로 이뤄져 있다. “ESC 버튼을 입력하면 → 현재 프로그램을 종료하라”와 같은 간단한 명령조차 분기다. “출금 버튼을 누르고 대상 계좌가 입력되면, 돈을 송금하라”와 같은 명령도 분기가 필요하다.

그렇다면 CPU가 계속 활용되기 위해서는 어떻게 해야 할까? 위 순서도에 따르면 세 가지 성능이 개선되면 된다. 산술 연산 속도, 분기 처리 속도, 메모리 접근 속도가 높아지면 된다. 위 예에서는 연산을 한 바퀴 돌 때 메모리 접근 6회, 산술 연산 2회, 비교 및 분기 1회가 포함돼 있다. 여기서 만약 메모리 접근과 산술 연산이 회당 1의 시간이 필요하고, 비교 및 분기에 10의 시간이 필요하다고 가정하면, 현재 작업 한 바퀴 수행에 걸리는 시간은 18(6*1+2*1+1*10)이다. 그런데 CPU가 비교 및 분기에 시간이 5로 개선된다면, 이 시간은 13으로 줄어 30% 가까이 빨라질 것이다.

CPU는 다양한 연산 종류와 분기 등이 섞여 있는 프로그램을 처리해야 했기 때문에 이 3가지 능력을 골고루 발전시키는 방향으로 발전했다. CPU 회사들은 미세화의 힘으로 얻어낸 새로운 트랜지스터들을 이런 능력을 향상하기 위해 아낌없이 투자했다. 기존 프로그램이 CPU만 바꾸면 빨라지게 되니, 새로운 수요는 계속 창출될 수 있었다. 지난 수십 년간 인텔의 CPU가 세계를 지배한 이유가 이것이다.

GPU의 등장과 인공지능

하지만 인공지능 기술이 크게 발전하면서 완전히 다른 형태의 프로그래밍이 생겨났다. 인공지능, 정확하게는 인공신경망 기반의 프로그램은 아래와 같은 구조로 움직인다. 과연 프로그램과 반도체의 입장에서 인공지능은 어떤 모습으로 보일까?

▲ 그림 9 : 연산 칩 입장에서 인공신경망의 구성

이 안에는 분기라는 것이 없다. 대신 산술 연산과 메모리 접근이 압도적으로 많다. 위에서 살펴본 CPU 기반 프로그램의 경우, 고작 몇 번의 연산과 분기만 처리하면 결괏값이 출력됐다. 하지만 인공신경망은 수백~수억 번의 연산을 거쳐야 결괏값을 출력할 수 있다. 실제로 인공신경망은 CPU 기반의 일반적 프로그램보다 코드의 크기가 매우 크다. 이런 인공신경망을 빠르고 효율적으로 동작시키기 위해서는 당연히 수천 개의 숫자 연산을 동시에 수행할 수 있으면서, 큰 메모리에 빠르게 접근할 수 있는 능력이 중요시된다. 따라서 위와 같은 프로그램은 CPU에서는 효율이 매우 낮다.

이는 인공지능 과학자들에게 큰 문제였다. 1970년대 인공지능 시도가 좌절된 원인 중 하나이기도 했다. 만약 위 문제가 해결되지 않으면, 이론적 돌파가 생겨도 무용지물이 될 것이다. 이 문제는 반도체 기술의 발전이 해결했다. GPU(Graphics Processing Unit, 그래픽처리장치)가 등장한 것이다.

GPU는 본래 컴퓨터의 그래픽 처리를 전담하기 위해 설계된 반도체 칩이다. GPU는 우리가 보는 화면에 그림을 빠르게 그려주는 일을 한다. 그래픽 작업의 경우, 분기가 필요치 않고 픽셀과 픽셀의 선후관계 없이 위치마다 각각의 색상 값을 계산해서 그려주면 된다. 이처럼 분기 없이 동시에 여러 작업이 가능한 GPU는 그래픽을 구현하는 작업에서 CPU보다 압도적인 효율을 보이며, 빠르게 발전했다. 이 과정에서 우리가 아는 NVIDIA가 떠오르게 된다.

NVIDIA는 그래픽 시장을 장악한 뒤에도 지속해서 GPU의 새로운 용도를 찾아다녔다. 이런 과정의 일환으로 2007년, CUDA 등 GPU 기반 프로그램 개발을 도와주는 도구를 만들어왔다. 그리고 인공지능 기술의 이론적 돌파가 진척되자, 과학자들은 더 빠르게 인공지능 개발을 도와줄 수 있는 칩을 찾아 나섰다. 그들은 GPU를 적극적으로 채용했고, GPU를 사용할 경우 5배 이상의 성능 향상을 이룰 수 있음을 확인했다. 인공지능을 구현하기에 CPU는 분기 예측 등 필요치 않은 곳에 트랜지스터를 낭비하는 비효율적인 칩이었다. 이렇게 이론적 돌파와 새로운 반도체가 만나 세상을 바꿀 인공지능(AI) 혁명*이 시작된다.

그리고 이 국면에서 빼놓을 수 없는 반도체가 또 있다. 바로 메모리다. 인공신경망의 크기는 기존 CPU 기반 프로그램보다 매우 거대하다. 인공신경망은 어딘가 저장돼 있어야 하므로, 인공지능에 사용되는 GPU는 큰 메모리가 필요하다. 이 때문에 인공지능 시대에 메모리 반도체 기업들 역시 주목받는 것이다.

* 출처 : Large-scale Deep Unsupervised Learning using Graphics Processors, Stanford Univ, 2009

프로그래밍 방법론에서 반도체까지

이번 편에서는 새로운 프로그래밍 방법론이 반도체 입장에서 어떻게 보이는지를 개략적으로 알아봤다. 프로그램은 인간이 생산적인 일을 하기 위한 수단이다. 프로그램은 순서도를 이용한 전통적인 방법으로도 만들 수 있고, 인공신경망 학습 방식으로 만들 수 있다. 그리고 사용자들은 순서도를 이용해 만든 프로그램과 인공신경망 중, 자신이 원하는 프로그램을 잘 돌리는 반도체를 택하는 것뿐이다. 만약 사용자가 엑셀과 같은 기존의 프로그램을 돌리고 싶다면 고성능 CPU를 이용할 것이고, 인공지능 기반의 언어 생성 등을 하고 싶다면 GPU를 이용하면 될 것이다.

이 글을 통해 후배, 동료 여러분에게 하고 싶은 말은 기술과 기술의 관계를 이해하며 나아갔으면 한다는 것이다. 캐나다의 연구원들은 기존 순서도 형태의 프로그램으로 해낼 수 없던 수많은 일을 인공신경망으로 해냈다. 그리고 인공신경망 구동은 기존 프로그램과 비교해 더 많은 사칙연산 횟수와 메모리가 필요했던 것일 뿐이다. 이러한 개선은 결국 위에서 살펴본 분기 속도를 2배로 올렸더니 전체 프로그램이 수십 퍼센트(%) 빨라졌던 것과 다르지 않다. 이런 사실을 잊지 않는다면, 이후에 새로운 프로그래밍 기술이 생겨났을 때 그 프로그램이 어떤 연산을 요구할지, 어떤 형태의 메모리를 요구할지도 알 수 있을 것이다.

다음 편부터는 인공지능 기술과 그 주변을 이루는 생태계를 살펴볼 것이다. 그리고 그 생태계들이 가지고 있는 한계와 어려움을 찾아보고, 반도체가 이를 어떻게 도와줄 수 있을지 살펴볼 것이다.

※ 본 칼럼은 반도체에 관한 인사이트를 제공하는 외부 전문가 칼럼으로, SK하이닉스의 공식 입장과는 다를 수 있습니다.

]]>
/jeonginseong-column-ai-1/feed/ 0
[반도체 인명사전] [컴퓨터 프로그래밍의 예술]의 저자 도널드 커누스 /the-art-of-computer-programming/ /the-art-of-computer-programming/#respond Tue, 14 Jul 2015 20:00:00 +0000 http://localhost:8080/the-art-of-computer-programming/ 블로그메인ct_인명사전_도널드 커누스(수요일)_20150714.png

도덜드 커누스는 컴퓨터 과학 분야에서 가장 권위 있는 책인 의 저자로 가장 널리 알려져 있습니다. 이 책의 1권은 놀랍게도 그가 28세 때 집필한 것이라고 하는데요. 커누스는 이 책의 출간 외에도 다방면에서 자신의 능력을 발휘했습니다. 또한, 알고리즘 분석 분야를 실질적으로 창조했으며 이론 컴퓨터 과학의 여러 분야에서 아주 중요한 공헌을 한 컴퓨터 과학자로도 꼽히고 있답니다. 특히 TeX 조판 시스템과 메타폰트 디자인 시스템을 만들었으며, 문학적 프로그래밍의 개념을 처음으로 주장하기도 했죠. 이러한 그의 취미는 다름 아닌 ‘오르간 연주’라고 하는데요. 문학과 예술을 사랑한 컴퓨터 과학자 도널드 커누스. 오늘은 그의 업적과 함께 인간적인 면모를 함께 살펴보도록 해요~!

title1 (72).png

도널드 커누스는 1938년 1월 10일 위스콘신 주 밀워키에서 태어났습니다. 커누스 가문에서는 처음으로 대학을 졸업했던 그의 아버지는 초등학교 교사로 처음 교단에 들어서 나중에 루터란 고등학교에서 부기를 가르쳤습니다. 또한, 주일에는 교회에서 오르간을 연주하기도 했는데요. 커누스는 이러한 아버지의 영향으로 음악과 교육에 대해 깊이 이해하고 있었다고 합니다. 특히, 아버지의 말투까지 쏙 빼닮았다고 하네요.

학창시절 커누스는 다방면에 걸쳐 제 능력을 발휘했던 학생이었습니다. 학교 신문의 편집인 일을 하면서 커누스는 ‘크로스워드 퍼즐’을 만들었는데요. 그는 단어들 가운데 어떤 패턴을 찾아내는 일을 즐겼다고 합니다. 그가 8학년이 되었을 때는 한 사탕 제조업자의 후원으로 ‘지글러의 왕 막대사탕(Ziegler’s Giant bar)’이라는 문구에 들어 있는 글자들을 가지고 누가 가장 많은 단어를 만들어 내는지를 겨루는 대회가 열렸는데요. 그는 1등 상으로 당시로선 값비싼 품목이었던 텔레비전 수상기 한 대와 전교생이 다 먹을 수 있을 만큼의 지글러 막대사탕을 받기도 했습니다. 또한, 고등학교 시절엔 웨스팅하우스 과학 재능 경진대회(Westinghouse Science Talent Search)에서 ‘무게와 측정의 potrzebie 시스템’이라는 안을 제출해 가작에 당선되기도 했죠.

1 (100).png

▲ 취미인 오르간을 연주하고 있는 도널드 커누스

하지만 고등학교 시절, 그가 정작 가장 많은 시간을 쏟아 부은 분야는 글쓰기나 과학이 아니라 바로 ‘음악’이었습니다. 음악가가 되겠다던 그의 계획이 달라진 것은 케이스 연구소로부터 물리학 장학생 제의를 받으면서부터였는데요. 수학에 따분함을 느끼던 그였지만 케이스에서 신입생들의 계산법을 담당했던 폴 켄터의 설득에 의해 전공을 물리학에서 수학으로 바꾸게 되죠.

이러한 그는 1956년 난생처음으로 컴퓨터를 접하게 됩니다. 그것은 포트란 이전의 기계인 IBM 650이었는데요. 그는 밤새도록 매뉴얼을 읽고 혼자 힘으로 기본적인 프로그래밍을 익혔습니다. 커누스의 첫 번째 프로그램은 숫자들을 소인수분해하는 것이었으며, 또 하나의 프로그램은 컴퓨터에서 3목놀이(Tic-tac-toe) 게임법을 가르치는 것이었는데요. 하지만 그것은 단지 빈둥거리며 시간을 보낸 것에 지나지 않았다고 하죠. 크누스는 이러한 과정을 통해 기계를 실행하게 만들었다는 것 자체에 매료됐는데요.

1960년 최우수 학생으로 케이스를 졸업한 그는 전례 없는 교수단 투표에 의해 수학 석사 학위도 동시에 받을 수 있게 되었습니다. 이어서 캘리포니아 공과대학에 들어가 3년 후 수학박사 학위를 딴 그는 수학 조교수로 칼텍 교수단에 합류했는데요. 뛰어난 수학도로 인정을 받고 있음에도 불구하고 그의 컴퓨터에 대한 관심은 여전했습니다. 그는 당시 컴퓨터 산업을 선도했던 기업인 버로즈사에서 자문역할을 맡으며 하드웨어와 소프트웨어 설계에 모두 관여하기도 할 정도로 적극적이었는데요. 다방면에 걸친 능력을 겸비한 그의 관심은 본격적으로 컴퓨터에 더욱 쏠리게 됩니다.

 

title2 (72).png

커누스가 아직 대학원생이었을 당시, 교재 발행인인 어드슨 웨슬리는 그에게 컴파일러에 관한 책을 집필할 것을 권유했습니다. 이에 교재를 집필하면서 커누스는 컴파일러에 대한 연구도 함께 시작했는데요. 컴파일러(Compiler)란 하나의 언어를 다른 언어로 번역하는 프로그램으로, 이 주제는 당시 아주 어렵게 간주되었기 때문에 컴파일러 작성에는 흔히 대학원 과정에서 최고 과정을 지정하는 번호가 부여되곤 했습니다.

2 - 2019-10-21T164641.640.png

▲ 강단에 선 도널드 커누스

하지만 이러한 어려움에도 불구하고 그가 컴파일러에 빠져들었던 이유는 ‘컴퓨터를 가지고 할 수 있는 가장 놀라운 일이 바로 컴퓨터 자체의 프로그램을 작성하도록 만드는 것’이라 생각했기 때문인데요. 그는 프로그램이 컴퓨팅에 적용될 때가 바로 컴퓨터 과학이 궁극적인 완벽함에 이르게 되는 시기라 여겼습니다. 사실상 현대의 소프트웨어 도구들은 컴파일러 작성을 훨씬 더 쉽게 만들어주었다고 할 수 있는데요. 따라서 요즘엔 대부분 학교에서 같은 과정을 학부생들에게 제공하고 있죠. 커누스는 이러한 도구들을 개발하는 데 큰 역할을 했습니다.

3 (45).jpg

출처 : 한빛미디어 (www.hanbit.co.kr)

갓 학위를 받은 박사가 포괄적인 교재를 발간한다는 것 자체만으로도 충분히 놀라운 일이지만, 이 책의 영향력은 더욱 놀라운데요. <컴퓨터 프로그래밍의 예술>의 첫 세 권은 70년대 전반에 걸쳐 줄곧 교재로 채택되었고 지금까지도 참고 문헌으로 자주 사용되고 있죠. 이러한 책의 인기는 커누스의 꼼꼼하고 치밀한 연구과정이 있었기에 가능한 일이었습니다. 전체 집필과정에서 커누스는 엄격함과 기지를 섞어가며 모든 아이디어의 바탕에 깔려 있는 원리를 보여주고자 노력하고 있는데요. 이에 대해 뉴욕 대학의 컴파일러 설계자인 에드 쇤베르그(Ed Schonberg)가 했던 말 속에서 그 위엄을 다시 한 번 확인할 수 있을 것 같습니다.

“데이크스트라는 우리에게 잘못된 것으로부터 옳은 것을 식별해 내도록 가르쳐 주었고, 커누스는 굉장한 것에서 그저 그렇고 그런 것을 가려 내는 방법을 가르쳐 주었다."

title3 (51).png4 (88).png

커누스는 일생 동안 인쇄와 그래픽의 구조에 흥미를 가져왔습니다. 1940년대의 소낸 시절에는 위스콘신 여름 캠프에서 식물에 대한 안내서를 쓰면서 당시 인쇄에 보편적으로 사용되고 있었던 청복사지에 첨필을 사용해 꽃의 삽화를 그리기도 했는데요. 그는 이러한 관심을 좀 더 발전시켜 9년에 걸친 긴 시간 동안 다른 프로젝트보다 디지털 인쇄방식에 사용될 컴퓨터 언어를 설계하고 개발하는 데 몰두했습니다.

그가 관심을 둔 것은 디지털 인쇄방식에 사용될 두 가지 컴퓨터 언어를 설계하고 실행하는 것이었는데요. 그 첫 번째는 택(TeX)이라는 것으로, 문자와 그 밖의 기호들을 인쇄면 위에 배치하는 것입니다. 두 번째 언어인 메타폰트(Metafont)는 글자 자체의 형태를 정의하는 역할을 합니다. 이들 프로그램은 현재 자유소프트웨어로 전 세계 어디에서나 사용이 가능하며 실제로 백만이 넘는 수의 사용자들을 확보하고 있답니다.

커누스는 특유의 세밀함과 집요함으로 인쇄술 분야에 보다 파고들었는데요. 예를 들어 그는 ‘문자 S(The Letter S)’라는 논문을 통해 그 문자의 수학적 형태를 분석하고 자신이 가장 만족스러운 방정식을 찾기 위해 며칠에 걸쳐 노력을 들였던 과정을 설명하기도 했습니다. 그의 이러한 관심에는 언어와 문법에 대한 관심, 수학에 대한 명석하고도 광범위한 지식, 시각적인 미적 감각, 프로그래밍에 대한 애정 등이 포함되어 있었던 것이죠.

한 프로그래밍 컨테스트에서 우승을 휩쓴 그를 향해 사람들이 그 비결을 물은 적이 있습니다. 여기에 그는 이렇게 대답했죠. “그냥 그것을 향해 조금씩 다가가기만 하면 됩니다. 그것이 바로 내가 프로그래밍을 익힌 방법입니다.” 이 말에는 컴퓨터에 대한 그의 꾸준한 노력과 지속적인 관심이 포함되어 있는데요. 현재 스탠퍼드 대학교의 명예교수가 된 커누스는 집필 외에서 파이프오르간을 연주한다거나, 다른 소설을 구상한다거나 또한 세계적 수준의 회의나 자문 프로젝트들을 하며 여전히 다방면의 활동을 이어가고 있습니다. 어쩌면 커누스의 위대한 업적은 그의 순수한 탐구의지와 앎에 대한 열정에서 비롯된 것이 아니었을까요?

]]> /the-art-of-computer-programming/feed/ 0