스칼라와 그루비의 주요 차이점은 무엇입니까? [닫은]


128

표면에서 Groovy와 Scala는 스칼라가 정적으로 타이핑되고 Groovy 다이나믹을 제외하면 상당히 비슷해 보입니다.

  • 다른 주요 차이점과 각각의 장점은 무엇입니까?
  • 그들은 실제로 얼마나 비슷합니까?
  • 둘 사이에 경쟁이 있습니까?
    • 그렇다면 장기적으로 누가 이길 것이라고 생각하십니까?

Groovy 2.0에는 정적 입력 기능도 포함되어 있습니다 : infoq.com/articles/new-groovy-20
HDave

답변:


230

이들은 람다와 클로저가 있고 Java와 상호 운용되는 JVM의 객체 지향 언어입니다. 그 외에는 매우 다릅니다.

Groovy는 동적으로 입력되는 것이 아니라 동적 메타 프로그래밍을 지원한다는 의미에서 "동적"언어입니다.

스칼라는 정적으로 타입이 정해지고 자바에서 할 수있는 어색한 것들 외에는 동적 메타 프로그래밍이 거의 없다는 점에서 "정적"언어입니다. Scala의 정적 유형 시스템은 Java보다 훨씬 균일하고 정교합니다.

Groovy는 구문 적으로 Java의 영향을 받지만 Ruby와 같은 언어의 의미 상 더 많은 영향을받습니다.

스칼라는 Ruby와 Java에 의해 구문 적으로 영향을받습니다. Java, SML, Haskell 및 gBeta라는 매우 모호한 OO 언어에 의해 의미 적으로 영향을받습니다.

Groovy는 Java 오버로딩을 처리하는 방식으로 인해 "우연한"다중 디스패치를 ​​가지고 있습니다.

스칼라는 단일 디스패치 일 뿐이지 만 여러 디스패치가 처리해야하는 동일한 종류의 문제를 처리하기 위해 SML에서 패턴 매칭을 수행했습니다. 그러나 다중 디스패치가 런타임 유형에서만 디스패치 할 수있는 경우 Scala의 패턴 일치는 런타임 유형, 값 또는 둘 다에서 디스패치 할 수 있습니다. 패턴 매칭은 또한 구문 적으로 쾌적한 변수 바인딩을 포함한다. 이 단일 기능만으로 스칼라에서 프로그래밍이 얼마나 즐거워 지는지를 너무 강조하기는 어렵습니다.

스칼라와 그루비는 둘 다 믹스 인으로 다중 상속 형태를 지원합니다 (스칼라는 특성이라고 부릅니다).

스칼라는 언어 수준에서 부분 함수 적용과 카레를 모두 지원하며, Groovy는 부분 함수 적용을위한 어색한 "카레"방법을 가지고 있습니다.

스칼라는 꼬리 재귀 최적화를 지시합니다. 나는 Groovy가 믿지 않는다. 함수형 프로그래밍에서는 중요하지만 명령형 프로그래밍에서는 덜 중요합니다.

스칼라와 그루비는 기본적으로 간절히 평가됩니다. 그러나 Scala는 이름 별 호출 매개 변수를 지원합니다. Groovy는 그렇지 않습니다. 이름 별 호출은 클로저로 에뮬레이션해야합니다.

