프트웨어 전문지 마이크로소프트웨어의 최신호는 우리가 매일 접하는 웹 페이지, 모바일 등 프론트엔드(Front-End)를 주제로 담았습니다. 자바스크립트, 정적 타입, 리액트, 뷰, 앵귤러, 일렉트론, ESNext 등 마소 393호의 주요 기사들을 IT조선 독자에게도 소개합니다. [편집자주]

이 글의 제목을 보고, “오, 내가 관심 있던 내용이군!”이라고 생각할 사람이 몇이나 될지 모르겠다. 예상되는 대부분의 반응은 아마 “클로저 스크립트가 뭐지? 새로운 언어인가?” 혹은 “클로저는 JVM 기반 언어 아닌가?” 정도일 거라고 생각한다. 그만큼 클로저스크립트는 개발자 사이에서 여전히 생소한 이름이다. 매년 수많은 프로그래밍 언어들이 새롭게 태어나는 시대에, 또 하나의 생소한 프로그래밍 언어에 관심을 가지기는 쉽지 않을 것이다.

하지만, 단순히 “또 새로운 언어야?”라고 하며 넘겨버리기 전에, 잠깐 마음을 열고 다음의 단어들을 살펴보자. 함수형 프로그래밍, 불변 데이터 구조, 메타 프로그래밍. 속성-기반 테스팅, 도메인 특화 언어(DSL), 인터렉티브 프로그래밍, 리액트. 이 단어들 중 한 가지라도 관심이 있던 주제가 있는가? 만약 그렇다면 이 글을 꼭 끝까지 읽어보길 권한다. 어쩌면 이 글을 통해 자바스크립트 환경에서 사용할 수 있는 또 다른 강력한 도구를 손에 쥐게 될지도 모르니 말이다.

클로저스크립트에 대해 본격적인 소개를 하기 전에 먼저 부모격이라 할 수 있는 클로저에 대해서 살펴봐야 할 것 같다. 앞서 잠깐 언급했듯이 클로저는 JVM 환경에서 실행되도록 만들어진 함수형 언어다. 아마 스칼라나 코틀린(Kotlin) 같은 언어를 떠올리면 이해가 쉬울 것이다. 하지만 클로저는 이러한 언어들과 특별한 차이점가 있다. 바로 리스프(Lisp) 계열 언어라는 점이다.

리스프는 프로그래밍 역사에서 아주 중요한 위치를 차지하고 있음에도 불구하고, 개발자에게 굉장히 생소한 언어다. 아마 폴 그레이엄의 <해커와 화가>를 읽은 적이 있거나 이맥스를 사용해 본 적이 있다면 조금은 친숙할 수도 있지만, 대부분의 개발자들에게는 접할 기회가 없는 언어일 것이다. 사실 리스프만 소개하기에도 내용이 상당히 많기 때문에, 이 글에서 상세하게 설명하기는 어렵다. 하지만 리스프의 특징을 모르고서는 클로저를 설명할 수 없기 때문에 아주 핵심적인 부분만 설명하겠다.
리스프의 가장 큰 특징은 바로 ‘코드를 데이터로써 다룬다(Code As Data)’는 점이다. 리스프는 ‘원래(List Processor)’라는 의미에서 나온 이름이다. 리스프의 소스코드는 리스프의 주요 데이터 구조인 연결-리스트(Linked List)로 표현된다. 이처럼 코드를 단순히 데이터 구조로써 다룰 수 있으면 다른 언어에서는 불가능한 다양한 일들을 할 수 있게 된다. 그중 하나가 바로 매크로를 이용한 문법의 확장이다. 즉, 소스코드를 데이터로써 읽어 들여 다른 형식의 데이터로 변환하면, 거의 무한한 방식으로 언어를 확장할 수 있게 된다.

이러한 특징 덕분에 리스프는 ‘도메인-특화-언어’를 생성하거나, ‘메타-프로그래밍’을 하는 데에 굉장히 유용하게 사용될 수 있다.

클로저와 클로저스크립트의 차이점이 상세히 기재된 홈페이지. / 마이크로소프트웨어 393호 발췌
클로저와 클로저스크립트의 차이점이 상세히 기재된 홈페이지. / 마이크로소프트웨어 393호 발췌
그렇다면 클로저와 클로저스크립트는 어떻게 다를까? 사실 대부분 주요 개념들과 문법, 코어 라이브러리 등은 거의 동일하다고 할 수 있다. 클로저가 몇 년에 걸쳐 발전해오는 동안, 클로저스크립트도 동일한 스펙을 유지하며 같이 발전해왔다. 하지만 실행되는 플랫폼이 다르기 때문에 몇 가지 다른 점이 존재한다. 클로저는 JVM에서 실행되기 위한 언어인 반면, 클로저스크립트는 자바스크립트 VM에서 실행되기 위한 언어이기 때문이다.
예를 들어 클로저에는 수를 나타내는 타입으로 ‘int’, ‘long’, ‘float’ 등 다양한 타입이 있지만, 클로저스크립트에는 자바스크립트와 동일하게 ‘number’형만 존재한다. 또한 클로저스크립트는 기본적으로 단일 스레드 환경에서 실행되기 때문에, STM(Software Transactional Memory) 같은 기능은 아직 지원하지 않는다. 이 외 매크로, REPL 환경 등 몇 가지 차이점이 있으며, 이러한 차이점은 공식 홈페이지(clojurescript.org/about/differences)에 상세하게 정리돼 있다.

김동우 필자의 클로저스크립트에 대한 자세한 내용은 ‘마이크로소프트웨어 393호(https://www.imaso.co.kr/archives/3408)’에서 확인할 수 있다.