SICP 읽고있습니다.

gurugio의 이미지


얼마전에 어떤 신문을 봤는데

MIT에서 모든 성적을 만점받고 졸업하신 한국분이

컴퓨터와 수학만 있으면 뭐든지 가능하다? 라는 의미의 말씀을 하셨다더라구요.

전~~~혀 이해가 안되는 말이길래

역시 천재가 한 말은 달라.. 난 모르겠네.. 이러면서 별 생각 없었는데

SICP (structure and interpretation of computer programs)의 1장을 읽다보니

분명 프로그래밍 언어를 설명하고있는데

연습문제들은 수학문제내요.

퇴근후 짬짬히 1.2.1 까지 읽는데 1주일이 넘게 걸렸습니다.

똑같은 결과를 계산하는 프로그램도 이렇게 다르게 짤 수 있구나..

역시 저는 막코딩을 해왔다는걸 실감했습니다.

책 표현대로라면 저라는 프로시저의 프로세스는 시간과 공간을 많이 먹고있었네요 쩝..

M.W.Park의 이미지

영문판 1판은 학부때 좀 봤고, 한글번역판은 얼마전에 샀는데 요즘 LISP에 빠져있어서 헷갈릴까봐 조금만 더 있다가 보려고 합니다.

Quote:
시간과 공간을 많이 먹고있었네요

머 낙담하실 일만은 아닌듯... 최적화할 여지가 많은 것은 좋은거 아니겠습니까?
앞으로 얼마든지 나아질 수 있잖아요? ^^;

-----
오늘 나의 취미는 끝없는, 끝없는 인내다. 1973 法頂

-----
오늘 의 취미는 끝없는, 끝없는 인내다. 1973 法頂

gurugio의 이미지


LISP와 scheme은 많이 다른가요?

아직 이 책 1장을 읽는 중이라 scheme이 꽤 직관적이라는 것만 알겠고
왜 그렇게 해커들이 열광하는지 잘 모르겠습니다.
LISP 계열? 언어들의 가치에 대해서
조금만 설명 부탁드립니다 ;-)

----
세상을 바꾸는 것은 단 한 사람. 오직 하나님의 사람뿐이다.

semmal의 이미지

scheme을 lisp이라 불러도 완전히 틀린 건 아닙니다. lisp의 한 분파니까요.

lisp 계열의 장점은 간단한 문법과 강력한 심볼 처리입니다. 여기서 강력한 심볼 처리가 가능한 이유가 결국은 간단한 문법 때문이지요.

SICP 2장에 보시면 심볼 데이터를 처리하는 내용이 나옵니다. 그 전까지의 내용은 다른 언어를 쓰더라도 충분히 내용을 따라잡을 수 있겠지만, 이 부분 부터는 약간 힘드실 겁니다. 3장에서 스트림을 처리하는 부분을 보시면서 다시 lisp의 강력함을 알 수 있게 되고, 4장에서는 scheme이 아닌 언어로 공부를 진행하는 건 거의 무리가 있을 정도가 될 겁니다. 5장은 C로 한다면 책을 써내야할 정도로 소스코드를 만들어야 합니다. 실제로는 대단한 규모인데도 불구하고 SICP는 처음부터 끝까지 함수단위로 설명이 가능합니다.

결국 C/C++/Java로 짰다면 수많은 파일을 생성하고 수많은 함수를 만들고 머리를 싸매야하는 코드가 lisp에서는 (다른 언어에 비하면 훨씬) 간단히 끝납니다. 간단한 문법과 강력한 심볼 처리가 lisp의 추상 수준을 한껏 높여줍니다. 그렇다고 다른 언어들이 쓰는 저수준 제어를 못하는 것도 아닙니다. 속도가 엄청나게 느리지도 않습니다. 해커들이 좋아하지 않을 이유가 없죠.
------------------------------
How many legs does a dog have?

------------------------------
How many legs does a dog have?

sugarlessgirl의 이미지

그 책의 서문과 1장의 앞부분에서 그 이유를 설명해주지 않나요?

