Java가 동시 프로그래밍 기능을 제공 할 때 Java 대신 Clojure를 사용할 때의 주요 이점은 무엇입니까?왜 동시 프로그래밍을위한 Java 대신 Clojure
답변
Clojure에 대한 전문 지식이 없어도 Clojure가 동시 프로그래밍에 대한 세부 사항을 숨기고 있으며 악마가 세부 사항에 있다는 것을 알고 있기 때문에 Clojure가 좋은 점이라고 생각합니다.
Clojure에서 동시성에 대해 Rick Hickey (Clojure 작성자)의 this excellent presentation을 검사 할 수 있습니다. 편집 : 분명히 JAOO 오래된 프레 젠 테이션을 제거했습니다. 아직이 새로운 소스를 찾을 수 없었습니다.
Java 프로그래밍 언어의 진화는 Sun의 역 호환성에 대한 우려 때문에 주로 느리게 진행됩니다.
왜 Clojure와 Scala 같은 JVM 언어를 직접 사용하고 싶지 않으십니까?
세계는 지난 10 년 동안 발전해 왔으며 Java 언어 (! = JVM)는 계속해서 열심히 노력하고 있습니다. JVM을위한보다 현대적인 언어는 새로운 아이디어와 개선 된 개념을 기반으로하므로 많은 지루한 작업을 훨씬 간단하고 안전하게 만듭니다.
Clojure의은 몇 가지 간단한 규칙에 따라 병행 안전 달성 말할이다 기능 프로그래밍 패러다임에 기초하므로 :
- 불변 상태
- 기능이 더있는을 부작용
이렇게 작성된 프로그램에는 수평 확장 성이 내장되어 있지만 잠금 기반 동시성 메커니즘 (자바와 함께) 경쟁 조건, 교착 상태 등의 버그가 발생하기 쉽습니다.
Lisps는 순전히 기능적이지는 않습니다. 동시 적으로 발생할 때 많은 가변적 인 데이터 구조와 부작용을 가지고 완벽하게 망가질 수 있습니다. 하지만 함수형 프로그래밍 옹호론자는 병목 현상과 같은 부작용을 피할 수 있으므로 병행 성을 훨씬 쉽게 할 수 있습니다. – delnan
Clojure는 concurrency으로 설계되었습니다.
Clojure는 Java보다 높은 추상화 수준에서 동시성 기본 요소를 제공합니다. 이 중 일부는 다음과 같습니다.
공유 트랜잭션에 대한 동기식 및 조정 된 변경 사항을 처리하기위한 소프트웨어 트랜잭션 메모리 시스템입니다. 원자 연산으로 여러 참조를 변경할 수 있으며 프로그램의 다른 스레드가 수행하는 작업에 대해 걱정할 필요가 없습니다. 거래 내에서 항상 세계를 일관되게 볼 수 있습니다.
비동기 변경을위한 에이전트 시스템. 이것은 Erlang에서 전달되는 메시지와 유사합니다.
변수에 대한 로컬 변경 사항을 스레드합니다. 이 변수에는 프로그램의 모든 스레드가 공유하는 루트 바인딩이 있습니다. 그러나 변수를 다시 바인드하면 해당 스레드에서만 볼 수 있습니다.
이러한 동시성 프리미티브는 모두 Clojure 불변의 데이터 구조 (즉, 목록, 맵, 벡터 등) 위에 구축됩니다. 가변 자바 객체의 세계에 들어가면 모든 프리미티브가 무너지고 잠금과 조건 변수로 돌아 간다. (필요한 경우 클로저에서도 사용할 수있다.)
불변의 타입을 가지는 것에 관한 멋진 점 중 하나는, 대부분의 내장 함수가 이미 멀티 스레드 화되어 있다는 것입니다. 간단한 '감소'는 추가 작업없이 여러 코어/프로세서로 확장됩니다.
그럼 Java로 멀티 스레드 할 수는 있지만 잠금 장치와 기타 등등이 필요합니다. Clojure는 별도의 노력 없이도 멀티 스레드 처리가 가능합니다.
감싸 주어야한다고 생각합니다 (seque (reduce (pmap #(stuff) input)))
–
예, Java는 동시 프로그램에 필요한 모든 기능을 제공합니다.
유추 : C는 많은 문자열 처리가 있어도 메모리 안전 프로그램에 필요한 모든 기능을 제공합니다. 그러나 C에서 메모리 안전은 프로그래머의 문제입니다.
따라서 동시성 분석은 매우 어렵습니다. 가능한 모든 동시성 위험을 예상하기보다는 본질적으로 안전한 메커니즘을 사용하는 것이 좋습니다.
인터 로크를 추가하여 공유 메모리 변경 가능 데이터 구조 동시 프로그램을 안전하게 만들려고하면 긴장감을 느낍니다. 게다가, 그것은 대부분 untestable입니다.
Clojure의 기능 스타일을 사용하여 동시 Java 코드를 작성하는 것이 하나의 좋은 방법 일 수 있습니다.
불변의 데이터, vars, refs (및 소프트웨어 트랜잭션 메모리), 원자 및 에이전트를 통한 동시성에 대한 Clojure의 접근 외에도 Lisp은 배우기에 가치있는 Lisp입니다. 목록, 벡터, 맵 및 세트에 대한 리터럴을 비롯하여 Lisp 매크로, 구조화, 첫 번째 클래스 함수 및 클로저, REPL 및 동적 타이핑을 모두 Java 라이브러리와의 상호 운용성을 기반으로 제공합니다 (CLR 버전도 개발 됨).)
그것은 정확히 계획 또는 커먼 리스프와 같은 아니지만, 혹시 Structure and Interpretation of Computer Programs을 통해 직장이나 폴 그레이엄의 그의 essays에 대해 이야기 무엇을 grok 수하려면 학습이 당신을 도울 것입니다, 당신은 XKCD에서 this comic 관련 될 수 . ;-)
이 video 프리젠 테이션은 시도로 구현 된 효율적인 영구 데이터 구조를 중심으로 매우 강력한 사례입니다.
링크가 끊어진 것 같습니다. 누구나 작동하는 사람이 있습니까? – Surya
@ 수어 : 분명히 그들은 오래된 회의 프레젠테이션을 삭제했습니다. –
이 프레젠테이션을 생각하고 있었습니까? http://clojure.blip.tv/file/812787/ – egbokul