스칼라는 다른 언어에서 볼 수있는 목록 이해의 일반화 인 "이해를 위해"(기술적으로 모나드 이해와 약간-Haskell과 C #의 LINQ 사이)를 가지고 있습니다.

스칼라는 "정적"필드, 내부 클래스, 메소드 등의 개념이 없습니다. 대신 싱글 톤 오브젝트를 사용합니다. Groovy는 정적 개념을 사용합니다.

스칼라는 Groovy와 같은 방식으로 산술 연산자를 내장하지 않았습니다. 스칼라에서는 메소드의 이름을 매우 유연하게 지정할 수 있습니다.

Groovy는 null을 다루는 elvis 연산자를 가지고 있습니다. 스칼라 프로그래머는 null을 사용하는 것보다 옵션 유형을 선호하지만 원하는 경우 스칼라에 elvis 연산자를 작성하는 것이 쉽습니다.

마지막으로 거짓말이 있고, 거짓말이 있고, 벤치 마크가 있습니다. 컴퓨터 언어 벤치 마크 게임은 Scala가 Groovy보다 훨씬 빠르며 (두 배에서 93 배 빠름), 거의 동일한 소스 크기를 유지합니다. 벤치 마크 .

내가 다루지 않은 많은 차이점이 있다고 확신합니다. 그러나 희망적으로 이것은 당신에게 요점을줍니다.

그들 사이에 경쟁이 있습니까? 예, 물론 생각만큼 많이는 아닙니다. Groovy의 실제 경쟁은 JRuby와 Jython입니다.

누가 이길거야? 내 수정 구슬은 다른 사람처럼 금이 간 것입니다.


21
대학에서 자바 대신이 언어를 가르치기 시작한다면 두 가지 모두에 대한 승리가 될 것이다.
Chii

13
불변성이 Scala의 주요 특성이 아닙니까? 동시성 및 행위자는 어떻습니까? 좀 더
말씀

4
경쟁이있는 경우 Clojure와 경쟁하지만 Clojure는 경쟁에 관심이 없습니다.
Rayne

2
스칼라는 자바와 동일한 정적 유형의 메소드 디스패치를 ​​사용하고 (핫스팟은 쉽게 인라인 할 수 있음) groovy는 동적 메소드 디스패치를 ​​수행하여 Groovy가 스칼라의 성능에 가까워지는 것은 정말 어려울 것입니다. 특히 @autoized를 사용하여 java의 오토 박싱을 최적화하면 Scala는 때때로 java보다 빠를 수 있습니다. 그러나 Groovy의 유스 케이스는 Ruby / Python을 사용하는 것과 유사합니다. 성능이 일반적으로 큰 문제가되지 않는 동적 유형의 스크립팅 언어를 사용하기 쉽습니다. 예를 들어 많은 Groovy 프레임 워크에는 Grails와 같은 성능을위한 수많은 Java 코드가 포함되어 있습니다.
James Strachan

4
이 답변에는 투표가 너무 많으므로 수정하고 싶은 부분이 있습니다. Groovy의 상속 기반 다중 메소드가 우연히 시작된 것이 맞습니다. 그러나 James를 포함한 Groovy Developers Conference에서 Groovy 1.0이 있기 오래 전부터 우리는 그것을 결정했습니다. 이것을 바꾸는 것은 어렵지 않았을 것입니다. 또한 제임스가 쓴 내용에
덧붙여서

12

스칼라는 OO / 기능 하이브리드 언어로 계획되었으며 매우 잘 계획되고 설계되었습니다. groovy는 많은 사람들이 Java에서 사용하기를 원했던 개선 사항과 비슷합니다. 나는 둘 다 자세히 살펴 보았으므로 말할 수있다 :)

그들 중 어느 것도 다른 것보다 낫거나 나쁘지 않습니다. 그루비는 메타 프로그래밍에 매우 능숙하고 스칼라는 메타 프로그래밍에 필요하지 않은 모든 것에 매우 능숙하므로 두 가지를 모두 사용하는 경향이 있습니다.



7

정적 및 동적 타이핑으로 머리에 못을 박았습니다. 둘 다 클로저, 람다 식 등이 포함 된 차세대 동적 언어의 일부입니다. 둘 사이에는 약간의 구문상의 차이가 있지만 기능적으로 Groovy와 Scala 사이에는 큰 차이가 없습니다.

스칼라는리스트를 조금 다르게 구현합니다. Groovy에서는 거의 모든 것이 java.util.List의 인스턴스이지만 Scala는 List와 기본 배열을 모두 사용합니다. Groovy는 더 나은 문자열 보간법을 가지고 있다고 생각합니다.

스칼라는 더 빠르지 만 그루비 사람들은 실제로 2.0 릴리스의 성능을 높이고 있습니다. 1.6은 1.5 시리즈보다 속도가 크게 향상되었습니다.

나는 두 언어가 서로 다른 두 종류의 문제를 목표로하기 때문에 어느 언어가 실제로 '승리'할 것이라고 생각하지 않습니다. 스칼라는 Java와 거의 같은 수준의 상용구가 없어도 Java와 매우 유사한 고성능 언어입니다. Groovy는 프로그래머가 코드를 구현하는 데 걸리는 시간보다 속도가 덜 중요한 빠른 프로토 타입 및 개발을위한 것입니다.


3
"Groovy는 신속한 프로토 타이핑 및 개발을위한 것입니다."-Groovy는 내가 동의하지 않는 프로덕션 용도에 적합하지 않다는 것을 나타냅니다. 예를 들어 프로덕션 환경에는 Grails 사이트가 많이 있습니다.
Dónal

10
스칼라는 역동적 인 언어가 아닙니다.
John Oxley

2
"Groovy는 더 나은 문자열 보간법을 가지고 있다고 생각합니다." -Scala-2.10.0에서는 더 이상 사실이 아닙니다 (Scala는 멋진 문자열 보간을 얻었습니다).
VasiliNovikov

5

스칼라는 Groovy보다 학습 곡선이 훨씬 가파 릅니다. 스칼라는 패턴 매칭 및 테일 기반 재귀 기능을 통해 기능 프로그래밍을 훨씬 더 많이 지원하므로 순수한 FP를위한 더 많은 도구를 의미합니다.


0

Scala는 dynamica 컴파일을 가지고 있으며 트위터 eval lib ( https://github.com/twitter/util )를 사용하여 수행했습니다 . 스칼라 코드를 플랫 파일 (확장자 없음)로 유지하고 런타임에 생성 된 스칼라 클래스를 사용했습니다. 스칼라는 메타 프로그래밍이며 동적 합병증의 특징이 있다고 말합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.