LISP에 대해서 많이 공부하지는 않았지만, 추상화가 잘 된 언어 같습니다.
심볼과 리스트의 기본 데이터형을 기반으로한 무한한 데이터 표현의 확장과,
코드와 데이터의 형태가 동일한 형태를 따르는 것이 인상적이었습니다.

CLOS 로 객체지향을 구현하는데 있어서,
언어 자체의 문법이 달라지는게 아니라, 단지 데이터를 다루는 방식이 달라지는 부분은
괄호로 싸면 땡인 리스프 문법의 막장을 느끼는 계기가 되었습니다. (좋은뜻입니다-_-)

그 책 서문인지 1장 앞부분인지 대충 다음과같은 말이 나오는데,
'파스칼로 짜여진 프로그램이 피라미드같이 단단한 돌로 쌓여진 탄탄한 건축물이라면,
LISP로 짜여진 프로그램은 유기체다.'

나쁘진 않더군요 LISP

gurugio의 이미지


물론 심볼 처리, 무한한 데이터 표현 등등등등 이라는 말을 읽었지만
이게 뭔가.. 하는 생각만 들더라구요.
겪어본적이 없으니까요.

결국 책을 더 읽다보면 체험할거라는 말씀이지요?
아직 1장만 읽어서 긴가민가한것 같습니다.
2장부턴 허거덕! 하는 내용이 나오겠지요 ;-)

----
세상을 바꾸는 것은 단 한 사람. 오직 하나님의 사람뿐이다.

M.W.Park의 이미지

scheme은 lisp의 dialect로서 기본 개념이나 설계철학은 거의 동일하지만, 세세한 부분으로 들어가면 조금씩 다릅니다.
그리고 제가 처음에 언급한 lisp이 약간의 오해의 소지가 있었던거같은데, 정확하게 이야기하면 common lisp입니다.
ANSI 표준화를 거쳐서 나온 spec을 만족하는 implementation이라고 보시면 대충 맞을 겁니다.

확실하지는 않지만 lisp과 scheme의 차이점을 대충 생각나는대로 적어보자면,


  1. lisp은 function의 namespace가 다른것들(변수 등)과 구분되어있습니다.
    scheme은 그렇지 않죠. 그래서 define으로 모든 것(함수, 변수)을 정의하고 변수명과 함수명이 같을 수 없습니다. (에러가 난다기보다는 마지막으로 define한 놈이 이전 것들을 shadow한다는 표현이 더 정확하겠네요.)
    lisp에서는 변수명과 함수명이 같을 수있습니다. namespace가 다르기 때문이죠.

  2. lisp은 lexical/dynamic scoping을 쓸 수 있습니다. (초기 lisp은 dynamic scoping만 썼었지만, 문제가 많아서 기본적으로는 lexical scoping이지만 special variable등을 통해 dynamic scoping도 쓸 수 있습니다.) 즉, 초기(ANSI Common Lisp 이전)의 lisp은 기본적으로 dynamic scoping이었기 때문에, Scheme의 lexical scoping과 확연이 대비되는 면이 있었다고 볼 수 있습니다.

Scheme교 신자들은, lambda calculus의 철학에는 lisp보다 scheme이 더 부합한다고 주장하는 사람들도 있었던거같습니다.

Lisp 계열 언어의 가치에 대해서는,
DSL(Domain Specific Language)를 만드는데 현재까지 나온 언어들 중에는 최강이라고 말씀드리고 싶네요.
간단하고 명확한 lambda calculus가 이론적인 뒷받침이 되는 것도 훌륭하고요.
개발 작업을 할 때 REPL(Read-Eval-Print Loop)의 리듬을 타면서 자연스럽게 코딩/테스트가 이루어지는 것도 빼놓을 수 없겠죠.
문제해결에만 집중할 수 있다는 점도 장점이구요.

그럼 이만, 장황설을 마칩니다. ^^;

ps. Lisp에 관해서는 해커와 화가라는 책이 재미있게 잘 설명되어있습니다. 실제 프로그래밍 이야기는 거의 안나오지만 다소 오만하기까지한 어투로 Lisp의 강력함에 대해서 열변을 토합니다. Lisp으로 실제 성공한 Paul Graham이 써서 더 와닿는 면도 있죠.

