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

위키백과, 우리 모두의 백과사전.
이동: 둘러보기, 검색
클로저
패러다임 함수형
발표년도 2007년
설계자 리치 히키
최근 버전 1.6
라이선스 이클립스 퍼블릭 라이선스

클로저(Clojure)는 리치 히키(Rich Hickey)가 만든 리스프 프로그래밍 언어의 방언으로서, 범용 함수형 언어이다. 이 언어는 불변값과 시간-진행 구문을 통한 프로그래밍을 강조하는데, 이는 보다 탄탄한 프로그램, 특히 멀티스레드 프로그램의 개발을 용이하게 하기 위해서이다.

클로저는 자바 가상 머신공통 언어 런타임 (CLR), 그리고 자바스크립트 엔진 상에서 실행된다. 다른 리스프 언어들과 같이 클로저는 코드를 데이터로 취급하며, 정교한 매크로 시스템을 갖고 있다.

역사[편집]

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

철학[편집]

리치 히키가 클로저를 만든 것은 함수형 프로그래밍이 가능하면서 자바 플랫폼과 공존하고 동시성을 잘 처리하는 현대적인 리스프를 원했기 때문이다.[1][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[3] : 공통 언어 런타임(CLR)에서 동작하며 닷넷 라이브러리들과 같이 사용할 수 있는 원본 클로저 언어의 기능을 완전히 구현하고 있는 변형판이다.
  • ClojureScript[4] : 웹 브라우저와 모바일 장치에서 사용되는 것을 목적으로 하여 클로저 언어의 일부분을 포팅하였다. 코드를 컴파일하면 최적화된 JavaScript 가 생성된다.
  • clojure-py[5] : 클로저 언어를 순수 파이썬 언어로 구현하였다.

헬로 월드 프로그램[편집]

다음은 콘솔에 출력하는 프로그램이다.

(println "Hello world!")

다음은 스윙 (자바)를 호출하여 GUI에 출력하는 예이다.

(javax.swing.JOptionPane/showMessageDialog nil "Hello World!")

참조[편집]

  1. Rationale. 《Rich Hickey》. clojure.org. 2013년 8월 9일에 확인.
  2. By: Charles (2009년 10월 6일). Expert to Expert: Rich Hickey and Brian Beckman - Inside Clojure | Going Deep | Channel 9. Channel9.msdn.com. 2012년 6월 28일에 확인.
  3. clojure/clojure-clr · GitHub. Github.com. 2013년 8월 8일에 확인.
  4. clojure/clojurescript · GitHub. Github.com. 2013년 8월 8일에 확인.
  5. halgari/clojure-py · GitHub. Github.com. 2013년 8월 8일에 확인.

바깥 고리[편집]

아래 열거된 바깥 고리 목록은 위키백과의 정책 혹은 편집 지침을 따르고 있지 않습니다. 더 좋은 문서가 되도록 문서 수정을 도와주세요.