2009-12-08 3 views
9

왜 Clojure가 동시 프로그래밍에 정말 좋은지 알 수 있습니다. 이 점에서도 FP의 장점을 알 수 있습니다.Clojure가 동시성/불변성 기능과 관련이없는 Java에 대해 실제로 빛나는 사례는 무엇입니까?

분명히 우리가 쓰는 모든 코드 행이 스레드의 일부이거나 동시에 액세스 할 필요는 없습니다. 코드 부분 (더 간단하고 순차적 인 코드 조각)에 대해 Clojure가 제공 한 자바가 실제로 놓친 부분은 무엇입니까?

Multimethods, Dynamic binding, Java에서 실제로 소실 된 Destructuring 바인딩과 같은 기능이 있습니까?

나는 내 질문도 같이 프레임 할 수 있습니다 가정 :

  • Clojure의는 동시성이 전체 불변성/가변성 문제는 다음, 우리의 관심사 아니었다했고 것을 제공하지 않은 경우 어떤 Clojure는 Java 대신에 이것을 사용하게 해주는 을 제공합니까?
+0

는, 모든 코드는 JVM에서 실행 : 여기

public class StringUtils { public static boolean isBlank(String str) { int strLen; if (str == null || (strLen = str.length()) == 0) { return true; } for (int i = 0; i < strLen; i++) { if ((Character.isWhitespace(str.charAt(i)) == false)) { return false; } } return true; } } 

은 Clojure의 비슷한 구현은 *는 스레드의 일부입니다. –

답변

25

멀티 메서드, 동적 바인딩, 파괴 결합이 Java에서 정말 빠졌는가?

예. 또한 ...

  1. 일급 함수입니다. 맛있는 일류 기능. 이것은 단지 FP 일이 아닙니다. 사람들이 Java 7에서 클로저를 요구하는 데는 충분한 이유가 있습니다.

  2. 코드 - 데이터입니다. 이것이 모든 Lisp의 이점입니다. Lisp 코드는 컴파일러의 입으로 들어가서 다시는 볼 수없는 텍스트의 얼룩뿐만 아니라, 프로 그램 적으로 조작 할 수있는 목록 및 벡터 및 기호와 리터럴 구조입니다. 이로 인해 강력한 매크로와 일류 기호 및 기타 여러 가지 이점이 있습니다. 그것은 매우 확장 가능하고 강력한 언어로 연결됩니다.

  3. Clojure는 더 나은 제어 및 루핑 구문과 매크로 및 일류 함수를 통해 자신 만의 기능을 만들 수 있습니다. Java는 forforeachwhile입니다 (심지어 수년간 foreach도 없었습니다).Clojure는 ifwhen 양식이 많고, for을 통해 목록 이해도가 높은 do 양식이 많습니다. 이것들이 존재하지 않는다면, 직접 작성할 수 있습니다. Java에서는 이러한 기능을 승인하기 위해 (아마도)위원회에서 10 년을 기다려야합니다.

  4. 빼기 정적 유형 지정을 다루는 사람은 모두 Java 7으로 설정되며, Clojure는 이미 가지고 있거나 가질 수도 있습니다. "자동 리소스 관리", Clojure는 with-open입니다. "콜렉션에 대한 언어 지원", Clojure (및 Ruby, Perl, Python ...)가 이미 있습니다. Clojure는 "switch in switchs"보다 더 강력한 case-like 구조를 가지고 있습니다. 다른 것들은 생각할 수 있습니다. condp. 당신은 Clojure의 12 라인에이 중 자신을 쓸 수 있습니다.

  5. 목록,지도, 배열, 집합, 정렬 된 집합, 정렬 된지도 등의 간결한 구문으로 seq 추상화 덕분에 거의 비슷하게 사용할 수 있습니다. 정규 표현식, 문자, 익명 함수 등에 대한 리터럴 지원

  6. 자바에는 필수 검사 예외가 있습니다. Clojure는 그렇지 않습니다.

  7. Java 구문이 길고 불규칙합니다. Clojure 구문은 간결하고 규칙적입니다. Clojure로 작성된 Java조차도 ->doto과 같은 매크로 덕분에 Java로 작성된 Java보다 간결하며 종종 proxy 및 (곧) reify과 같은 구문을 사용합니다.

  8. Java 코드에 너무 많은 필수 상용구 및 끝없는 반복이 있습니다. public static void main(String[] args){...} 등입니다. Clojure는 표현의 힘이나 힘에 관해 거의 희생시키지 않으면 서이 보일러 플레이트의 어느 것도 가지고 있지 않습니다. 오늘날 정적으로 형식화 된 다른 언어조차도 형식 유추의 길로 간다. Java 코드를 작성하고 끝없이 "리팩터링"하기 위해 부피가 큰 자바 중심의 IDE가 필요한 이유가 있습니다. 손으로 그것을 쓰면 미친 듯이 몰아 내고 손가락을 새끼들에게 마주 칠 것입니다.

  9. Java에서 모든 것이 불필요한 복잡성의 원인이되는지 여부에 관계없이 클래스 또는 인터페이스입니다. OOP 스타일에 맞추기 위해 인식을 넘어서서 엉망이되어야하는 많은 프로그램들이 있습니다. Clojure 당신이 이것을 피할 수 있습니다. A nice rant to this effect. Clojure는 주로 동사에 중점을 둡니다.

  10. REPL을 통한 대화 형 프로그래밍은 재미 있습니다. 컴파일/실행/디버그 사이클이 아닙니다. Clojure는 원하는 경우 .class 파일로 계속 컴파일합니다. 그 동안 코드가 실행되는 동안 자유롭게 코드와 땜장이에 앉아있을 수 있습니다.

  11. Clojure의 메타 데이터와 평범한 평등 테스트가 함께 즐겁습니다. Bigint에 대한 int의 자동 승격, 합리적인 숫자의 네이티브 처리 등이 그렇습니다.

  12. 동적 유형 지정은 정적 유형 지정보다 더 짧고,보다 일반화되어 재사용이 가능하므로 더 강력한 코드입니다. (이것은 분명히 매우 논쟁의 여지가 포인트입니다, 그래서 마지막에 넣어.)

