성능 및 Java 상호 운용성 : Clojure 대 Scala


82

나는 이미 Clojure 대 Scala에 대한 다양한 설명을 읽었으며 둘 다 자신의 자리가 있다는 것을 알고 있습니다. Clojure와 Scala를 비교할 때 완전한 설명을 얻지 못한 몇 가지 고려 사항이 있습니다.

1.) 두 언어 중 일반적으로 더 빠른 것은 무엇입니까? 이것은 언어 기능마다 다를 수 있지만 일반적인 성능 평가가 도움이 될 것임을 알고 있습니다. 예를 들어, 파이썬 사전이 정말 빠르다는 것을 알고 있습니다. 그러나 전체적으로 Java보다 훨씬 느린 언어입니다. 나는 Clojure와 함께 가서이 문제에 직면하고 싶지 않습니다.

2.) Java와의 상호 운용성은 어떻게됩니까? 내가 지금까지 읽은 것은 Scala에는 대규모 Java 코드 기반과 통합하기가 다소 어색한 네이티브 컬렉션 유형이있는 반면 Clojure는 Java 클래스와 상호 운용하는 간단한 Iterable / Iterator 중심 방식을 따릅니다. 이것에 대한 더 많은 생각 / 세부 사항은?

궁극적으로 clojure와 scala 사이에 충분히 가깝다면 둘 다 시도해 볼 수 있습니다. Clojure의 한 가지는 언어가 매우 간단 해 보인다는 것 입니다. 그러나 다시, Scala는 매우 유연한 유형 시스템을 가지고 있습니다. 그러나 Scala가 빠르다는 것을 알고 있습니다 (여러 개인 계정을 기반으로 함). 따라서 Clojure가 상당히 느리다면 나중보다는 빨리 알고 싶습니다.


1
Clojure 1.2를 사용하면 Clojure가 오버 헤드없이 java를 호출 할 수 있습니다. 봐 assembla.com/wiki/show/clojure/Datatypesassembla.com/wiki/show/clojure/New_new . 이것은 Clojure가 Java에 가깝기를 원하지만 Clojure에서 구현되기 때문에 수행됩니다.
nickik

답변:


73

어느 언어라도 충분히 빠르다고 생각합니다. Python과 Java를 비교할 때 속도 차이에 대해 언어를 비난하는 것은 다소 비합리적으로 보입니다. Java는 컴파일 된 JIT (모바일 장치 제외 *) 인 반면 Python은 해석됩니다. 둘 다 바이트 코드를 사용한다고해서 구현이 원격으로 비슷한 성능을 가질 수 있다는 의미는 아닙니다. 그러나 Scala와 Clojure는 모두 JVM 언어이므로 비슷한 성능을 가져야합니다.

Scala는 Clojure에 비해 몇 가지 구현 이점이 있으며 다소 높은 성능을 기대합니다. Scala의 정적 타이핑은 일반적으로 Clojure의 덕 타이핑에 비해 속도 이점으로 변환되지만 Clojure 코드 속도를 상당히 높일 수있는 유형 힌팅을 지원합니다. 아마도 일반 Scala는 일반 Clojure보다 빠르지 만 병목 현상 만 최적화하면됩니다. 대부분의 프로그램 실행 시간은 적은 양의 실제 코드에 의해 생성됩니다.

Java와의 상호 운용성과 관련하여 Scala는 Java에 더 가깝지만 두 언어 모두 잘 상호 운용됩니다. 에서 Clojure의 프로그래밍 스튜어트 Halloway을 쓴다 : "[액세스 할 수있는] 자바 코드에서 도달 할 수있는 아무것도. ".

그리고 Scala의 저자 인 Martin Odersky Sun의 Java 컴파일러를 작성한 이후로 저는 Scala 쪽에도 공이 떨어 졌다고 생각하지 않습니다. :-)

