디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

Lisp로 검색해봤어염.

초밥술사갤로그로 이동합니다. 2010.11.23 10:31:42
조회 176 추천 0 댓글 4

http://kldp.org/node/105343

이런 글이 나오던데

-------------------------------------

왜 리습(Lisp)인가?

글쓴이: chanwooyoo 작성 일시: 수, 2009/05/13 - 3:40오후


블로그에 올리려고 쓴 글인데.. 리습에 관심있는 분들이 많이 생기셨으면 해서.. 여기에도 한 번 옮겨 봅니다. KLDP에 사실 별로 와 본 적이 없고 처음 써 보는 글이라 좀 긴장되네요. 분류도 여기가 맞는지도 잘 모르겠구요. ㅠㅠ 썼던 걸 그대로 옮겨서 말투가 반말투이니 이해해주세요;

-------------------------

리습은 특별하다. 여러 가지 언어들이 자신은 특별하다고 주장하지만, 리습은 그런 모든 언어들이 가질 수 없는 점을 가졌다는 점에서 특별하다. 아마 프로그래밍 언어를 크게 가른다면, \'리습 / 그 외의 언어들\'로 가를 수 있을 것이다. 허무맹랑한 주장이라고 생각하는가? 한 번 그 이유를 들어보기 바란다.



몇 가지 비유를 들어보겠다.



만일 요술램프의 지니가 당신에게 한 가지 소원만 들어준다고 했다고 하자. 당신은 어떤 소원을 빌겠는가? 예쁜 여자친구? 어마어마한 돈? 영원한 생명? 글쎄. 나 같으면 어떤 소원이든 들어주는 반지를 달라고 하겠다.



무협지에서 어떤 사람의 내공이 가장 강한가? 오랫동안 수련한 사람? 글쎄. 북명신공을 지녀서 다른 사람의 내공을 흡수하는(악랄할 수도 있지만) 능력을 가진 녀석의 내공이 시간이 지남에 따라 가장 강해지지 않을까?



드래곤볼에서 어떤 종족의 특성이 가장 좋다고 생각하는가? 재생이 되는 나메크인? 변신이 되는 프리더의 종족? 단연 샤이어인이다. 전투를 거듭할 때마다 상대만큼 강해지는 녀석들이기 때문이다.



마찬가지다.



어떤 언어가 한 가지 특성을 마음대로 가질 수 있다면 어떤 특성을 가지는 게 좋을까? 다른 언어의 어떤 장점이든 가져올 수 있는 특성이 제일 좋지 않겠는가? 그리고 이게 바로 리습이 가진 능력이다.



C를 보라. 객체 지향 프로그래밍을 하기 위해서는 구조체와 함수포인터를 사용해서 흉내내는 수 밖에 없다. define_class 라는 추상화를 만들어낼 능력이 없기 때문이다.



자바를 보라. foreach 라는 추상화를 사용하기 위해 자바 프로그래머들은 1.5 버전까지 기다려야만 했다. 언어에서 foreach 라는 추상화를 만들어 낼 능력을 가지고 있지 못하기 때문이다.



리습은 \'매크로\'라는, C의 매크로와는 매우 다른, 추상화 능력을 가지고 있다. 그리고 이 매크로를 통해 객체 지향 프로그래밍, lazy evaluation, continuation, 하스켈에서 자랑으로 여기는 monad 등등의 개념들을 라이브러리로 흡수해 왔다. 언어 자체는 전혀 변경하지 않고서! 이것은 이렇게 할 수 있다는 주장이 아니라, 역사적인 사실을 말하는 것 뿐이다. 1980년대 후반, 객체 지향 개념이 유행하자 리습에서는 OOP를 라이브러리로 추가했다. OOP를 라이브러리로 추가한다는 게 무슨 말인지 이해가 안 간다면, 다음과 같은 예가 도움이 될 것이다. 당신이 수학에 관한 라이브러리를 사용한다면 sin, cos 같은 추상화를 사용할 수 있게 된다. 그렇지 않은가? 마찬가지로 OOP에 관한 라이브러리를 사용한다면 define_class 라는 추상화를 사용할 수 있게 되는 것이다.



