E D R , A S I H C RSS

lisp

See Also: LispLanguage

Describe lisp here

;;우선 두서없이 막 쓸 예정... 구조화는 나중에...

시작

jmcbw.jpg
[JPG image (70.35 KB)]


lisp의 창시자이시자, 제가 존경하는 고)존 매카시씨

서두

lisp은 함수형 프로그래밍 언어로서, 간결한 문법에 수학적인 면모가 돋보이는 언어이다.

lisp은 여러가지 종류의 언어들로 파생되었는데, clisp(커먼 리스프), scheme(스킴), Elisp(이맥스 리스프-스크립트언어), clouser, arc(완성되었는지 모름)... 등 여러종류의 아류언어들이 있다.

lisp의 장단점을 살펴봅시다. 이 부분은 제가 제시할만큼의 깊은 통찰을 아직 갖지는 못해서, 다른분이 쓴 부분을 인용합니다.

장점은..
1. 편합니다..스트럭쳐나, 뭐 기타등등 잡스런 문제들에 신경안쓰고 바로 문제해결을 위한 알고리즘을 구현할수있습니다.
따라서 1인 생산성이 *매우* 높아집니다..
2. 매우 유연합니다. 다른 OOP 언어 특히 C++, JAVA의 경우 최초의 클래스 구조를 한번 설계하면 개발이 진행되면서
그 구조를 바꾸는게 매우 어렵습니다. 사실상 전부 뜯어내야죠. 그에반해 LISP 의 CLOS, MOP 등은 매우 유연합니다.
바꾸기가 매우 쉽습니다.
3. 예전부터 지적되던 속도문제는..요즘 컴파일러 와 CPU 가 워낙 좋아져서 문제가 안됩니다. 대부분의 LISP 제품들이
최종 컴파일하면 머신코드까지 생성하기 때문에 매우빠릅니다.
4. 대형 시스템 개발에 좋습니다. 개발하다보면, 저절로 모듈화가 되서, 전에 했던일을 신경안쓰고 마치 블럭조립하듯
개발이 됩니다. 개인적으로 이점이 정말 좋습니다.
5. 안정적이다.. 개발과정에서 거의 모든 문제들이 도출되기때문에 개발이 완료된후에는 매우 안정적인 시스템이 됩니다.
메모리릭 이나 프로세스 크래쉬 같은 문제가 거의 없습니다. 따라서 미션크리티컬 시스템 개발에 최고입니다.

단점은..

1. 다른사람들과 공동작업이 어렵습니다. 개발자본인은 심오한 람다함수의 세계에 경탄을 금치 못하겠지만.
다른사람이 만든코드를 이해하기는..매우 어렵습니다. 세세한 문서 작성이 필수..
의외로 다른 언어로 만들어진 라이브러리 이용은 쉽습니다. FFI 를 쓰면 쉽지요..
2. 개발자 구하기가 어렵다..특히 한국은. 학문 레벨에서 만져본 분들은 많지만, 대형 실무용 제품을 개발해본 사람이 거의 없습니다.
따라서 유지보수가 문제가 될수 있죠.
3. 컴파일러가 비싸다.. 거의 공짜(?)에 가깝게 구할수있는 다른 개발툴에비해 컴파일러가 고가입니다. 제대로 쓸만한 제품은
$3000~$10000 까지 합니다.
4. Garbage Collection 이 문제가됩. GC 를 하는 대부분의 언어의 문제 이지만 GC 가 일어날때 순간적으로 프로그램이 멈추는 문제가 있습니다. 여러가지 기술로 그 시간을 최소화하고 있지만. 적절히 메모리 관리 안해주면. 문제가 됩니다.


한마디로..뛰어난 개발자 몇명이 대규모 개발팀이 할일을 해내는데 사용할때 적합합니다.
뛰어난 C 개발자는 일반 C 개발자의 3~5 배정도 생산성이 높아지지만.
뛰어난 LISP 개발자는 일반 LISP 개발자의 10~20 배까지 생산성이 높아집니다.

내 생각 : 근데 마이너한 언어가 원래 그렇지않나... 그리고 가비지컬렉션의 문제는 이를 쓰는 모든 언어들또한 공통적인 문제고... 어쨋든 더 공부해보고 여러가지를 생각해본뒤에 생각정리를 해야 공감이 되고 안되는 부분이 더 명확해질것같다.
-인용부 end-

입장


lisp의 문법을 살펴보자.