루비도 좋아하지만 두 가지 더 나은 언어를 선택하기는 어려울 것입니다. 어떤 것을 시도해야할지 왜 걱정합니까? 둘 다 시도해 보지 않겠습니까? Scala는 "차세대 Java"가 될 가능성이 더 높지만 Lisp가 50 년 넘게 그렇게하지 않고 마침내 도약 할 것이라고 상상하기는 어렵습니다. 그러나 Lisp는 고유 한 추상화 수준에 있고 Clojure는 상당히 단순하므로 Scala + Clojure는 (다소 복잡한) Scala보다 그렇게 어렵지 않을 것입니다. 그것.

그리고 그 문제에 대해 그들은 상호 운용됩니다 ...

* dalvik (안드로이드의 JVM)은 2010 년 2.2 버전에서 JIT 컴파일러를 얻었습니다.


6
허. 음, 모든 통찰력에 감사드립니다. 처음에는 하나만 골라서 달리고 싶은 모드였습니다. 하지만 어떤 이유에서인지 두 가지를 모두 사용하고 상호 운용 할 수 있다는 생각이 들지 않았습니다. 그래서, 아마도 나는 모두를 선택하고 :-) 그들과 함께 빠른 속도로 산책을 다하겠습니다
라이언 Delucchi

7
그리고 나는 LISP에 대해 약간의 "부드러운 부분"을 가지고 있다고 덧붙이고 싶습니다. 그래서 Clojure가 parethesitis를 앓고 있다는 사실이 나를 놀라게 할만큼 충분하지 않습니다.
Ryan Delucchi

8
JVM으로 작성된 언어가 최고 속도로 작동한다는 것은 항상 사실은 아닙니다. 원래 JRuby는 소스 코드가 아닌 JVM으로 컴파일 된 인터프리터이기 때문에 성능이 떨어졌습니다. 언어 또한 비난받을 수 있습니다. 정적으로 입력 된 언어는 동적 언어보다 최적화하기가 더 쉽습니다.
Bill K

7
-1 "Scala와 Clojure는 모두 JVM 언어이므로 비슷한 성능을 가져야합니다."는 전혀 의미가 없습니다. Java와 같은 정적 언어와 상호 운용성을 유지해야하는 동적 언어는 항상 훨씬 느립니다 (오버로딩에는 막대한 비용이 발생하고 유형 힌팅으로 모든 문제를 해결하지 못하는 등)
julx 2011

4
@julkiewicz-동적 언어가 항상 훨씬 느리다 는 것은 사실이 아닙니다 . 컴파일러가 문제의 코드를 최적화하는 적절한 작업을 수행 할 수 있는지 여부에 따라 다릅니다. 예를 들어 Clojure에서는 Java 성능과 정확히 일치하는 Java 기본 형식으로 산술을 수행 할 수 있습니다. 마찬가지로 유형 힌트 Java 객체에서 메서드를 호출하는 것은 Java 객체 메서드 호출만큼 빠릅니다. Clojure 컴파일러는 본질적으로 동등한 Java 코드에 대해 javac와 동일한 바이트 코드를 생성합니다.
mikera

32

현재 JVM에서 Scala는 동적 유형 (반사)에 대한 JVM 지원이 느리기 때문에 정적으로 유형이 지정된다는 장점이 있습니다. 사실, 동일한 기술, 구조적 유형을 통해 구현되어야하는 하나의 Scala 기능은 바로 이러한 이유로 종종 경고를받습니다.

또한 Scala는 변경 가능한 객체를 잘 받아들이고 일부 알고리즘은 변경 가능성으로 구현하는 것이 더 빠릅니다.

Scala와 Java는 모두 기본적으로 클래스 기반 언어이므로보다 쉽게 ​​상호 운용됩니다. 또는 더 원활하게. Java 클래스는 Scala의 클래스이고 Scala 클래스는 Java의 클래스입니다. Scala의 싱글 톤 또는 Java의 정적 멤버와 관련하여 문제가 발생할 수 있습니다. 특히 특정 방식으로 작동 할 것으로 예상되는 프레임 워크가있을 때 특히 그렇습니다.

