클로저 (프로그래밍 언어)

클로저(Clojure)는 리치 히키(Rich Hickey)가 만든 리스프 프로그래밍 언어의 방언으로서, 범용 함수형 언어이다. 이 언어는 불변값과 시간-진행 구문을 통한 프로그래밍을 강조하는데, 이는 보다 탄탄한 프로그램, 특히 멀티스레드 프로그램의 개발을 용이하게 하기 위해서이다.
클로저는 자바 가상 머신과 공통 언어 런타임 (CLR), 그리고 자바스크립트 엔진 상에서 실행된다. 다른 리스프 언어들과 같이 클로저는 코드를 데이터로 취급하며, 정교한 매크로 시스템을 갖고 있다.

**역사**
리치 히키는 클로저 프로그래밍 언어의 창시자이다. 클로저 이전에 그는 .NET 기반의 비슷한 프로젝트인  DotLisp을 개발했다. 클로저 개발과 공개에는 2년 반이 결렸는데, 이 기간 동안 그는 외부 기금없이 거의 클로저에만 전념했다. 그리고 나서 그는 커먼 리스프 커뮤니티의 지인들에게 클로저 언어를 발표하는 메일을 보냈다.

**철학**
리치 히키가 클로저를 만든 것은 함수형 프로그래밍이 가능하면서 자바 플랫폼과 공존하고 동시성을 잘 처리하는 현대적인 리스프를 원했기 때문이다.
클로저의 동시성에 대한 접근은 동일성(identity) 개념으로 특징지을 수 있는데, 이것은 시간의 흐름에 따라 나열된 불변하는 상태들의 계열로 나타낼 수 있다. 상태는 불변값이기 때문에 작업자가 아무리 많아도 동시에 그들을 다룰 수 있게 되어, 동시성은 한 상태에서 다른 상태로의 이동을 다루는 문제가 된다. 이를 위해 클로저는 몇 개의 레퍼런스 타입을 제공하는데, 이들은 각각 상태간 전이에 대한 잘 정의된 범주를 갖는다.

**문법**
다른 리스프와 같이, 클로저의 문법은 S-표현식에 기반하는데, 구문이 컴파일되기 전에 먼저 리더에 의해 파싱되어 데이터로 바뀐다. 클로저의 리더는 맵과 집합, 벡터 그리고 리스트를 위한 리터럴 문법을 지원하는데, 이들이 컴파일러에 그 자체로 주어지게 된다. 다시 말해, 클로저 컴파일러는 리스트 데이터 구조만을 컴파일하지는 않고, 위에서 말한 모든 데이터 구조를 직접 지원한다. 클로저는 Lisp-1이며, 다른 리스프 방언들과 코드 호환이 되도록 만들어지지 않았다.

**언어 기능**
 자바 가상 머신 (JVM) 바이트코드 생성- 자바 (Java) 프로그래밍 언어와의 밀접한 통합. 클로저 응용 프로그램은 JVM 바이트코드로 컴파일되기 때문에 별다른 복잡한 과정없이도 JVM 환경이나 애플리케이션 서버 환경에 배포될 수 있다. 자바 API를 단순하게 사용할 수 있는 매크로도 언어 차원에서 제공하고 있다. 클로저의 데이터 구조는 모두 자바의 표준 인터페이스를 구현하고 있어, 클로저에서 구현된 코드를 자바 코드 쪽에서 실행하기도 쉽다.- REPL 루프(read-eval-print loop) 환경에서의 빠른 개발- 일급 객체로서의 함수- 부수효과 기반의 반복문보다는 재귀와 고계함수 (higher-order function)의 활용을 강조- 지연 평가되는 시퀀스 (sequence)- 풍부한 불변값, 영구 보존적 데이터 구조(persistent data structure)를 지원(해시맵, 집합, 리스트 등)- 소프트웨어 트랜잭셔널 메모리, agent system, dynamic var system 을 통한 동시성 프로그래밍- 임의적인 개수의 인자들의 타입과 값에 대한 다중 동적 디스패치 (참고로, 일반적인 객체 지향 시스템에서 구현된 다형성 개념은 첫 번째 인자의 타입만으로 동적 디스패치 하는 것임)

**변형**
JVM이 아닌 다른 플랫폼에서 동작하는 클로저 프로그래밍 언어의 다른 구현들이 존재한다.- ClojureCLR: 공통 언어 런타임(CLR)에서 동작하며 닷넷 라이브러리들과 같이 사용할 수 있는 원본 클로저 언어의 기능을 완전히 구현하고 있는 변형판이다.- ClojureScript: 웹 브라우저와 모바일 장치에서 사용되는 것을 목적으로 하여 클로저 언어의 일부분을 포팅하였다. 코드를 컴파일하면 최적화된 JavaScript 가 생성된다.- clojure-py: 클로저 언어를 순수 파이썬 언어로 구현하였다.

**헬로 월드 프로그램**
다음은 콘솔에 출력하는 프로그램이다.
(println "Hello world!")
다음은 스윙을 호출하여 GUI에 출력하는 예이다.
(javax.swing.JOptionPane/showMessageDialog nil "Hello World!")

**같이 보기**
 자바 가상 머신 지원 언어- 프로그래밍 언어의 비교

**각주**

**외부 링크**
  GitHub code repository for Clojure-  A comprehensive overview of Clojure url=https://web.archive.org/web/20110628234040/http://java.ociweb.com/mark/clojure/article.html-  Full Disclojure - Screencast-  Clojure talks on Youtube-  Clojure talks on Blip.tv-  clojuredocs.org - Community-powered documentation and examples-  clojure-doc.org - Community-driven documentation site for the Clojure programming language-  4clojure.com - Interactive Clojure Problems url=https://web.archive.org/web/20110424114733/http://4clojure.com/-  TryClojure - An online REPL for Clojure-  Clojure on infoq.com-  Clojure community and resources on Facebook-  R.Hickey presentation "Are We There Yet?" where he advocates for the reexamination of basic principles like state, identity, value, time, types, genericity, complexity, as they are used by OOP. 2009-  한국 클로저 싸이트 url=https://web.archive.org/web/20130703002325/http://clojure.or.kr/
분류:함수형 프로그래밍 언어
분류:프로그래밍 언어
분류:JVM 프로그래밍 언어
분류:2007년 개발된 프로그래밍 언어
분류:리스프 프로그래밍 언어 계열
분류:스크립트 언어
분류:이클립스 라이선스 소프트웨어
분류:크로스 플랫폼 자유 소프트웨어
분류:동적 프로그래밍 언어
분류:다중 패러다임 프로그래밍 언어
분류:소스 대 소스 컴파일러
분류:동적 타입 프로그래밍 언어
분류:고급 프로그래밍 언어