나는 언어로서 스칼라에 완전히 빠져 있지만 왜 어떤 회사가 Java에서 스칼라로 전환해야하는지 고민하고 있습니다. Scala가 JVM 위에 단지 신택 틱 설탕입니까, 아니면 실제 응용 프로그램을 향상시키는 Java보다 Scala의 근본적인 개선이 있습니까?
나는 언어로서 스칼라에 완전히 빠져 있지만 왜 어떤 회사가 Java에서 스칼라로 전환해야하는지 고민하고 있습니다. Scala가 JVM 위에 단지 신택 틱 설탕입니까, 아니면 실제 응용 프로그램을 향상시키는 Java보다 Scala의 근본적인 개선이 있습니까?
답변:
면책 조항 : 나는 스칼라 전문가가 아닙니다.
스칼라는 Java (현재)가하지 않는 두 가지 일을 매우 잘 수행합니다.
기능적 문제 해결
가장 기본적인 수준에서 Scala는 컬렉션 지원을 통해 완전히 폐쇄되었습니다. 이것은 더 이상 (DZone 게시물을 뻔뻔스럽게 찢어 버리는) 보일러 플레이트 코드를 작성할 필요가 없음을 의미합니다.
public List<Item> bought(User user)
{
List<Item> result = new ArrayList();
for (Item item : currentItems)
{
if (user.bought(item))
{
result.add(item);
}
}
return result;
}
그러나 대신 다음과 같이 작성하십시오.
def bought(user: User) = items.filter(user bought _)
보다 안전한 방식으로 동시성 해결
솔직히 스칼라가 Java보다 머리와 어깨를 돋 우게하는 다른 많은 것을 솔직히 생각할 수는 없습니다. 많은 작은 이득과 개선 사항이 있습니다. YMMV
조금 HTH
그것은 "단순한 구문 설탕"의 정의에 달려 있습니다. 예를 들어, 자바는 머신 코드를 넘어서서 단순히 구문상의 설탕 이상의 방법은 무엇입니까?
모든 언어는 기계 코드보다 작을 수 있지만 더 많은 언어를 할 수는 없습니다.
높은 수준의 언어가 테이블에 가져 오는 것은 코드를보다 쉽게 읽고 이해하고 작성하고 더 많은 오류를 포착하는 것입니다. 그리고 제 생각에 가장 정확한 차이는 바로 "구문 설탕"입니다.
그러나 다른 두 가지만을 고려하면 Java보다 Scala의 장점이 여전히 있습니다.
요점을 설명하지는 않지만 클로저를 사용하면 클로저를 사용하지 않는 것보다 코드를 더 작게 구성 할 수 있습니다. 그리고 Java 7은 클로저 (closure) 라고 불리는 것을 추가 할 것이지만, 익명 함수일뿐입니다.
더 많은 오류를 포착하는 데있어 Scala의 우수한 분산 처리는 충분히 증명됩니다. 또한 불변성에 중점을 두어 모든 종류의 오류를 방지 할 수 있습니다. Java가 불변성을 수행 할 수있는 것은 아니라 라이브러리와 함께 제공되지 않습니다.
나는 약 3 개월 동안 스칼라를 사용했지만 여전히 Java로 할 수없는 것을 찾을 수 없습니다. 나를 위해 문자 그대로 스칼라에 관한 모든 문헌은 같은 것을 상용구 로 언급하는 것 같습니다 . 당신이 찾고있는 것이 상용구 를 줄이는 것이라면 Scala는 당신을위한 것이지만 IMHO, 예를 들어 위에서 주어진 필터 예제는 아파치 컬렉션을 사용하여 해결할 수도 있습니다.
<T> CollectionUtils.filter(Predicate<T>...)
또는 폐쇄를 사용하십시오
<T> CollectionUtils.forAllDo(..., Closure<T>)
그러나 물론 더 장황하다. 나는 타입 유추를 좋아한다. 스칼라를 배우면 이것이 아마도 어쨌든 진행되고 있다는 것을 깨닫게 될 것입니다. 제 생각에는 각 언어에는 + ve와 -ve가 있습니다.
이해를위한 목록 이해력.
예를 들어 자바에서는 다음과 같이 작성합니다.
int myVar;
if (condition) {
myVar = //some value
}
else {
myVar = //some other value
}
스칼라에서 동일한 코드는 다음과 같이 훨씬 더 우아하게 작성됩니다 (파이썬처럼).
int myVar = (//some value) if (condition) else // other value;
그리고 완료.
스칼라가 제공하지 않는 것이 너무 많아서 Java는 그렇지 않습니다. 전혀 비교가 없습니다. 유일한 문제는 사람들이 Java (CS 클래스에서 가르치는 b / c)에 익숙하고 아직 스칼라 패러다임에 익숙하지 않다는 것입니다.
스칼라는 꼬리 재귀를 가지고 있으며 튜플을 반환 할 수 있습니다 (Java 8에서 올 수 있음).
비교가되지 않습니다. 스칼라는 Java Generics의 핵심 팀에서 일한 Martin Ordersky에 의해 개발되었습니다.
스칼라는 훨씬 뛰어난 언어입니다. 그것이 전부입니다. 달리 말하는 사람들은 단순히 더 잘 알기 위해 스칼라를 탐험하지 않았습니다.
위의 꼬리 재귀 최적화 (JVM이 Scala의 컴파일러가 할 수있는 방식을 수행 할 수 없음)라고 말하고 싶습니다.
스칼라는 또한 JVM 앱보다 빠르게 컴파일하고 실행합니다 (예, 맞습니다). 프레임 워크는 말할 것도 없습니다. 예를 들어 Tomcat을 사용하고 REST를 처리하기 위해 일부 서브릿을 배포합니다.
Tomcat이 할 수없는 한 가지는 비 차단 I / O가 필요한 비동기 작업입니다. 이를 위해 JAVA 개발자는 일반적으로 메시지 큐를 사용하여 해결 방법을 고안했습니다 (메시지를 큐로 보내면 일부 다른 프로세스 또는 스레드가이를 선택하여 백그라운드에서 원하는대로 수행함).
불행히도이 방법은 cr * p이며 Tomcat에 Java 서블릿을 배포 할 때의 한계에 대한 해킹입니다.
Akka + 스프레이를 확인하십시오. 스칼라의 액터를 사용합니다. 액터는 메시지를 통한 유일한 통신 방법을 제외하고는 스레드와 같습니다.
그리고 비동기 REST 호출이 쉬워졌습니다. 장기간 실행되는 백그라운드 작업? 문제 없어요. 그냥 해고하고 잊어 버리고 REST 폴링을 수행하여 프론트 엔드에서 가끔씩 상태를 확인하십시오.
여전히 Java를 사용하고 있으며 scala보다 낫다고 생각되면 컴퓨터를 사용하여 입력을 중단하고 퀼 펜 시대로 돌아가서 촛불로 쓸 수 있습니다. 자바는 기본적으로 스칼라와 비교할 때 친숙하다.
int myVar = condition ? someValue : otherValue
//some value
//other value
주석을 편집하여 주석 /*some value*/
이나 스타일을 지정 해야합니다 . 현재 구문 강조 표시를 망치고 있습니다 : p