그래서 저는 두 계정 에 대해 Scala를 사용하겠습니다 . Clojure는 여러면에서 더 나은 언어 이며 Scala에는 (지금까지) 존재하지 않는 매우 흥미로운 기능이 있지만 완전한 기능을 수행하면 이러한 이점을 얻을 수 있습니다. 그렇게하려는 경우 Clojure가 더 나을 가능성이 큽니다. 그렇지 않다면 아마도 Scala를 유지해야 할 것입니다.


9
clojure의 함수형 프로그래밍 기능은 제가이 언어를 고려하는 가장 강력한 이유입니다. 기능적인 방식으로 코딩하지 않는 경우 Java에 내장 된 스크립팅 언어를 사용하는 이유는 무엇입니까? 나는 이미 빠르고 더러운 작업을 수행하기 위해 내 편에 Python을 가지고 있습니다.
Ryan Delucchi

9
그런 다음 Clojure와 함께 가십시오.
Daniel C. Sobral

"Java에 포함 된 스크립팅 언어". 정당화하십시오.
Jus12

@ 다니엘 : 혼란스러워서 죄송합니다. 나는 Ryan Delucchi에 대한 논평을 의미했습니다. 그는 Scala가 "자바에 포함 된 스크립팅 언어"라고 말하는데, 제가 사지 않습니다. (내가 전혀 모르는 Clojure를 의미하지 않는 한).
Jus12

@ Jus12 나는 그가 이러한 언어를 JVM 스크립팅 언어로 사용 하고 있다는 것을 의미했으며 , 그 점을 감안할 때 그가 작동하지 않는 한 Python보다 이점을 보지 못했습니다. 다시 말하지만 나는 그가 아니기 때문에 추측 만 할 수있다.
Daniel C. Sobral 2011 년

20

Clojure와 Scala는 완전히 다른 두 가지 유형의 프로그래밍 언어입니다. Clojure는 기능적인 Lisp와 유사한 언어이며 객체 지향 이 아닙니다 . Scala는 함수형 프로그래밍 기능이있는 객체 지향 언어입니다.

제 생각에는 언어 (기능적, OO, ...)의 기능과 개념이 언어 선택에있어 성능 (해당 언어의 특정 구현)보다 훨씬 더 중요한 기준이됩니다. 잘 수행되는 구현이없는 언어에 갇히기를 원합니다.

객체 지향적이지만 (관심이 있다면) 함수형 프로그래밍을 배울 수 있기 때문에 Scala를 선택하겠습니다. 반면에 OO에 관심이없고 "순수한"함수형 프로그래밍을 배우고 싶다면 Clojure를 사용해보십시오.


9
분명히 당신은 Clojure를 사용하지 않았습니다. Clojure는 Scala가 기능적인 것처럼 객체 지향적입니다. 인터페이스를 구현하고, 클래스를 확장하고, 개인 및 정적 함수를 선언 할 수 있습니다 ( clojure.org/java_interop ).
Richard Clayton

28
이러한 것들은 Java와의 상호 운용성을 위해 Clojure에 존재하지만 클래스와 객체는 분명히 Clojure의 주요 기능이 아닙니다. Clojure에서 프로그래밍하려는 경우 클래스를 만들고 프로젝트를 OO 방식으로 디자인하지 않습니다.
Jesper

>> "성능보다". 문제는-프로젝트 깊숙한 곳에서-당신의 성능이 좋지 않다는 것을 발견했을 때 일어나는 일입니다-단지 하나의 작은 부분 때문이 아니라 (그 이유를 위해 이미 자바로 변환 할 계획이었습니다). 내가 여기서 "클로저 기간을 사용하지 말라 .."라고 말할 의도는 없지만 클로저가 공연장에서 더 큰 위험이라는 것은 분명합니다. 문제가되지 않는 애플리케이션 레벨 코드에 대한 많은 기회가 있습니다. 또한 많은 프레임 워크 / 멀티 스레딩 / 처리 집약적 인 코드베이스가 문제가 될 수 있습니다.
StephenBoesch 2015

