책 리뷰
[책] 브루스테이트의 세븐 랭귀지
IT 도서 후기
브루스테이트의 세븐 랭귀지(Seven language in seven weeks)
브루스 테이트의 세븐 랭귀지브루스 테이트 상세보기 |
후기
이 책을 사고 절반정도는 일주일도 안되서 본 것 같다. 그런데 일단 프롤로그부터 난관의 연속이었다가 얼랭에서 나의 호기심을 자극했다. 사실 이 책을 기반으로 요새 자주 듣던 얼랭을 공부 해볼까 한다. 일단 ‘Let it crash’라는 전략이 너무나 마음에 든다.
루비는 RoR을 사용하고자 배웠던 언어이기도 해서 나름 익숙한 언어였고, 스칼라는 항상 Java를 쓰다가 함수형 맛보고 싶다는 생각에 Programing in Scala ? 마틴 오더스키 교수님이 직접 저술한 베스트 셀러인 책을 구입 할까도 고민중이다. 물론 책을 막 사는 편은 아니지만, 일단 설계자의 책이니 믿고 사볼만? 할 것 같다.
그건 추후에 결정을 하고, 세븐 랭귀지로 돌아오면, 이미 이 책의 후속판은 미국에서 인기를 얻고 있다. more Seven language in seven weeks인가? 그 책에는 엘릭서, 이드리스등 한국에서는 듣도보도 못한 언어들이 이슈를 받으려 태동하고 있다고 한다. 이 책에서 가장 좋은 말이 왜 새로운 언어를 배워야 하느냐? 이 질문에 이렇게 답한다.
‘함수형 언어를 배움으로 객체지향을 더 잘 할 수 있게 된다’
이 말이 Why? 라는 말을 답변하는 말이라 생각한다. 책에 오탈자라던가 오번역 및 소스코드의 라인피드 오류가 존재한다.(사실 이걸 임작가님께 제보하려다가 말았다.)모두들 함수형의 세계로 한 번 빠져보는 것도 나쁘지 않겠다.
프롤로그/하스켈은 정말 어렵다.
루비
강점
루비는 객체를 단일하고, 일관성 있는 방식으로 다루도록 해주는 순수한 객체지향 언어이고, Duck Typing 혹은 오리타이핑은 객체의 상속구조가 아니라 실제로 객체가 무엇을 지원하는가에 따라 행동을 결정하는 다형성을 가능하게 해준다.
스크립팅
루비는 환상적인 스크립트언어이자, 접착 코드를 작성하거나 크롤링 코드를 작성하거나 테스트 코드 작성할 때 루비의 장점을 맛 볼 수 있다.
웹 개발
Rails의 경우 가장 빠르게 개발이 가능한 프레임워크로 소문이 나있다. 트위터, 깃허브등 유명한 회사조차도 초기에는 RoR (Ruby On Rails) 조합을 가장 많이 사용했다. 특히나, 데이터베이스 스키마의 변화를 알아서 처리한다는 점이 강력하다.
그러나, 트위터의 경우 초기에는 RoR로 커버리지가 되었으나, 성장세에 따른 트래픽처리, 대용량 처리를 위해 결국 스칼라로 재작성되었다. 그럼에도 에버노트나 깃허브는 아직도 루비를 사용중에 있다.
즉, 두가지의 교훈이 존재한다.
- 제품을 빠르게 생산할 때 적합한 언어
- 루비의 확장성에는 한계가 있다.
약점
성능
최대의 약점은 성능이다. 1.9버전의 경우 이전 버전보다 최대 10배이상 빨라졌다. 그러나 이는 언어 설계자의 철학이 담겨져있기에 약점이라고 볼수 있을지 모르겠다. 마츠의 철학은 프로그래머의 생산성에 초점을 맞췄고, 재미있게 프로그래밍하는 것에 중점을 두었다. 성능이 느리고 빠르고는 문제가 아니였기때문에 루비의 성능은 다소 많이 느릴수 밖에 없다.
그리고 두번째는 IDE의 부재가 있다. 루비의 특성때문에 IDE에서 처리하지 못하는 경우가 대다수이며, 디버깅에 대해서도 아쉬운 점으로 꼽힌다.
동시성/OOP
객체지향 프로그래밍은 치명적인 한계가 존재한다. 일반적으로 행위가 상태를 둘러싸고 있다고 가정하는데, 상태는 변할 수 있다. 이 전략은 동시성과 관련하여 큰 문제를 야기한다.
안정성
앞서 말한 IDE의 부재는 오리 타이핑 혹 덕 타이핑이라는 기능으로 인한 비용이다. 이득은 간결하고, 쉬운 코드를 이용해 추상을 깔끔하게 만들 수 있다는 점이지만, 정적 타이핑 언어의 경우 문법 트리를 구축하여 IDE를 제공하나, 루비의 경우 IDE를 만들기 어렵다. 그러나, Jetbrain사의 Rubymine이 존재하여 이 문제는 해결 된 것으로 볼 수 있다.
Io
강점
프로토타입 언어는 상당히 유연하다. 어떤 객체의 어떤 슬롯이라도 변경할 수 있다는 점은 유연성의 꽃이라 볼 수 있다.
메모리 사용량
Io의 메모리 사용량은 적다. 실전에서 사용하는 Io 어플리케이션은 대부분 임베디드 시스템이다. 언어자체가 작고, 유연하기에 이러한 장점을 가진다.
단순성
Io의 문법은 굉장히 압축적이다. 배우기도 쉽고, 단순하다. 그러나 문제는 단순함에서 오는 설명의 어려움이 존재한다.
유연성
어떤 객체의 어떤 슬롯이라도 아무때나 변경하는 것을 허용한다. 그래서 Io의 경우 문법자체에서 정한 Rule까지도 변경할 수 있다.
동시성
액터, 퓨처, 코루틴등을 지원하는데, 요즘 유행하는 액터 모델의 Erlang , Go lang에서도 코루틴을 지원한다. 즉, 이러한 기능으로 하여 테스트도 용이하며 성능도 훌륭한 멀티스레드 어플리케이션을 제작 할 수 있다.
약점
문법
문법이 압축적이고, 단순하기 때문에 어려운 개념의 경우 쉽게 설명하는 것이 어렵다. 그로인해 일어나는 문제가 많다.
커뮤니티
전세계적으로 커뮤니티가 협소하고, 사람도 많이 없다는 점이 가장 큰 문제로 볼 수 있다. NodeJS와 Vert.X의 경우 차이점 또한 막대한 커뮤니티의 힘이라는 점을 알 수 있다.
성능
Io는 단일 스레드에서 실행 속도를 떨어뜨리는 기능을 여러개 가지고 있어서 한계가 존재한다.
Prolog
강점
자연어처리
자연언어 인식을 위해서 처음 사용된 언어가 프롤로그였으며, 자연언어를 가지고, 사실과 추론으로 지식베이스를 적용하고, 컴퓨터가 이해할 수 있는 구체적인 규칙으로 표현하는 것을 가능하게 해준다.
게임
아군, 적군의 동작을 모델링하는 분야는 점점 복잡해지고 있다. 프롤로그 모델은 상대방의 특징과 행위를 주어진 시스템 내부에서 설명할 수 있다. 이는 보다 자연스러운 행동을 하게끔 할 수 있다.
시멘틱 웹
시멘틱웹은 웹에 존재하는 서비스와 정보에 일정한 의미를 부여해서 사용자의 질의를 더 만족스럽게 하려는 웹의 진보된 형태를 말한다. 이 때, 서버는 자원을 가지고 지식 베이스로 컴파일 후 프롤로그의 자연어 처리 기능과 결합해 시너지 효과를 낼 수 있을 것이라 보고 있다.
인공지능(AI)
어떤 에이전트(인공지능 대상체)가 복잡한 규칙을 기초로 해서 필요에 따라 행동을 수정하는 것을 포함한다. 프롤로그는 이런 분야에서 특히 규칙이 구체적이고, 어떤 엄밀한 논리에 바탕을 두고 있을 때 탁월하다.
스케줄링
프롤로그는 제한된 자원을 이용해 스케줄링을 구현할 때 탁월하다.
약점
유틸리티
프롤로그는 핵심분야에서 탁월하며, 논리 프로그래밍 언어로의 자리를 차지했다. 그러나 프롤로그는 범용 목적의 언어가 아니고, 설계상의 한계 또한 지니고 있다.
데이터 집합
프롤로그는 결정 트리를 대 상으로 주어진 규칙의 집합에 매칭되는 가능한 모든 조합을 확인하기 위해 탐색 작업을 하는데, DFS(Depth-First-Search)기법을 사용한다. 단, 알고리즘 자체가 본질적으로 계산하기 어렵고, 데이터 양이 방대하면 계산의 어려움이 존재한다.
특히나, 데이터 집합의 크기를 적당한 수준으로 통제하려고 한다면, 언어 자체가 동작하는 방식을 제대로 이애하고 있어야 한다는 점도 단점이다.
명령형 모델·선언형 모델의 혼합
프롤로그는 재귀적인 규칙을 어떻게 해결하는 지에 대해 정확하게 이해해야 한다. 별로 크지 않은 쉬운 문제에 대해서도 꼬리 재귀와 관련된 규칙을 정의해야 하는 경우가 일반적이다.
Scala
장점
동시성
스칼라가 동시성을 다루는 방식은 동시성 프로그래밍에서 이루어지고 있는 주요한 발전을 반영한다. 액터 모델과 쓰레드 풀은 환영할 만한 발전이다.
불변성은 동시성과 관련해서 코드의 설계를 향상시키고자 할 때 사용할 수 있는 가장 중요한 기법이다.
낡은 자바의 진화
스칼라는 이미 존재하는 자바 커뮤니티를 끌어안고 간다. 자바 라이브러리를 직접 사용 가능하고, 프록시 객체 코드를 생성해서라도 자바 코드를 사용 할 수 있다. 즉, 스칼라는 자바와 완전히 호환이 된다.
DSL
스칼라가 가진 유연한 문법과 연산자 오버로딩은 루비 스타일의 도메인 언어를 개발하는데 적합하다.
XML
스칼라는 데이터 표현 형식의 하나인 XML을 언어 자체에서 지원한다. 단, 이 것은 얼마전까지 장점이었으나, 사실 요즘은 JSON 타입을 많이 사용하고 XML은 이제 사용을 하지 않고 있기에 서서히 단점으로 평가 받고 있다.
약점
정적 타이핑
정적 타이핑은 함수 프로그래밍 언어에서는 자연스럽지만, 객체지향용 자바 스타일 정적 타이핑 시스템은 문제가 존재한다. 즉, 경우에 따라서 컴파일러가 요구하는 내용을 만족하기 위해 개발자가 하고자 하는 대로 되지 않을 때가 존재한다.
문법
스칼라는 자바를 계승하면서도 함수형의 언어를 구현하고자 노력한 언어이기에 차이가 존재하는데 이 차이를 익히기까지 노력이 필요로 하다.
var의 잠재성
변경 가능한 var이 존재하기에 불가피하게 사용한다치더라도 프로그램에는 치명적인 버그를 발생시킬 가능성이 높고, 동시성과 관련하여 제한을 받는다.
Erlang
강점
동적/안정성
얼랭은 무엇보다 안정성을 위해서 만들어진 언어이기에 핵심 라이브러리는 테스트도 되어 있고, 전신의 플랫폼이기에 안정성을 최대의 목표로 선택했다.
light-weight, Non-Share
얼랭의 프로세스는 가볍고, 불변의 철학을 가지고 구축되어 있기에 충돌이 날 수 없는 환경을 가진다. 메시지 전달과 불변으로 객체 지향과는 다른 장점을 가지게 되고, 어플리케이션을 철저하게 분리하는 코드를 작성할 수 있게 만든다.
OTP 라이브러리
얼랭은 20년간 축적된 라이브러리들이 존재하는 데, 이 가운데 OTP라는 오픈 전신 플랫폼이 가장 핵심 라이브러리로 평가받는다. 이 라이브러리를 사용하면, 모니터, 데이터베이스, 분산 시스템등을 쉽게 구축하게 돕는다.
Let it Crash
언제나 새롭게 시작하면 되므로, 잠시 충돌난다할지라도 상관 없다는 철학으로 얼랭의 모토이기도? 하면서 새로운 패러다임을 가져왔다.
약점
문법
문법은 보통의 개발자들이 사용하는 형식과 달라 어렵기도 하고, 가독성도 사실 떨어지긴 한다. 이는 프롤로그의 영향을 받은 얼랭의 문법의 탓이기도 한데, 이는 개발자가 감내해야 하는 부분인 것 같다.
통합
프롤로그와 마찬가지로 JVM 위에서 동작하지 않는다는 점이 약점이다. 이미 수 십년동안 Java 기반의 JVM위에서 동작하는 서버들이 존재 해왔기에, Erlang으로 대체하기란 어렵기도 하나, JVM 기반 Erlang도 개발되고 있다.
Clojure
강점
클로저는 JVM 상에서 동작하는 리스프 언어로 철저한 함수형 프로그래밍 언어이다. 즉, Java와는 다른 함수형 패러다임을 철학으로하는 언어이다. 더군다나 리스프 언어는 제 4세대 언어로 인공지능을 위해 설계 된 언어이기도 하다. (물론, 인공지능에서 쓰이진 않는다.)
동시성
클로저는 STM이라고 하는 Software Transaction Model을 사용하는데, 상태를 변경하는 동작이 적절하게 작성된 함수에 의해 수행 되는지 여부를 자동으로 검출하기에 동시성 문제의 고통을 덜 수 있다.
자바와의 통합
클로저는 자바와 통합이 가능하다. 문자열이나 숫자등을 그대로 사용 가능하고, 성능 향상을 위한 타입 힌트를 제공하기도 한다.
클로저 타입은 Java App 상에서 완전히 사용 가능하다.
Lazy Evaluation
일명 게으른 평가로 잘 알려져 있으며, 실제 계산 결과가 필요로 할 때까지 연산을 지연하고, 계산과 관련 된 오버헤드가 줄어드는 효과를 준다.
코드 = 데이터
리스프에서는 코드 자체가 데이터이며, 이 개념을 등상성?!이라고 들었던것 같다. 사실상 클로저는 등상성을 완벽하게 언어적인 측면에서 지원 한다.
약점
전위 표기
클로저는 전위 표기식을 사용하는데 상당히 난해 하다.처음 배우는 이는 물론이고, 프로그래밍에 능숙한 사람도 전위 표기에 익숙하지 않다.
가독성
클로저의 가독성은 말짱 꽝이다. 무수하게 많은 괄호가 가독성을 낮추는 역할을 한 몫하고, 전위표기는 더군다나 중위 표기를 사용하는 우리들에게 낯선 경험이다.
제한된 리스프
JVM위에서 동작하기에 클로저는 꼬리 재귀 최적화를 제한적으로 밖에 사용 할 수 없다. 이는 성능상 치명적인 단점이다.
Haskell
강점
타이핑 시스템
하스켈의 강한 정적 타이핑 시스템은 실행시간이 아닌 컴파일 시간에 에러를 보고 한다. 이것은 프로그램의 안정성을 확보하는데 도움을 준다.
표현력
하스켈은 필요로하는 자료형까지도 생성 할 수 있으며, 아이디어를 간결하게 표현시키기 위한 기능을 포함하고 있다.
게으른 행위
게으른 계산 전략은 데이터를 다루는 완전히 새로운 종류의 전략을 제공해준다.
약점
프로그랭 모델의 비유연성
하스켈의 모나드 같은 경우는 완전 생소한 개념인데다가 추상도가 높아 상당히 난해하다는 느낌을 받았다. 더군다나, 이 책에서도 마지막 장에 모나드를 설명하는데 사실 모나드를 활용하는 방법이 뭔지 어떻게 잘 사용해야 하는건지 이해를 못했다. 모나드는 확실히 공부를 더 해야 하는 개념임에 분명하다.
커뮤니티
스칼라의 커뮤니티에 비해 하스켈의 커뮤니티는 터무니 없이 소규모라고 할 수 있다. 일단, 스칼라는 실무영역에서도 쓰이는 추세를 가지는데 반해, 하스켈의 경우 추상도가 너무 높은 탓인지 아직 실무영역이나 프레임워크 등에서 볼 수 있는 언어는 아니라고 생각한다.
문법
언어는 도구에 불과하나, 하스켈은 도구 이상인 것 같다. 언어가 혹은 프로그래밍 언어가 프로그래머를 압도하는 느낌이랄까. 잘 익혀서 사용한다면, 하스켈은 사람이 생각해내는 아이디어를 컴퓨터로 풀어내는 언어라는 생각을 하긴 했으나, 문법 자체나 패러다임 배우기가 어렵다는 것이 단점이다.
Sent from My Haroopad
The Next Document processor based on Markdown
Download Haroopad
'책 리뷰' 카테고리의 다른 글
[책] 공부의 기본 (0) | 2016.07.14 |
---|---|
[책] 7번 읽기 공부법 (0) | 2016.07.14 |
[책] 프로그래밍이 보인다! 파이썬 입문 (0) | 2015.11.19 |
[책] 리팩토링 - 프로그램의 가치를 높이는 코드 정리 기술 (0) | 2015.11.05 |
[책] GoF의 디자인 패턴 (0) | 2015.11.05 |
'책 리뷰'의 다른글
- 현재글[책] 브루스테이트의 세븐 랭귀지