ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • (1) 튜링팀과 람다팀, 자바
    튜링과 람다 2016. 3. 18. 13:58


    이 글은 월간 마크로소프트웨어 2015년 8월 자바 특집호에 기고한 글입니다. 원고가 길어서 두편으로 나눠 올립니다. 지금은 마소가 발행 중단되어 링크를 찾을 수 없습니다. 



    기계가 계산을 할 수 있다는 생각을 처음 한 사람은 누구일까? 계산하는 기계를 최초로 구현한 사람은 누구일까? 지금은 늘 손에 컴퓨터를 들고 다녀서 당연한 것들이지만 컴퓨터의 처음은 있었을 것이다. 이 당연한 컴퓨터를 만들기 위해 쏟은 열정에 관한 이야기다. 수학과 컴퓨터의 갈림 길에서 부터 시작한다. 만든 사람도 지금처럼 발전하리라 생각 못 했을 것이다.


    수학으로부터 두 가지 흐름이 갈라져 나왔다.


    튜링 머신 (Turing machine)


    이미테이션 게임이라는 영화가 얼마전에 개봉했다. 같은 이름의 전기를 바탕으로 만든 영화다. 2차 세계 대전 때 독일의 암호기 이니그마는 연합군의 골치덩이였고 난공불락이었다. 이니그마를 풀어낸 천재 수학자 앨런 튜링이 영화의 주인공이다. 바로 튜링 머신 이론을 만든 인물이다. 튜링상은 컴퓨터계의 노벨상이라 불린다. 상의 이름에도 들어가 있듯이 튜링이 컴퓨터의 기초를 만든 것을 기리기 위한 상이다.


    Alan_Turing_131225_1.jpg

    Alan Turing ( 출처 : Techholic )


    앨런 튜링은 1912년에 태어났다. 튜링은1936년 “계산 가능한 수와 결정문제의 응용에 관하여(On Computable Numbers, with an Application to the Entscheidungsproblem)”

    라는 논문을 냈고 이 논문이 컴퓨터를 만들 수 있는 근간이 되었다. 바로 튜링 머신이다.  튜링 머신은 상태를 중심으로 논리적 실행을 하는 실제 기계가 아니라 수학적 추상 개념이다.


    튜링 머신은 우리가 많이 쓰고 있는 C, C++, Java를 포함한 대부분의 컴퓨터 프로그래밍 언어의 이론적 바탕이다. 특히, Java나 C와 같은 언어들은 대부분 상태 머신이다. 상태 머신은 처리 중간 과정을 상태에 보관하고 다음 수행에 보관한 상태를 사용한다. 이런 방식은 메모리를 효과적으로 사용하는 장점이 있다. 대신 중간 계산 결과는 다 사라진다. 상태라는 것은 결국 데이터를 의미한다. 명령형 언어와 객체 지향 언어로 발전했다.


    람다 대수 (Lambda calculus)


    Basic, LISP, Turing machine의 창시자들은 공통점이 있다. 이들의 스승이 같은 사람이다. 알론조 처치(Alonzo Church) 교수다. 람다 대수를 만든 사람이기도 하다. 알론조 처치는 미국에서 1903년 태어났다. 처치는 모교인 프린스턴 대학에서 수학과 교수였다. 20세기 초반 수학계는 수학을 자동으로 풀 수 있는 지에 대한 연구가 있었다. 프로그래밍으로 치면 코딩의 자동화다. 처치는 자동으로 풀 수 없는 문제가 있다는 것을 증명했다. 별 이상한 걸 다 증명한다고 생각할 수도 있다. 튜링보다 먼저 풀었다. 이 재미 없는 증명이 컴퓨터를 만드는 초석이 되었다.


    Alonzo_Church.jpg

    Alonzo Church ( 출처 : 위키피디아 )


    알론조 처지는 람다 대수를 1936년 소개했다. 람다 대수는 프로그래밍을 위한 이론이 아니다. 단지 수학의 이론일 뿐이다. 람다 대수는 결정 문제(decision problem)를 풀기 위해 만든 기호 논리학이다. 수학의 여러 기호를 람다 대수 표현 방식으로 모두 바꿀 수 있다. 당연한 이야기다. 우리가 Java나 LISP언어로 수학의 기호들을 코딩할 수 있는 것과 같은 말이다. 결국, 수학 문제를 풀 수 있는 매우 단순한 기호 체계를 만든 것이다. 람다 대수 이론은 한 페이지 정도 된다. 근데 이해하려면 머리가 아플 수도 있다. 도전해 보시라.


    나중에 과학자들은 람다 대수를 이용해 프로그래밍 언어를 고안하기 시작했다. LISP, Haskell 등등 함수형 언어들이 바로 람다 대수를 기반으로 탄생했다. 람다 대수의 탄생 시점엔 프로그래밍 언어로 발전할 것을 생각하진 못 했다. 당시엔 컴퓨터도 없었다. 함수형 언어의 함수는 수학의 함수와 같다. C언의 함수와는 다르다. 수학의 함수는 부수효과가 없다. 오직 입력과 출력만 있을 뿐이다. 함수형 언어는 이 특징을 그데로 이어 받았다.


    # 한 동네에서 시작한 두 팀  


    컴퓨터가 발명된 초기에는 이렇다 할 프로그래밍 언어가 없었다. 지금 우리가 늘 보는 수준의 소프트웨어와는 안드로메다 만큼 멀다. 이 시대에는 많은 언어가 시도됐고 사라졌다. 이론적으로는 훌륭하지만 하드웨어가 따라주지 못 해 실패하는 경우도 있었다. 프로그래밍 언어는 크게 두가지 이론에 기반을 두고 개발됐다. 람다 대수와 튜링 머신이다. 이 두가지 이론은 대비 되는 특징이 많다. 마치 라이벌 같다. 이론의 내용은 라이벌이라고 볼 수 있다. 그러나 재미 없게도 이론을 만든 사람들끼리 숙명의 라이벌은 아니다.  알론조 처치와 앨런 튜링은 매우 친한 사제지간이었고 공동으로 연구도 했다. 얼마 친했는 지 처치-튜링 명제(Church–Turing thesis)라는 것이 있다. 두 사람이 이름이 들어간 것만 봐도 보통 사이가 아니라는 것은 짐작이 갈 것이다.



    알론조 처치와 앨런 튜링이이 만난 곳은 프린스턴 대학(Princeton University)이다. Basic, LISP의 창시자들이 알론조 처치의 제자들이다. Basic은 존 캐메니(John Kemeny)가 만들었고 LISP은 존 매카시(John McCarthy)가 만들었다. 여기까지만 봐도 올스타팀이다. 이 팀의 무게감이 대단하다. 초기 컴퓨터 과학에 큰 영향을 끼쳤다. 이런 대단한 사람들이 같은 대학을 거쳐갔다니 참 놀라운 일이다.  


    프로그래밍 언어를 이해하는데 중요한 통찰이 하나 있다. 늘 코딩을 하는 사람들은 당연하다고 생각하지만 이런 것도 증명한 사람들이 있다. 어떤 언어를 사용해도 같은 Logic을 코딩할 수 있다는 당연한 것을 증명했다. 함수형 언어든 명령형 언어든 객체 지향이든 상관 없다. 처치-튜링 명제(Church–Turing thesis)로 밝혀졌다. 처치-튜링 명제는 람다 대수와 튜링 머신이 등가라는 것이다. 다시 말해 튜링 머신으로 할 수 있는 것은 람다 대수도로 할 수 있다는 이야기다. 그 반대도 성립하다. 처음엔 다른 줄 알았는데 나중에 보니 같았던 것이다. 두 이론은 너무 다른 모습인데 같다는 것을 찾아낸 상상력이 대단하다.


    “상태(State)를 어떻게 다루는가”는 두 개념의 가장 큰 차이를 만든다. 함수형 언어를 안 써본 개발자는 상태라는 말이 낯설 수도 있다. 늘 사용하기 때문이다. 보통 멤버 변수를 선언하고 값을 할당하는 행위가 상태를 만드는 것이다. 튜링 머신은 Stateful이고 람다 대수는 Stateless이다. 앞으로 이런 표현은 자주 나올 것이다. 명령형 언어는 튜링 머신의 특징을 그데로 계승해 Stateful 하다. 함수형 언어는 람다 대수를 그데로 계승해 Stateless 하다.


    “상태가 있느냐, 없는냐”는 간단해 보이지만 프로그래밍의 엄청난 차이를 만들어 낸다. 우리가 현재 쓰고 있는 대부분의 언어가 자기고 있는 근본적 문제와 직결 돼 있다. 대부분의 버그는 상태를 변경하다 발생하기 때문이다. Thread에 안전하지 못 한 것도 바로 상태를 변경하기 때문이다. 상태 머신은 처음엔 코딩이 쉽지만 나중으로 갈 수록 어려워지는 특징이 있다. 이 지점에서 함수형 언어들은 완전 반대의 성질을 갖고 있다. 상태가 없기 때문에 부수효과가 발생하지 않는다. 어떠한 변경에도 안전하다. 함수형 언어는 실제로 변경은 없고 변경하는 것처럼 보일 뿐이다. 함수형 언어는 상태를 쉽게 변경하기 어렵기 때문에 처음에 코딩이 어려운 점도 있다.


    # 진격의 튜링팀


    프로그래밍 언어는 매우 많다. 대부분의 언어들이 튜링 머신을 기반으로 만들어 졌다. B, C, C++, FORTRAN, Samlltalk, Pascal이 여기에 포함된다. 컴퓨터가 나타난 시점부터 튜링팀의 선수들은 많이 탄생하고 세상을 덮기 시작했다. 초기 컴퓨터는 성능이 매우 떨어졌고 튜링 머신은 성능이 떨어지는 컴퓨터에 유리하다.


    튜링팀의 스타 플레이어는 단연 C언어다. 프로그래밍을 배운다고 하면 C언어 부터 배웠다. 지금 우리가 현재 쓰고 있는 대부분 언어의 원형은 C언어다. C언어를 알면 Java, C++, C#, Objective-C를 몰라도 대략 이 언어들의 코드를 이해할 수 있다. 언어의 유사성이 높기 때문이다. C언의 전과 후로 나누어도 지나친 말이 아니다. C언어는 벨 연구소에서 데니스 리치(Dennis Ritchie)가 Unix에 사용하기 위해 개발한 언어다. 데리스 리치는 1983년 튜링상을 받았다. 창시자 이름 정도는 알아 두면 좋을 것같다.


    Dennis_Ritchie_2011.jpg

    Dennis Ritchie ( 출처 : 위키피디아 )


    # 람다팀의 게릴라전


    내가 들어 본 유일한 함수형 언어는 LISP이였다. 처음엔 어떻게 발음해야 할 지도 몰랐다. 생계에 도움이 되지 않았기 때문에 더 이상 들여다 보진 않았다. 람다팀의 선수는 튜링팀에 비해 많이 적다. 대중화 되진 못 했다. 그러나 인공지능이나 수학, 분석 같은 특정 분야에서 사용됐다. 함수형 언어는 메타 프로그래밍(Metaprogramming)이 가능하기 때문이다.


    람다팀의 맡형은 LISP이다. LISP은 굉장히 오래 된 언어다. LISP보다 먼저 나온 언어는 1957년 탄생한 Fortran뿐이다. 존 매카시(John McCarthy)는 LISP을 1958년에 발명했다. LISP의 이름은 List Processing의 준말이다. 존 매카시는 알론조 처치의 제자다. 인공 지능이라는 말을 처음 만든 사람이고 인공지능의 연구로 1971년 튜링상을 받았다. LISP에 한번 빠지면 헤어나기 힘들다고 한다. 그러나 괄호 지옥을 감당해야 한다.


    jmcbw.jpg

    John McCarthy ( 출처 : IBM developersWors )


    다음편에 계속

    (2)튜링팀과 람다팀, 자바

    (3)튜링팀과 람다팀, 자바





    '튜링과 람다' 카테고리의 다른 글

    (3) 튜링팀과 람다팀, 자바  (0) 2016.03.18
    (2) 튜링팀과 람다팀, 자바  (0) 2016.03.18

    댓글

(c)민들레