@javadba clojure가 저수준 다중 스레드 코드에 좋지 않다는 생각은 꽤 임의적으로 보입니다. Clojure는 다중 스레드 프로그래밍 실수가 매우 어렵도록 설계되었습니다. 클로저 언어의 핵심 인 불변 데이터 및 STM 기능은 핵심 Scala에서 사용할 수없는 기능이며 프로그래머가 실수로 경쟁 조건이나 교착 상태를 코드에 삽입 할 가능성이 훨씬 적습니다. 확실히 이것은 Scala 또는 Java와 같은 정적으로 형식화 된 언어에서 얻을 수있는 몇 ms의 런타임보다 더 가치가 있습니다.
nben

"물론 이것은 몇 ms의 런타임보다 더 가치가 있습니다.".. 그것은 데이터의 규모에 달려 있습니다. 몇 ms는 몇 개의 레코드에 대해 괜찮습니다. 다중 수억에 의해 ..
StephenBoesch

16
  1. 관용적 스칼라는 관용적 Clojure 보다 빠르며 그대로 유지됩니다.
  2. Scala와 Clojure는 모두 Java 위에 쉽게 위치합니다. 둘 다 그 밑에 잘 앉지 않습니다.

코드가 전체적으로 시간이 중요하거나 공간이 중요하다면 Java를 고수하십시오. 그러나 그것은 당신이 생각하더라도 그렇지 않습니다.

컴퓨터 언어 벤치 마크 게임 Clojure에서의 진정한 자원 비용에 대한 작은 실마리를. Clojure 데이터 구조는 사용되지 않습니다. 기능 및 시퀀스 추상화는 나타나지 않습니다.

Clojure는 단순 해 보일 수 있습니다. 그렇지는 않지만 표현력이 있습니다. Java보다 5 배 느리게 실행될 수 있지만 소스 는 5 배 더 작습니다 (YMMV). 대부분의 응용 프로그램에서 이것은 큰 승리입니다. 그러나 일부에게는, 그리고 다른 일부에게는 엄청난 손실입니다.

Clojure 언어의 경험을 바탕으로 저는 여러분의 문제가 Clojure에서 표현할 수있는 간결하고 적절하게 (성능 측면에서) 표현할 수있는 부분과 Java에서 수행해야하는 부분으로 깔끔하게 분리되는지 미리 알 수 있다고 생각합니다.

  • Scala lite : Scala에서 Java 관용구 작성하기로 갈 수 있습니다. 당신은 약간의 간결함,보기에 더 쉬운 구문, 복잡한 타입 시스템이기는하지만 일관성을 얻게 될 것입니다.
  • Clojure 라이트와 같은 것은 없습니다. Clojure에서 Java 관용구를 작성하는 것은 전혀 의미가 없습니다. 당신이 얻을 수있는 것은 그것을 표현하는 데 사용되는 관용구의 곡물을 가로 지르기 때문에 이해하기 어려운 느린 Java입니다.

스칼라는 자바 가 제대로 된 것으로 알려져있다 . Clojure는 Java와는 다릅니다. Lisp가 옳은 일이라고 말할 수 있습니다 . 대담하고, 어떤 사람들은 터무니없는 주장이라고 말할 것입니다. 이는 사실로 판명 될 수 있습니다.


4
이 답변은 두 가지의 진정한 차이점과 강점 / 약점을 잘 보여줍니다. 그것은 scala- 또는 clojure-apologist 방식이 아니라 진실성 방식으로 쓰여졌습니다.
StephenBoesch 2015

15

" 컴퓨터 언어 벤치 마크 게임 " 에서 생성 된 통계 는 아마도 여러분이 찾을 수있는 최고에 대한 것입니다.

심도 있고 많은 언어를 비교할 수 있습니다. 문제는 그들이 Clojure를 다루지 않는다는 것입니다.

즉, 무엇이든 제출하는 것은 매우 쉽습니다. 모두 오픈 소스입니다.

통계에 따르면 Scala는 꽤 빠르다.


9
됐습니다. Java보다 2 ~ 25 배 느리고 메모리는 2 ~ 30 배 더 많으며 코드 크기는 일반적으로 Java보다 큽니다. Scala가 Java에 매우 가까운 Python과 비슷해 보입니다. Clojure 테스트가 제대로 작성되지 않은 한 Scala는 꽤 확실한 승자이며 Clojure는 상당히 느립니다.
Bill K