다른 언어에서 어떤 매력적인 개념이 등장하든지 리습은 바로 그 개념을 흡수할 수 있다. 그 개념은 라이브러리 형태로 추가되기 때문에 언어의 코어는 전혀 커지지 않고, backward compatibility도 완벽하게 유지된다. 라이브러리가 추가되면 언어에 새로운 문법이 추가될 거라고 생각하는가? 어떤 사람들은 리습의 매크로가 새로운 문법을 추가하는 거라고 생각하는데 이는 착각이다. 리습에는 operator 뒤에 operand 들이 온다는 문법 - 예를 들면 (operator operand1 operand2 ...) - 외에 다른 문법이 없다. 방금 당신은 리습에 존재하는 모든 문법을 배운 것이다.



foreach와 같은 새로운 제어 구조를 만들어내는 것은 Smalltalk와 Haskell도 할 수 있다. 하지만, 어떤 개념/추상화든지 가져올 수 있는 능력을 가진 것은 리습 뿐이다. 리습, 스몰토크, 하스켈이 신의 언어라고 불리는 세 가지 언어지만, 리습은 언어 자체를 변경시키지 않고도 어떤 개념이든 흡수할 수 있다는 점에서 다른 모든 언어들과 근본적으로 다르다. 그리고 이런 차이를 만들어내는 것은 다음 세 가지이다. 어떤 언어가 리습인지를 판단할 때 다음과 같은 세 가지를 만족한다면 리습이라고 할 수 있을 것이다.



1. 데이터와 코드의 형태가 같다(homoiconicity). 리습이 어떤 개념이든 쉽게 흡수할 수 있는 것은 단지 매크로 때문만은 아니다. 여기서 나열하는 1번과 2번 특성이 매크로의 작성을 극도로 쉽게 만들어 준다.



