[왜 클로저(Clojure)인가?] 1. 최후의 프로그래밍 언어
2011년 7월 11일 로버트 C. 마틴(Robert C. Martin) (일명 Uncle Bob, 이하 엉클 밥)은 런던에서 진행된 ‘The Last Programming Language’ 라는 주제의 강연에서 이제 우리 소프트웨어 산업에 최후의 프로그래밍 언어가 필요하다고 역설했다. 그의 주장을 정리하면 다음과 같다.
[caption id="attachment_1718" align="aligncenter" width="275"]
로버트 C. 마틴 (일명 밥아저씨)
40년 경력. Agile. XP. 소프트웨어 장인 운동. [소프트웨어 개발의 지혜], [클린 코드][/caption]
- 이제 거의 발명될 수 있는 언어는 다 발명되었다.
- 새로운 언어는 기존 언어를 약간 수정한 수준일 뿐이다.
- SW 분야가 현재의 기예(Art)의 단계에서 과학의 단계로 올라서야 한다.
- 그러기 위해 수학이나 화학에서처럼 단일한 언어가 필요하다.
위키피디아의 Programming Paradigm 페이지를 보면 현재 총 54개의 프로그래밍 패러다임이 있다. 물론 주요 패러다임은 명령형/함수형/객체지향형/논리형으로 구분되지만 좀 더 세분하면 그렇다는 것이다(주요 패러다임에서 객체지향형를 빼기도 하는데, 이때 객체지향형은 명령형과 같이 취급된다). 또한 기계어에서부터 그림문자 언어(Scratch), 그리고 비트맵 언어(Piet)까지 다양한 표기 방식의 언어들이 존재한다. 엉클 밥은 최초의 프로그래밍 언어가 나온 이래로 이제 우리는 프로그래밍 언어 디자인 공간을 거의 다 탐색했다고 한다. ‘더 이상 남은 여지가 있는가?’ 위키피디아 [List of Programming Languages] 페이지에는 알파벳 A부터 Z까지 나열된 프로그래밍 언어가 수 백개 정도 된다(Basic 계열 방언과 기이한 언어들은 빼고).
프로그래밍 언어가 이처럼 난립해 있지만, 실제로 SW 산업 분야에서 사용되고 있는 언어는 한정되어 있다. 올해 2013년의 프로그래밍 언어 인기도를 나타내는 TIOBE 2013의 순위를 1위부터 나열하면 C, Java, C++, Objective-C, PHP, C#, VB, Python, Javascript, Transact-SQL 이다. 이들 10개 언어의 인기도의 총합이 약 74.4% 이다 (프로그래밍 언어 인기도를 측정하는 곳은 TIOBE외에도 Language Popularity Index, PYPL , RedMonk, LangPop 등이 있는데, 대동소이하다). 현재 SW 산업에서는 각 분야별로 사용되는 언어가 어느 정도 정해져 있다고 볼 수 있는데, 이런 현상은 거의 변하지 않고 있다.
엉클 밥은 이처럼 SW 산업의 각 분야별로 서로 다른 언어를 사용하고 있는 상태를 ‘기예의 단계’라고 평가하면서, 언어의 지나친 다양성으로 인해 프로그래머들이 여러 언어를 배우고 다루는데 많은 노력이 소요됨으로 인해서 생산성의 향상에 방해가 되고 있다고 주장한다. 그는 지금까지 탐색된 프로그래밍 패러다임 중 우수한 것으로 판명된 것들을 추려서 구현한 하나의 단일한 언어가 나올 때가 되었는데, 만약 그런 언어가 있다면, 현재의 SW 산업은 단일한 언어를 사용하는 수학이나 화학과 같이 ‘과학의 단계’에 들어설 것이고, 이는 엄청난 생산성의 향상을 가져올 것이라고 주장한다.
그러면서 그는 이 단일한 하나의 언어, 혹은 최후의 언어가 갖추어야 할 조건을 다음과 같이 제시하였다.
최후의 프로그래밍 언어의 조건 :
- 한 회사의 통제 하에 있어서는 안된다.
- Garbage Collection을 지원해야 한다.
- GOTO 문이 없어야 한다.
- 할당문 사용이 제한되어야 한다(보다 함수적 프로그래밍이 되어야 한다).
- 다형성을 제공해야 한다.
- 멀티 패러다임이지 않아야 한다 (멀티 패러다임이란 명령형/객체지향/함수형/논리형 패러다임중 하나가 아니라 여러 개를 지원하는 것을 말한다).
- 가상 머신상에서 실행되어야 한다.
- 기존 프레임워크를 사용할 수 있어야 한다.
- 빨라야 한다.
- 단순한 문법이어야 한다.
- 등상성(Homoiconicity)을 가져야 한다 (등상성은 Code As Data 라고도 하는데, 한 언어에서 코드와 데이타가 같은 방식으로 표현되는 것을 말한다. 등상성을 지원하는 언어에서는 데이터를 생성하는 것과 코드를 생성하는 것이 정확하게 같은 것이다. 이런 점에서 기계어는 등상성이다 (그밖에 Prolog, XSLT, R, Factor, Io 등))
엉클 밥은 현재 이러한 조건을 만족하는 언어는 클로저(Clojure) 밖에 없다고 하면서 다음과 같이 클로저(Clojure)의 특징을 열거한다.
클로저(Clojure)의 특징 :
- 클로저(Clojure)는 현대적인 리스프이다. 리스프처럼 문법이 간결하다.(F#이나 Scala는 C++처럼 문법이 복잡하고 기이하다)
- 클로저(Clojure)는 JVM상에서 실행된다. 브라우저에서 실행되는 클로저(Clojure)인 ClojureScript와, CLR에서 실행되는 클로저(Clojure)인 ClojureCLR도 있다.
- 클로저(Clojure)는 동시성에 대한 최신 솔루션인 STM(Software Transaction Memory)을 제공한다. 그래서 Thread와 Lock이 필요없다.
- 클로저(Clojure)는 빠르다(메모리 공유 불변 데이타 구조 채택)
- 다양한 지원 : 튜토리얼, 블로그, IDE, 커뮤니티, 메일링 리스트.
엉클 밥은 Why Clojure? 란 자신의 블로그 글에서 다음과 같이 클로저(Clojure)에 대해 웅변한다.
"우리는 지금까지 수십 년에 걸쳐 프로시져(Procedure: 절차형)에서 객체로 이전해 왔다. 마찬가지로, 이제 하드웨어의 물리적 제약으로 인한 함수형 언어로의 패러다임 이동이 불가피하게 되었다. 다음 몇 년 동안 우리는 어느 함수형 언어가 가장 좋은지 판별할 수 있는 다양한 프로젝트 실험들을 보게 될 것이다. 그 실험의 결과가 나올 때, 나는 클로저(Clojure)가 매우 높은 위치를 차지할 것이라는 것을 완전 기대한다."
믿거나 말거나
클로저(Clojure)에 대한 높은 평가는 엉클 밥에 그치지 않는다. 딘 왐플러(Dean Wampler)는 자신의 책 [Functional Programming for Java Developers]에서 클로저(Clojure)에 대해 다음과 같이 말했다.
“앞으로 10년 간 당신이 사용하게 될 언어가 무엇이든 그것은 클로저(Clojure)로부터 깊은 영향을 받을 것이라는데 내기를 걸어도 좋다”
하지만 엉클 밥의 최후의 프로그래밍에 대한 주장은 다음과 같은 의문점에 대한 답을 제시해 주고 있지 않다.
- 프로그래밍이 어떤 의미에서 과학이 될 수 있다는 것인가? (프로그래밍은 예술일 수 밖에 없지 않을까?)
- 프로그래밍이 과학이 될 수 있다 하더라도 여러 언어가 있는 상태에서 과학의 단계에 진입하는 것이 과연 불가능한가?
- 프로그래밍 세계에 한 언어만 남는 것이 과연 좋기만 한 것일까?
한 두 사람의 전문가의 말만 믿는다는 것은 위험천만한 일이다. 일반인이 전문가의 주장에 대한 진위를 직접 판단할 수는 없지만, 일반인의 전문가에 대한 이러한 약점은 전문가끼리의 대질 신문이라는 방식으로 극복될 수 있다. 즉 한 전문가의 의견을 다른 전문가의 의견과 비교해 보는 것이다. 일찍이 물리학자 파인만은 이렇게 말했다.
“과학이란, 전문가 의견을 신뢰할 수 있는가에 대해 체계적으로 의심하는 것이다.” - 리차드 파인만.
사실 마틴 파울러(Martin Fowler)는 최후의 언어라는 개념에 회의적이지만, 만일 그런 것이 있어야 한다면 그것은 자바스크립트가 될 것이라고 했다. 물론 자바스크립트에 대한 얘기는 그가 농담조로 말한 것이지만, 최근 자바스크립트의 성장세(구글 V8 엔진의 성능에 힘입은)는 괄목할 만한 것이어서 과연 어떻게 될지 귀추가 주목된다.
그러나 마틴 파울러가 한가지 놓친 것이 있는데, 그것은 클로저스크립트(ClojureScript)이다. 클로저(Clojure)가 JVM상에서 실행되어서 Java 및 그 모든 라이브러리를 사용할 수 있듯이, 클로저(Clojure)와 거의 완전하게 똑같은 클로저스크립트(ClojureScript)는 자바스크립트로 컴파일되어 브라우져에서 실행되기 때문에 자바스크립트 및 그 모든 라이브러리를 사용할 수 있다는 점에서 자바스크립트의 성장세는 클로저(Clojure) 프로그래머들에게는 매우 반가운 일이다 (클로저스크립트(ClojureScript)외에 자바스크립트로 컴파일되는 다른 언어로는 커피스크립트나 GWT 등 아주 많은데(List of languages that compile to JS을 보라), 혹자는 이런 현상때문에 자바스크립트를 웹의 어셈블리어로 부르기도 한다).
엉클 밥의 주장에 동의하든 동의하지 않든 그것은 각자의 선택이지만, 우리가 분명 인정할 수 있는 한 가지 사실은 클로저(Clojure)가 최후의 언어가 될 것이라는 주장이 있다라는 사실이다.
물론 클로저(Clojure)외에도 우수한 언어는 많이 있을 것이다. Scala나 Haskel, Erlang, 구글의 GO 등등. 다만 클로저(Clojure)와 함수형 프로그래밍를 소개하는 이 글이 여러분들의 방식으로 우수한 언어를 찾게 되는 계기(혹은 현재 사용하고 있는 언어의 사용법에 대한 재발견)가 되길 바란다.