2
벤치 마크가 Clojure를 다루고있는 것 같습니다 (OP의 발언은 1 년 전입니다). 그리고 그 결과는 고무적이지 않습니다. 스칼라는 갈 길이다.
Martin

4
위의 의견은 다소 구식입니다. 2012 년 중반부터 Clojure는 그 격차를 크게 줄였으며 이제 평균적으로 Java의 2 배에 불과합니다.
mikera

9

상호 운용성에 대해서는 Clojure에 대해 말할 수는 없지만 Scala와 비슷한 상황에있을 것으로 예상합니다.

Scala에서 Java를 호출하는 것은 매우 쉽습니다.

외부 API를 Scala와 Java 간의 공통점에 맞추면 Java에서 Scala를 쉽게 호출 할 수 있습니다. 예를 들어, Scala 객체는 Java의 정적 메소드와 같은 방식으로 사용되지만 동일한 것은 아닙니다. Scala 클래스는 Java에서 재미있게 보이는 이름을 가진 여러 클래스로 컴파일 될 수 있습니다.

당신은 많이 혼합하고 일치하고 싶지 않을 것입니다. 많은 Java 라이브러리를 사용하는 Scala 또는 Clojure에서 구성 요소를 빌드하는 것은 매우 가능합니다. 물론 Java에서이 구성 요소를 호출 할 수 있지만 원하지 않는 것은 Java의 Scala 프로그램에서 사용하기위한 Scala API를 사용하는 것입니다.

SVN은 "CVS가 올바르게 수행"되었다고 주장합니다. 제 생각에 Scala는 Java가 올바르게 수행되었습니다.


19
그래서 clojure는 자식입니까?

1
@ 론 하하, 나는 똑같은 생각을했다.
KoW 2011

2
실제로 Clojure 컬렉션은 git-ish
Joe Lehmann

2

PragPub 2010 년 11 월 문제는 Clojure의 자바 상호 운용성에 대해 설명합니다. Java 메서드를 호출하는 것은 간단하지만 Java 클래스 / 인터페이스를 확장하는 것은 매우 다릅니다.

반면에 Scala는 Java에 훨씬 더 가깝습니다. Scala-Java 상호 운용성은 http://www.codecommit.com/blog/java/interop-between-java-and-scala 에서 자세히 설명합니다 .

Java 코드 호출 및 Java 클래스 / 인터페이스 확장은 Scala 코드 호출과 동일한 방식으로 작동합니다. Scala의 유형 시스템이 Java보다 훨씬 강력 하기 때문에 일부 불만 사항은 Java의 제네릭을 처리하는 경우가 될 수 있습니다 . Java Bean 규칙에 따라 getter 및 setter를 작성 하려면 주석이 필요합니다 .

Java에서 Scala를 호출하는 것은 대부분 간단하지만 예를 들어 Scala의 동반 객체는 바이트 코드로 컴파일되는 방법을 알아야합니다. 또한 Java의 비 추상적 메소드와 함께 트레이 트를 사용하는 것은 복잡해야하며 특수 문자로 메소드를 호출하려면 바이트 코드에서 인코딩되는 방법을 알아야합니다.


1

현재 (2010 년 5 월 현재) Clojure의 최신 1.2 브랜치에서 찾아 볼 가치가 있습니다. 여기에는 다양한 유형 힌트 및 프로토콜을 통해 기본 유형 및 정적 유형에 대한 많은 추가 지원이 포함됩니다.

내 이해는 순수 Java에서 정확히 동일한 코드를 작성하는 것과 동일한 속도를 얻기 위해 필요할 때 이러한 기능을 사용할 수 있다는 것입니다.


2
동시에 @specialized다가오는 Scala 2.8 의 기술은 Scala 라이브러리에 유사한 개선을 가져오고 있습니다. 그리고 언어 기능으로서 표준 라이브러리뿐만 아니라 모든 코드에서 사용할 수 있습니다.
Randall Schulz
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.