|
예전 월간 뉴튼 과학 잡지를 오랫동안 받아보았다. 그런데 이제는 네이버 ‘오늘의 과학’이 대신한다. 심도 있는 과학 상식을 쉽게 소개해주는 코너로 정말 훌륭하다. 특히 뉴튼 잡지가 주로 다루었던 상대론과 천체물리가 자주 나와 너무 좋다. 고등학교 때 배운 보어 수소 원자론이나 학부 교양화학시간에 배운 간단한 양자 역학까지는 어떻게 이해를 했지만, 요즘 LHC에서 나오는 질량을 결정하는 입자 힘을 매개하는 입자 얘기가 나오면 이제 아득하다.
우주론 역시 그 신비로움을 말을 할 수 없다. 옛날 옛적 뉴튼에서 봤던 우주배경복사, 블랙홀이 증발한다는 거짓말 같은 호킹복사가 대표적으로 나를 놀라게 한 사실이다. 그리고 많은 사람들이 개념을 두고 오는 ‘안드로메다’. 그런데 정작 안드로메다의 거리가 지구로부터 얼마인지 아는 사람이 얼마나 될까?
개념 충만한 안드로메다 은하: 지구로부터 250만 광년 (9.46조 곱하기 250만 킬로미터) 물리학 같은 과학은 - 신이 만들었던 저절로 생겨났던 - 자연의 신비를 풀려고 하는 사람들의 노력의 결정체다. 보통 공학과 다른 근본적인 이유가 여기에 있다: “연구하는 대상이 자연이냐, 아니면 인간이 만든 피조물이냐.” 그래서 전산학은 일면 덜 심오 해 보이기도 한다. 인간이 만들어 놓은 기계와 규칙 위에서 뭔가 바보스러운 짓을 하는 것 같기도 하다. 그런데 전산학과 매우 유사한 수학을 보면 (사실 수학과 전산학은 동일하다고 생각한다) 그러하지 않다. 수학은 사람이 발명한 숫자로 (발견이라 볼 수도 있겠지만) 만들어진 새로운 세계를 탐험하는 학문이다. 수학의 세계는 우주만큼이나 신비롭다. 전산학도 이러한 면에서는 동일하다. 0과 1만이 있는 세상에서 무엇을 할 수 있는지 또 이 세계에 숨겨진 비밀을 찾는 것이다. 특히 컴퓨터를 작동시키는 프로그램은 사실 신비의 대상이다. 모르는 것이 너무 많다.
단순히 거시적인 프로그램의 결과만을 이야기하는 것이 아니다. 그보다 미시적으로 한 프로그램이 컴퓨터에서 어떻게 작동하는지 알기 어렵다는 것이다. 아주 간단한 “Hello, World!”는 아마 모든 것을 이해할 수 있지도 모른다. 그런데 조금만 프로그램이 커지면 아직까지 완벽히 이해하지 못한다. 극단적으로 Halting Problem이 이야기하는 것처럼, 어떤 프로그램이 어떤 입력 값을 받았을 때 이 프로그램이 유한한 시간 내에 종료할지 아니할지는 풀 수가 없다. 시간이 많이 걸리는 것이 아니라 아예 풀 수가 없다. 불가능하다. 이런 문제 말고도 어려운 것은 많다. 컴퓨터의 성능을 빠르게 하려면, 전력을 더 적게 사용하려면, 더 안전하게 만들려면 일단 어떤 프로그램이 컴퓨터에서 어떻게 작동하는지를 정확히 알아야 한다. 그런데 이것 자체가 아직까지 너무 어렵다. ![]() ![]() 위 그림 두 개는 gzip이라는 압축 프로그램과 gcc 컴파일러가 작동할 때 벌어지는 여러 이벤트를 기록한 것이다. 위로부터 L2 캐시 미스, 에너지, L1 캐시 미스들, 분기 예측기 그리고 사이클 당 명령어를 나타냈다. 보다시피 두 프로그램의 행동은 상당히 다르다. 그렇다면 이것을 어떻게 분석해야 할까? 여기서 어떤 의미를 찾아내어 보다 빠른 컴퓨터를 만들 수 있을까? 쉽지 않은 문제다. 그래도 지금까지 30~40년 동안 수많은 학자들이 노력해왔다. 현대 CPU의 성능을 결정짓는 주요 인자로 캐시와 분기 예측기를 들 수 있다. 이 둘은 모두 프로그램의 미래를 예측해야 한다는 점에서 동일하다. 그런데 미래에 일어날 일을 완벽히 예측할 수 없기에 지금까지 프로그램이 보여준 행동을 이해하고 분석하여 미래를 예측한다. 간단한 직관력 하나가 프로그램 행동을 이해하는데 큰 실마리를 줄 수 있고 이것을 기반으로 더 나은 해법을 찾을 수 있다. 캐시나 분기 예측기에 들어간 기법들은 모두 이런 프로그램의 행동을 관찰한 뒤 얻은 지식으로부터 나왔다. 요즘 내가 하는 삽질은 “프로그램에 담겨있는 병렬성 찾기”로 요약할 수 있다. 물론 이런 엄청난 문제를 한방에 풀 수는 없다. 내가 무슨 아인슈타인도 아니고 시공간이 휘어있다는 그런 일반상대론을 만들 수는 없다. 그래서 이 문제를 좁히고 좁혀서 작은 문제 하나를 만들고 그걸 풀고 있다. 비록 간단해 보이는 문제이지만 쉽지 않다. 몇 백줄 안 되는 코드라도, 프로그래머가 직접 이 프로그램을 만들지 않았거나 이 알고리즘을 제대로 이해하지 못하면 이게 쉽게 병렬화가 될지 안 될지 알아낼 수 없다. 여기서 어떻게 하면 이걸 좀 더 쉽게 알아낼 수 있을까? 지금까지 이야기한 문제는 모두 프로그램을 얼마나 잘 이해하느냐에 그 성패가 달려있다. 이 문제 뿐만 아니라 프로그램에서 버그를 찾는 문제 같은 것도 과거에는 비교적 단순한 방식으로 프로그램을 이해했다. 태초에 자연이 4개의 원소로 되어있다고 생각한 수준이었다. 이제는 조금 더 뛰어난 통찰력으로 프로그램을 이해해 좀 더 나은 해법을 찾고 있다. 대충 갈릴레오나 뉴튼 정도가 되었다고 본다. 그런데 아직까지 상대론이나 양자역학처럼 획기적으로 프로그램을 이해할 수 있는 방법은 아직 없다. 과연 언제쯤 이것이 가능할까? 아니 이게 가능은 하기라도 할까?
최근 등록된 덧글
개발자 입장에서의 수많은 ..
by Jiyoon at 02/04 저도 아들 돌잔치때 돌잡이 .. by 박상욱 at 01/18 미국 대학원 원서 작성중에 p.. by 태클사이야 at 01/13 TO: 박PD 로그인 하지 않아.. by 박응용 at 01/10 http://gigglehd.com/zbx.. by dhunter at 12/28 우와.. 좋네요. 태반이 .. by 윤광배 at 12/17 항상 좋은 글 잘 보고 있습니.. by y2k at 11/23 글이 좋아서 제 블로그에 담.. by 쏭섭 at 11/23 최근 등록된 트랙백
메뉴릿
이글루 파인더
|