(message "Hello world")
Hello world
위는 Elisp에서 쓰이는 lisp 표현문이다.
message라는 심볼에 Hellow world라는 인수를 보낸 결과 바로 아래에서 Hello world라는 결과를 확인할 수 있다. 이렇게 한 표현문을 쓰고 곧바로 결과값을 확인 할 수 있는 환경을 이맥스에선 IELM(inferior Emacs lisp mode)라고 한다.

다음 clisp의 문법을 보자.

(+ 3 4)
7
앞서 말한것과같이 clisp도 elisp의 구문과 비슷하다. 다만, 이번에는 +라는 심볼을 쓴 다른 예시를 가져다 둔것일 뿐이다. 그리고 clisp에서는 결과값을 바로 확인할 수 있는 환경을 REPL(real eval print loop)라고 한다.


lisp은 심볼, 특별한 연산자(spcial operator), 리스트, 아톰으로 구성되어있다.
심볼은 값이 될 수도 있고, 함수가 될 수도 있다.
리스트는 lisp의 가장 base되는 데이터 자료구조로서, 콘셀(con-cell)로 구성된다.
콘셀이란, 마치 링크드리스트처럼 생겨먹은 녀석인데, 이런 구조를 통해서 리스트를 구성한다.

lisp은 여러분이 생각하는 모든것이 가능한 programmable한 program language다. lisp을 공부하면서 깜짝깜짝놀라게되는 사실들이 많이 생기는데, lisp은 우리가 생각하는 모든것이 가능한 language라고 해도 과언이 아닐정도로 유연하다. 게다가 내부 클래스 설계 또한 철학적인 고찰을 하게되는 심오한 언어이다.(게다가 람다함수의 아름다움, 간결함의 극치를 달리는 미학이란..) lisp은 함수의 호출순서 제어, 내부의 작동방식 변경, 사용자 정의의 제어문 생성등 이 모든게 가능하다. 이건 lisp이 코드와 데이터가 쓰는 자료구조가 리스트를 똑같이 씀으로서 나타날 수 있는 파워풀한 특징이다. 내가 한때 숭상?했던, c계열의 언어와 비교해보면 더욱 그 특징이 부각되는데, c++에서 만약 내가 획기적인 제어문을 생각해내서 이를 표준으로 쓰고 싶다고 하자, c++같은 경우는 이게 표준으로 통과되기 위해서는 긴 시간과 많은 절차를 통해서야 표준이 될 수 있다. 게다가 표준으로 통과하면 이 명령어를 위한 컴파일러도 확장해서 만들어야한다. 그러나 lisp은 다르다.(다르다! c++과는!) lisp은 이런 과정이 필요없이 간단히 자신이 정의해서 명령어를 만들 수 있고, 게다가 컴파일러에 대한 문제도 필요가 없다.(이 모든게 다 코드와 데이터가 리스트라는 같은 자료구조를 쓰기 때문이다.) 이렇게 개발자에게 무한한 자유를 주는 것 자체가 궁극의 언어가 아닐까하는 생각까지 들게할 정도로, lisp은 뛰어난 언어이다.(하지만 단점은 dsl, 가독성....등.. 하지만 가독성은 솔직히 다른 언어를 봐도 난 다른사람이 짠 코드는 읽기가 힘들어서 익숙해지냐의 문제인것같아서 그리 문제 삼고싶진않다.)

람다함수(lisp에서 람다함수를 말하면 람다 매크로를 말하는게 아니라 람다 매크로를 통해 만들어진 함수를 이야기한다.)에 대해서 생각해보자. 람다함수는 java의 익명함수와 형태는 비슷하되, 전혀 다른 개념으로 볼 수 있다. 이유는, 함수와 값을 분리하려는 기존 언어들의 철학과는 달리, 함수와 값을 같은 개념으로 보고 시작했다는 점에서 람다함수의 '다름'을 엿볼 수 있고, 여기서 부터 고찰을 시작해볼수 있다. 본격적인 시작전에 간단히 람다함수에 대해서 설명하자면, lambda 매크로를 통해서 만든 이름없는 함수를 이야기한다. 이렇게 말하면 익명함수와 다를게 무어냐, 별로 기존에 있던 개념과 별 다를것없는것 같은데 뭐가 대단하다는 거냐라는 생각을 가질 수 도 있다. 그러나 앞서 말한 함수와 값이 동일시 여겨진다라는 점에서 그 진가가 드러난다.


Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2015-11-30 14:21:36
Processing time 0.1012 sec