2. 문법이 (하나밖에) 없다. Paul Graham 같은 사람들은 ‘리습에는 문법이 없다.’라고 말하기도 한다. (operator operand1 operand2 ...) 이게 리습 문법의 전부다.(이것이 다른 메타 프로그래밍이 가능한 언어들과 리습을 차별화하는 요소이다. 리습에는 파서가 없다. 리습의 코드 자체가 트리 형태로 되어 있기 때문에 메타 프로그래밍을 통해 조작해야 하는 abstract syntax tree가 어떤 형태일지 고민할 필요가 없다. 코드 그대로가 곧 그것이기 때문이다. 프로그래머는 늘 보던 코드 형태 그 자체를 조작하면 되기 때문에 메타 프로그래밍을 통해 어떤 결과가 나올지를 예상하는 것이 아주 쉽다. 반면에 \'파서가 있는\' 다른 언어들의 경우에는 코드가 파싱된 결과물인 트리를 조작한 후 그 트리가 unparse된 결과가 자신이 의도한 코드가 되도록 메타 프로그래밍을 해야 한다. 평소에 익숙히 봐오던 프로그램 코드이지만 파싱된 결과물이 어떤 구조의 트리로 바뀌는지 알게 뭐란 말인가? 이 같은 작업은 매우 \'비직관적이고\', \'어려운\' 일이다. 프로그래머가 평소에 봐오던 코드와 최대한 비슷한 형태로 코드를 데이터처럼 다루기 위해서 스트링을 사용할 수도 있지만, 이 같은 방법을 사용할 경우 inadvertent variable capture를 피할 수 있는 방법을 보통 제공하지 않기 때문에 구멍난 추상이 되기도 쉽고, 결정적으로 스트링은 트리처럼 구조적으로 다루기가 용이하지 않기 때문에 조금이라도 복잡한 메타 프로그래밍을 제대로 하기란 쉽지 않다.) 



3. 매크로를 가지고 있다.



if 문, 가비지 콜렉션, REPL(대화형 셀)을 이용한 interactive programming, functional programming 등등은 모두 리습에서 처음 등장한 개념들이다. 다른 언어들이 이 같은 개념을 흡수하며 자신을 acceptable Lisp, 또는 alternative of Lisp이라고 광고한다. 파이썬이나 루비 같은 언어들이다. 하지만 위에서 나열한 리습의 가장 핵심적인 특성 세 가지는 이상하게도 어떤 언어도 흡수하지 못하고 있다. 왜라고 생각하는가? 저 특성들을 흡수하고 나면 그 언어는 리습이 되어버리기 때문이다.



예전에 다른 포스트에서 리습을 배우면 여러 가지 언어에 존재하는 개념들을 한 번에 배울 수 있다고 말한 적이 있다. 이제 그 이유가 왜인지 알았으리라 생각한다. 리습은 다른 언어가 장점으로 내세우는 개념을 손쉽게 흡수해버리기 때문에 멀티 패러다임 언어가 되기 쉽다. ‘리습으로는 함수형 프로그래밍을 해야 하고 객체 지향 프로그래밍은 못할 거야’라던가, ‘리습에서는 반복을 위해 재귀를 사용해야만 하고 루프문 같은 건 사용하지 못하겠지’와 같은 생각들은 모두 착각이다. 당신이 어떤 라이브러리를 사용하는지에 따라 리습은 어떤 모습의 언어도 될 수 있다. OOP 라이브러리를 사용한다면 객체 지향 방식으로 프로그래밍 할 수 있는 것이다. 



하스켈에서 내세우는 monad 라는 개념을 배우고 싶은가? 루비나 파이썬, 스몰토크를 살펴봐서는 알 수 없을 것이다. 그렇다고 모나드가 무엇인지 배우기 위해 하스켈을 익힐 필요는 없다. 리습을 아는 사람이라면 리습을 통해 모나드의 개념을 익힐 수도 있고, 실제로 모나드 라이브러리를 사용할 수도 있다.



라이브러리의 수? 좋은 IDE? 약간 더 좋은 표현력? 이런 것들은 다 피상적인 것으로 금방 따라잡힐 수 있는 것들이다. 실제로 모든 C/C++ 라이브러리는 Common Lisp에서 호출 가능하고, 모든 자바 클래스는 Clojure라는 리습에서 사용 가능하다.(Clojure는 JVM 위에서 돌아가는 리습으로, 자바 코어나 자바 라이브러리들을 번거로운 절차 없이 바로 호출 가능하다. 속도도 파이썬이나 루비와는 비교할 수 없을 정도로 빠르다.)



요약하면, 리습의 무서움은 그 잠재력에 있다. 이 글을 읽고 리습에 관심이 생겼다면 Clojure라는 리습을 한 번 살펴보기 바란다. 내가 아는 한 가장 아름답고, 강력한 언어다. Erlang의 강점인 concurrent programming을 위한 특성까지도 가지고 있다. pragprog.com에서 도 나와 있으니 공부하기도 어렵지 않다. 가장 최근에 나온 리습 dialect이기 때문에 기존의 Common Lisp이나 Scheme이 가지고 있는 단점들이 없고 정말 말끔한 느낌을 주는 언어다.



마지막으로 리습에 관련된 일화를 간단히 소개하며 끝낼까 한다. ILC 2002(International Lisp Conference 2002)중에 있었던 일이라고 한다. 출처는 다음과 같다. http://smuglispweeny.blogspot.com/2008/02/ooh-ooh-my-turn-why-lisp.html



Peter Norvig이 ILC 2002 키노트 스피치를 맡았을 때였다. 그는 스피치에서 \'파이썬이 리습이다\'라는 주장을 했다고 한다.(아마도 파이썬이 리습의 대용으로 충분하다 라는 주장이었을 것으로 생각된다.) ILC 에서 키노트 스피치를 맡아 \'파이썬이 리습이다\'라는 주장을 펼친 것은 마치 마틴 루터가 부활절 바티칸 미사를 맡아 진행하다가 개신교를 선언한 것 마냥 놀라운 행동이라고 할 수 있다. Peter가 스피치를 마치고 질문을 받았을 때, 그 자리에 있던 John McCathy(리습의 창시자)가 물었다고 한다. "파이썬은 코드를 데이터처럼 다룰 수 있습니까?" Peter의 대답은 "아니오"였고 Peter는 John이 계속해서 질문하기를 기다렸지만 John은 더 이상 아무 말도 하지 않았다.



John McCathy는 루비가 리습으로부터 많은 영향을 받았다는 얘기를 듣고 루비에 대해서도 같은 질문을 한 적이 있다. 대답은 역시나 "아니오"였고, 그는 "루비가 코드를 데이터로 다루지 못한다는 점에 있어서 루비는 리습이 이미 1960년에 도달했던 지점을 아직도 따라잡지 못하고 있다."라고 말했다.



리습을 제외한 모든 언어에 물어보라. "그 언어는 코드를 데이터로 다룰 수 있습니까?" 대답은 언제나 "아니오"일 것이다. 그리고 이것이 리습이 그토록 특별한 이유이다. 코드를 데이터로 다룰 수 있다면? 당신은 어떤 추상화(OOP, monad와 같이 아래로부터 위로 쌓아올려지는 개념을 말하는 것이다. 당신이 함수 하나를 짰다면, 일련의 프로시저를 하나의 함수로 추상화한 것이다.)도 할 수 있는 능력을 갖게 된다. 그게 뭐 그리 중요하냐고? 자바 프로그래머들에게 묻고 싶다. 당신은 자바 1.5 이전에 파이썬의 for와 같은 foreach문을 만들어서 직접 사용할 수 있었는가? 할 수 없었다. Sun이 foreach를 자바에 추가해줄 때까지 기다려야만 했다. 당신은 foreach문이 무엇인지 머릿속에서 알고 있었다. 알고 있는 개념을 왜 만들거나 사용할 수 없단 말인가? 언어의 한계 때문이다. 리습에는 그런 한계가 없다. 리습은 프로그래머가 생각하는 어떤 개념도 추상화할 수 있도록 무한한 자유를 부여하는 유일한 언어다.



정말 마지막으로 ^^; 한 가지만 더 얘기하면 리습을 공부하기 위해 \'컴퓨터 프로그램의 구조와 이해 (Structure and Interpretation of Computer Programs)\'를 보는 사람들이 있는데, 저 책을 읽으면 그냥 프로그래밍 공부는 되겠지만, 리습의 강점인 \'homoiconicity(코드와 데이터의 형태가 같음)와 매크로\'를 이해하는 데는 아무 도움도 되지 않는다. 책이 그런 내용을 전혀 담고 있지 않기 때문이다. 한 마디로 저 책은 프로그래밍 공부를 위한 책이지, 리습이 가지는 고유한 특성이나 개념을 알려주는 책은 아니라는 것이다.



혹시 이 주제와 관련하여 궁금한 것이나 다른 나누고 싶은 얘기가 있다면 chanwoo.yoo@gmail.com 으로 메일을 보내주기 바란다.

추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 현역으로 군대 안 간게 의아한 스타는? 운영자 25/06/30 - -
AD 휴대폰 바꿀까? 특가 구매 찬스! 운영자 25/07/02 - -
349196 삼성 컨버젼스 아카데미 [2] DART(116.41) 13.03.14 177 0
349195 코드잡이라는 사이트 아시나요? ㄹㄹ(121.134) 13.03.14 69 0
349194 프갤형님들 C++ 파일생성이 안되용 왜그러져 [2] ㅎㅋㅋㅋ(59.152) 13.03.14 83 0
349193 조회수 테스트 때릴꺼야?(116.40) 13.03.14 73 0
349191 댓글 달아라 연봉 맞춰준다 [4] 연봉감별사 (61.72) 13.03.14 128 0
349190 형들아 취업하려면 개발자로써 실력이 어느정도되어야 함? [2] ㅇㅅ(112.187) 13.03.14 164 0
349189 프갤 형님들 점심식사는 하셨나요? [1] ㅎㅋㅋㅋ(59.152) 13.03.14 80 0
349187 형들 독순법이나 구화법 모바일로 구현할수 있을까?? [3] 티버애니갤로그로 이동합니다. 13.03.14 353 0
349186 윤년계산식 [5] 프로그래머(121.134) 13.03.14 107 0
349185 ABAP 어디서 배우냐 ?? ㅇㅇ(210.109) 13.03.14 89 0
349184 더러운 GIL [1] 천회장(118.131) 13.03.14 105 0
349183 NSIS vs. INNO ㅁㄴㄻㄹ갤로그로 이동합니다. 13.03.14 66 0
349182 님들 수학 꼴통이 질문 하나만 할게요 [8] 야간편돌이(175.116) 13.03.14 145 0
349181 프갤 횽들 지금 구글리더가 폐쇄된다는데 호떡집에 불난 급 아님?;;;; [4] ㅇㅇ(1.240) 13.03.14 167 0
349180 형들 뭐가 잘못됐는지 봐줘. [8] savior(210.105) 13.03.14 103 0
349177 영어공부법 알려드린다. (168.126) 13.03.14 98 0
349176 미드로 영어공부하는거 효과좋음? [5] ㄱ2ㄱ(175.215) 13.03.14 118 0
349175 영어공부법좀 알려주셈; wer2r(175.215) 13.03.14 65 0
349173 고수 횽들 이거 좀 도와주세요 ㅠㅠ [10] 김삼디(110.9) 13.03.14 139 0
349172 작은 서버 하나 만드는데 [12] 리듬게이머갤로그로 이동합니다. 13.03.14 275 0
349171 내가 코딩시작한 이유 썰 푼다.. [14] LastCorona갤로그로 이동합니다. 13.03.14 349 0
349170 장고할려다가 민주화당한 썰 푼다 [11] c(175.208) 13.03.14 221 0
349167 1년에 컴공과 학생들 배출이 연 4000명이상 6000명 미만이라던데 [13] 입에붙는거갤로그로 이동합니다. 13.03.14 266 0
349165 트위터 API 1.1 POST 리밋 얼마인지 아는 사람? [1] ㄹㅇㄴㅁ(49.143) 13.03.14 128 0
349164 여공대생에 대해서 질문좀.. [7] 입에붙는거갤로그로 이동합니다. 13.03.14 205 0
349163 파이썬 쓰는 사람이 김치국엔 별로 없는거? [18] DART(116.41) 13.03.14 373 0
349161 c# 파일 동기화 문제.. - 뮤텍스로 해결 봄 [3] 힝아(115.161) 13.03.14 97 0
349160 기계공학과는 컴본갤 가서 물어보면 되나요 [4] ㄹㅇㄴㅁ(49.143) 13.03.14 85 0
349159 조금 중2병 돋는 이야기. [11] LastCorona갤로그로 이동합니다. 13.03.14 176 0
349157 정보처리 보니까 선행되야할 지식이 종범이다. [1] dot(113.30) 13.03.13 100 0
349156 다크서클 내려온다 [1] 루비•‿•갤로그로 이동합니다. 13.03.13 49 0
349155 학원 갈려는새끼들 쳐봐라 [10] ㅁㄴㅇ(59.11) 13.03.13 560 0
349154 내일은 ca정하는 날인데 백이(182.214) 13.03.13 45 0
349153 오늘 파일처리로 내상을 입었으니 탕수육을 먹어야겠습니다. ㅎㅋㅋㅋ(59.152) 13.03.13 60 0
349151 집구할떄 가장 중요한건 백이(182.214) 13.03.13 66 0
349149 숫자로써 정렬된 다운로드용 url 파일이름 보는 프로그램없나요? [2] dd(211.208) 13.03.13 63 0
349148 비주얼 스튜디오에 백슬래시 입력할때 [2] Savior(182.210) 13.03.13 120 0
349147 c# 파일 동기화 관련 헉헉헉헉! [6] 힝아(115.161) 13.03.13 102 0
349145 형들 궁금한게 있는데요 비주얼 스튜디오에선 제가 만든게 실행되는데 [6] Savior(182.210) 13.03.13 111 0
349143 형님들 json초보 살려주십시요 [1] ajax(182.219) 13.03.13 77 0
349142 c# 하는 형들 동기화 질문임. 흐엉흐엉 [5] 힝아(115.161) 13.03.13 91 0
349141 형들 나 자바 배울려고 종로IT뱅크 전화 조졌는데 40만이라는데 [3] ㅅㄹㄷ(61.37) 13.03.13 201 0
349139 아 ㅆ 벌 유저 불량이었네 ㅋㅋㅋ 분당살람갤로그로 이동합니다. 13.03.13 58 0
349138 에디트플러스 30일 지나면어떡함 [6] wer2r(175.215) 13.03.13 120 0
349136 안드로이드 어플 19세게임들 어디까지허용가능함? (211.237) 13.03.13 117 0
349134 이번엔 윈도우8을 리뷰해 보려고 해... [6] 분당살람갤로그로 이동합니다. 13.03.13 116 0
349131 프갤형들 죄송하지만 질문이 있어요 ㅠㅠ 메모장 관련 [6] yyyyxxzz(220.89) 13.03.13 105 0
349130 대학교에서 프로그램을 하나 만들어야되는데요. [5] Benny Benassi갤로그로 이동합니다. 13.03.13 144 0
349129 c할때마다 느끼는건대 [3] 백이(182.214) 13.03.13 127 0
349128 악 자바스크립트 textarea에서 커서위치까지 length구하는게... [1] 궁굼궁굼(211.55) 13.03.13 94 0
뉴스 ‘피디씨’ 헨리, “바이올린 배우기 싫어 부순 적도”…음악 천재로 거듭난 터닝 포인트는? 디시트렌드 07.04
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2