스칼라와 그루비와 JRuby를하고 자이 썬과 끝이 다른 인기 JVM - 언어, 즉-ICC를 모르고 자바는해야한다 JVM이 좋은 반면 Java 언어는 많은 사람들에게 불쾌감을 준다는 좋은 징후로 간주됩니다.

+2

귀하의 포인트 # 10은 실제로 자바 또는 Clojure와 아무 상관이 없습니다. 구현의 특징은 실제로는 아니지만 개발 환경의 특성입니다. 스몰 토크 IDE로서의 삶을 시작한 이클립스는 10 년 동안 자바 REPL을 가지고있다. 숨겨진 것이다. Mono에는 C# REPL이 있습니다. REPL을 가지고있는 C와 C++ 인터프리터가 있습니다. F #, Scala, Haskell에는 REPL이 있습니다. 100 %는 당신의 다른 11 점에 동의합니다. –

+0

쿨한, 나는 Java REPL을 본 적이 없다. 그것이 존재하고 사용된다면 그것은 좋은 것입니다. Clojure/다른 Lisps에서는 REPL이 거의 표준이므로 도구 및 커뮤니티에 대한 훌륭한 지원이 있습니다. 대화 형 프로그래밍은 Clojure 프로그래밍을 수행하는 유일한 방법입니다. 꽤 많은 다른 언어에서 잡히지 않은 것 같습니다. –

+0

그냥 체크 했으니, 아직 거기에있다 : http://help.eclipse.org/galileo/topic/org.eclipse.jdt.doc.user/concepts/cscrapbook.htm Eclipse가 여전히 VisualAge 일 때만 큼 멋지지 않았다. 그래도 스몰 토크. –

2

글쎄, 일반적으로 Clojure에서는 "의식"이 훨씬 적습니다. Python과 Ruby 같은 언어는 Java에 비해이 점에서 유리합니다 (JRuby, Jython의 인기).

그러나 명확한 패턴이있을 수 있지만 Java에서는 자세한 표시를 피할 수없는 경우가 있습니다. Clojure의 매크로는 다른 유사한 동적 언어보다 훨씬 큰 이길 수 있습니다.

또 다른 고려해야 할 점은 Clojure 프로그램이 동시성을 유지하는 경향이 있다는 것입니다. 따라서 특정 애플리케이션을 동시에 실행하기 위해 길을 결정하면 너무 고통스럽지 않습니다. 결정을 많이 내리지 않고 Java를 사용하면이 작업이 상당히 어려울 것입니다.

또한 Clojure가 강력한 동시성 프리미티브가 부족하고 불변성이 부족하다면 Clojure가 Java보다 명확한 이점을 갖고 있는지 궁금해합니다. "Clojure가 Clojure가 아니라면 어떻게 될까요?"

6

브라이언은 그것을 아주 잘 요약했습니다. 여기에 정말로 인상 깊었던 것이 있습니다.아파치 공용

자바 코드 (스튜어트 Halloway에 의해 도서 Programming Clojure에서) : 사실

(defn blank? [s] (every? #(Character/isWhitespace %) s))