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

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

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

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

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



답변

어느 언어라도 충분히 빠르다고 생각합니다. 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 컴파일러를 얻었습니다.


답변

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

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

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

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


답변

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

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

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


답변

  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가 옳은 일이라고 말할 수 있습니다 . 대담하고, 어떤 사람들은 터무니없는 주장이라고 말할 것입니다. 이는 사실로 판명 될 수 있습니다.


답변

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

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

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

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


답변

상호 운용성에 대해서는 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가 올바르게 수행되었습니다.


답변

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의 비 추상적 메소드와 함께 트레이 트를 사용하는 것은 복잡해야하며 특수 문자로 메소드를 호출하려면 바이트 코드에서 인코딩되는 방법을 알아야합니다.