-----
오늘 나의 취미는 끝없는, 끝없는 인내다. 1973 法頂

-----
오늘 의 취미는 끝없는, 끝없는 인내다. 1973 法頂

semmal의 이미지

그 문제를 어떤 방법으로 푸는지에 대해서도 생각해보세요.

SICP에서 등장하는 수학/전기/전자/통계 등등의 각 분야를 끌어들이는 문제는, 실제로 프로그램 짜다가 드문드문 쓰기도 합니다만, 거기서 등장하는 문제 푸는 방법이 사실 더 중요합니다.

문제를 푸는 방법이 정말 다양하다는 걸 아실 수 있을 겁니다. 어떤 방법이 반드시 좋다라고 말할 수 없다는 것두요.
------------------------------
How many legs does a dog have?

------------------------------
How many legs does a dog have?

lindolsang의 이미지

혹시 보고 계시다는 책이..
http://kangcom.com/common/bookinfo/bookinfo.asp?sku=200710100001

이책인가요?

저도 프로그래머가 되고 싶어서.... -ㅅ- 냐옹꽥꽥.

gurugio의 이미지


그 책 맞습니다.

구글에서 pdf로된 원서를 찾을 수 있어서
원서를 보고있습니다.

저도 프로그래머가 되고 싶어서 읽고 있어요~~

----
세상을 바꾸는 것은 단 한 사람. 오직 하나님의 사람뿐이다.

oppor의 이미지

저도 사서 보고 있어요~~

당연히 번역서로 보고 있는데 번역하신분의 강한 가치관에 따라 번역된 책이라 예전의 unix책 번역본 처럼 문제가 될수도 있는 부분이 있지요.(쉘을 껍데기로 번역했다던가요...)

예를 들어 assignment를 "덮어 쓰기"로 해석한 걸 들 수 있겠네요.

번역자의 설명을 들으면 왜 그렇게 했는지 알 수 있습니다만 역시나 문제가 될 수도 있는 부분이긴 하죠.^^

전 할당이나 덮어쓰기나 둘다 완전히 이해하는건 어려운 일이라 생각하기 때문에 책 내용에 집중해서 잘 보고 있습니다.

얼마 안보긴 했지만 새로운 언어를 배운다는게 좋군요.^^;;

번역자 김재우님의 블로그에 놀러 가보세요~

http://kizoo.blogspot.com 입니다.

OpenSnake의 이미지

근데 막상 읽어보니 sort 같은것도 없던데.....
어떤 부분의 도움이 된다는건가요??

좋다는 애기는 많이 들었는데 대체 구체적으로 어디가 좋다는건지 뚜렷하게 모르겠더군요...
(음..제가 책을 앞페이지만 봐서 그런가요...-_-;;)

--------------------------------------------
혼자있고 싶습니다. 모두 지구밖으로 나가주세요.

--------------------------------------------
혼자있고 싶습니다. 모두 지구밖으로 나가주세요.

semmal의 이미지

3장까지만 꾸준히 보고 문제를 풀어보세요.

프로그래밍은 "문제를 푸는 방법"만 알면 쉬위집니다.

문제를 푸는 방법에서 가장 기본적인 것은 생각을 "잘 요약해서" 프로그램으로 풀어내는 겁니다. 이미 대다수의 문제는 이것만으로도 해결할 수 있습니다.

다만, 어떤 경우에는 "일정한 차례"에 맞춰서 프로그램을 짜는 것이 더 좋을 때가 있기 때문에, 그것을 공부하는 것이구요.

또, 머리속에 이런 지식이 들어가 있더라도 "한번 짜보는" 과정을 거치지 않으면, 머리속에 잘 남아있지 않습니다. 그리고 더 좋은 코드를 만들기도 어려워지지요.

SICP는 이 세가지 과정을 모두 강조하고 있습니다. 처음에는 첫번째 과정만 보시게 되겠지만, 두번째와 세번째는 갈수록 쉽지 않습니다. :)
------------------------------
How many legs does a dog have?

------------------------------
How many legs does a dog have?