Java의 주요 초점은 무엇입니까? 새로운 기능을 얻는 데 왜 그렇게 오래 걸립니까?


11

람다 식, 확장 방법 및 새로운 스트림 API와 같은 JDK8의 새로운 기능을 살펴 보았습니다.

분명히 이러한 기능 중 어느 것도 프로그래밍 분야에서 새로운 것이 아니며 지금까지 Java로 이러한 모든 것을 얻는 이유가 궁금해졌습니다.

우리는 Lisp (1958), SML (1973), Haskell (1990), Python (1991), JavaScript (1994), Ruby (1995), Scala (2003), C # (2007) 및 Lisp 이후 55 년에 람다 식을 가졌습니다. 실제로 Java의 다른 모든 사람 (2013)

그리고 SIC (1996)의 스트림에 대해 읽었습니다 .

나는 왜 지금 궁금해? 다른 언어와 경쟁하는 것이 동기가 아니라는 증거가 있습니다.

이번 Java 릴리스의 새로운 기능은 모두 병렬 처리 구현의 부산물 인 것 같습니다. 병렬 알고리즘을 더 간단하게 작성하기 때문에 람다가 있고 람다 식 등이 필요한 변경 등을 지원하기 위해 확장 메서드가 필요합니다.

그래서 내 질문은 :이 곧 출시 될 Java 릴리스의 주요 주제가 실제로 병렬이라는 것을 안전하게 확인할 수 있습니까? 아니면 지금까지 Java로 책에서 가장 오래된 트릭이 나타나는 다른 이유를 정당화 할 수 있습니까?


4
이 모든 것이 자바의 비하인드 스토리에 대한 전염병이다.
Michael K

5
The evidence suggests-당신의 연구를 공유하십시오.

2
없음 자바 또는 JVM이나 JRE에서 하나의 기능은 지금 새로운 없었다. 그리고 기능 의 조합 조차도 새로운 것은 아니지만 Eiffel은 1985 년에 모든 기능을 갖추고있었습니다 (GC, OO, 유형 안전, Java가 2003 년까지 얻지 못한 Generics조차도). 사실, 새로운 것을 소개 하지 않는 것이 Java 디자이너의 목표였습니다 .
Jörg W Mittag

2
@MichaelK-나는 이것이 화염 전쟁으로 변할 수 있다는 데 동의합니다. 또한 썬의 도전적인 역사에 관한 올바른 해답이 될 수 있습니다. 오라클의 Sun 및 Java 인수 현재 Java 관리자가 언어를 구동하는 방법. 답변이이 질문의 건설적인 측면에 중점을두기를 바랍니다.

@MichaelT : 나는 그것이 화염 전쟁으로 변하지 않기를 바라며 흥미로운 아이디어가 나올 수 있기를 바랍니다. 예를 들어, 끊임없이 진화하지 않는 언어가 시대를 뒤덮고 있다고 가정합니다. IMO는 언어 진화가 선형 적이라고 가정하기 때문에 사실이 아닙니다 (인기있는 모든 새로운 기능이 우수하고 모든 현대 언어에서 채택되어야 함). 그러나 언어 관리자는 새로운 기능이 나머지 언어와 맞지 않다고 결정할 수 있습니다. 또한 시대에 뒤 떨어지지 않는 표준화되고 안정적인 언어가 있다고 생각하십시오 (예 : Common Lisp).
Giorgio

답변:


12

Java가 처음 설계되었을 때 익명의 기능을 사용하지 않는 것이 적절하다고 간주되었습니다. 나는 두 가지 이유를 생각할 수 있습니다 (그러나 공식적인 이유와 다를 수 있습니다).

  1. Java는 함수가없는 객체 지향 언어로 설계되었으므로 함수가없는 언어로 익명 함수를 갖는 것은 그리 자연스럽지 않았습니다. 또는 적어도 이것은 언어의 디자인에 많은 영향을 미쳤을 것입니다.
  2. 익명 함수는 Java가 유치하려는 프로그래머 커뮤니티에서 인기가 없었습니다 (C, C ++, Pascal?). 지금도 많은 Java 프로그래머는 이러한 기능을 매우 이색적인 것으로 간주하지만 Java 8에서는 매우 빠르게 변경 될 수 있습니다.

그 후 로버트 하비 (Robert Harvey)가 설명했듯이 썬의 정책은 항상 자바를 역 호환적이고 안정적으로 유지하는 것이었다.

반면에, 다른 경쟁 언어가 등장했습니다 (가장 중요한 것은 C #으로, Java 복제본으로 개발 된 후 자체 개발 방향을 취했습니다).

경쟁 언어는 다음 두 가지 이유로 Java에 압력을가했습니다.

표현력

새로운 기능은 특정 프로그래밍 관용구를보다 쉽게 ​​작성하여 프로그래머에게 언어를 더 매력적으로 만들 수 있습니다. 일반적으로 언어에서 제공하는 기능 세트는 표현력, 언어 복잡성, 디자인 일관성 간의 절충입니다. 더 많은 기능을 추가하면 언어가보다 표현력이 높지만 복잡하고 마스터하기가 어렵습니다.

어쨌든 지난 몇 년 동안 Java 경쟁 업체는 Java에없는 많은 새로운 기능을 추가했으며 이것이 이점으로 간주 될 수 있습니다.

과대 광고

예, 불행히도 이것은 적어도 프로그래머로서의 일상 경험에서 볼 수있는 것 중에서 기술 선택의 요소입니다. 대부분의 팀원이 도구를 사용하는 방법을 모르더라도 도구에는 특정 기능이 있어야합니다. 그것을 사용할 수있는 사람들은 대부분 그것을 필요로하지 않습니다.

과대 광고는 특정 프로젝트의 플랫폼을 결정하는 관리자 일 수있는 관리자와 같은 비 기술적 인 사람들에게 더욱 중요 할 수 있습니다. 관리자는 때때로 람다, 병렬 처리, 멀티 코어, 기능 프로그래밍, 클라우드 컴퓨팅 등과 같은 키워드 만 기억합니다. 선택한 기술에 목록의 각 항목에 녹색 표시가 있으면 최신 상태입니다.

그래서 한동안 IMO는 Java가

  • 언어 안정성 및 디자인 단순성에 대한 원래 정책, 거대한 코드 기반 및 개발자 커뮤니티
  • Java 프로그래머, 처음에는 C #, 그리고 Scala, Clojure, F #을 유치 할 수있는 경쟁 언어의 압력 (저는 내가 알고있는 언어를 말하며 다른 언어가있을 수 있습니다).

결국 오라클은 Java를보다 경쟁력있게 만들기 위해 Java를 업그레이드하기로 결정했습니다. 내 의견으로는, 새로운 기능은 특히 C #으로 전환하려는 유혹을받는 스칼라와 클로저와 같은 다른 언어를 자바와 너무 다른 것으로 보는 자바 프로그래머를 대상으로한다. 반면에, 기능적 프로그래밍 경험이 있지만 여전히 JVM을 사용하려는 개발자는 이미 스칼라, 클로저 또는 다른 언어로 전환했을 것입니다.

따라서 새로운 Java 8 기능은 Java를 언어로 더욱 강력하게 만들고 선언 된 초점은 동시 및 병렬 프로그래밍이지만 업그레이드는 마케팅 측면도 해결하는 것으로 보입니다 (Oracle의 Java 수석 설계자 인 Mark Reinhold는 다음과 같이 말했습니다. 람다 표현을 추가하는 것은 멋진 아이들과 어울리는 것이라고, 사실에는 멀티 코어 프로세서가 있기 때문입니다. 그러나이를 처리하는 가장 좋은 방법은 람다를 사용하는 것입니다 "( 이 기사 참조 ).

따라서 많은 Java 8 기능이 이미 잘 알려져 있지만 기능이 언어에 추가되는 이유와시기는 대상 독자, 기존 커뮤니티, 기존 코드 기반, 경쟁사, 마케팅 등 많은 요인에 달려 있습니다.

편집하다

"... SIC (1996)의 스트림에 대해 읽었습니다."에 대한 간단한 설명 : 스트림을 구현하려면 Java 8 람다가 필요하다는 것을 의미합니까? 실제로 익명의 내부 클래스를 사용하여 구현할 수 있습니다.


+1 그리고 나는 이것이 당신에게 질문에 대한 가장 좋은 답변이기 때문에 더 많은 포인트를 줄 수 있기를 바랍니다.
edalorzo

귀하의 답변을 바탕으로 Mark Reinhold가 흥미로운 기사를 발견했다고 말한 것에 대해 더 조사했습니다. 나중에 참조 할 수 있도록 귀하의 답변과 함께 여기에 게시 할 것입니다 : Mark Reinhold의 Java에 대한 폐쇄 .
edalorzo

그리고 그 기사는 실제로 이것에 대한 또 다른 Closures for Java를 언급하고 있습니다.
edalorzo

1
보낸 링크 에서이 ibm.com/developerworks/java/library/j-jtp03048/index.html#4.0을 발견 했습니다. Java는 익명의 내부 클래스를 사용할 수 있지만 너무 장황합니다. 그러나 Java 8 클로저는 익명의 내부 클래스에 대한 구문 설탕이 아닙니다. 이제 Java는 익명의 내부 클래스와 람다 식이라는 두 가지 (의미 적으로) 다른 종류의 클로저를 갖게됩니다.
Giorgio

11

자바는 시간이 흐르면서 초점이 바뀌었다. 처음에는 "강력한 복잡한"C ++에 대한 반응으로 간단한 강력한 언어로 설계되었습니다. C ++에 있던 일부 기능은 운영자 과부하, 템플릿, 열거 형, 너무 복잡하거나 C 시대의 유물로 간주되며 OOP가 인기의 절정에 이르렀을 때 모든 것이 단일 객체로 만들어졌습니다. 패러다임 세계관. 현재의 Lambdas는 Java 1.1에서 익명 / 내부 클래스가 도입 된 이후 단순히 "필요하지 않은"것으로 간주되었습니다. 구문이 훨씬 더 장황하다는 사실은 거의 기능으로 간주되었습니다 .

Java는 대중을 발견 한 후, Java 디자인 실수의 교훈을 통해 배우고 일련의 새로운 언어 기능을 시작한 C #이 Microsoft에 도입 될 때까지 변경할 동기가 없었습니다. 이전 버전과의 호환성에 의해 제약을받지 않았습니다. Java 개념이 C # 경쟁의 위험을 깨닫고 generics, enum 등으로 Java 5를 릴리스한다고 생각합니다.

Java에 람다를 포함시키는 것은 그 이후로 논의되었으며 기능 프로그래밍의 현재 추세에 의해서만 악화되었습니다. 그러나 이와 같은 것들이 제대로 이루어지기에는 느리며 처음에는 옳 아야합니다. 내 생각에 Java는 유형 호환성을 가진 제네릭을 botched했습니다. 하위 호환성은 구문 설탕 이상으로 구현하는 이유로 간주 되었기 때문입니다. 클로저는 더 철저하게 생각되어 왔으며, 그것은 단지 구문 설탕 이상일 것입니다.

결론적으로 Java 8의 주요 주제는 무엇입니까? 언어 버전에 주제가 있다고 생각하지 않습니다. C ++ 11로서, Java 8의 특성은 점점 더 많은 프로그래머들이 당연한 것으로 받아들이고있는 것을 언어로 소개함으로써 경쟁을 따라 잡는 것입니다. Lisp는 1958 년 이후 람다를 가질 수 있으며, 그 인기는 현재 수십 년 동안 정체되었으며 최근에는 기능성 프로그래밍 만이 "주류"프로그래밍 (더 나은 단어가 없음)에 대해 심각하게 고려되었습니다.


"Lisp는 1958 년 이래로 람다를 가질 수 있으며, 그 인기는 현재 수십 년 동안 정체되어 왔으며 최근에는"주류 "프로그래밍에 대해 기능적 프로그래밍 만이 심각하게 고려되어왔다": 언어의 인기는 그 효과에 대한 좋은 지표가 아닌 것으로 보인다. 함수형 프로그래밍은 수년 동안 옹호되었지만 업계의 대부분의 사람들은 박사 학위 논문을 작성하기 위해 연구자들이 좋아하는 종류의 것으로 간주했습니다. 이제 갑자기 모든 산업이 깨어나고 기회를주었습니다. 아마도 OOP가 주류이기 때문에 다음 큰 것을 찾고있을 것입니다.
Giorgio

1
클로저 토론 이해 에 따라 클로저가 원래 Java에 포함되지 않은 이유 . 제임스 고슬링 (James Gossling)은 다음과 같이 말했다. "클로저는 다른 어떤 것보다 시간 압박으로 인해 Java에서 처음에 더 많이 배제되었습니다. Java 초기에는 클로저 부족이 상당히 고통 스러웠으며 따라서 내부 클래스가 생겼습니다. 그러나 수많은 디자인 문제에서 일반적인 것처럼 단순화는 실제로 어떤 문제도 해결하지 못하고 문제를 옮겼습니다. "
edalorzo

"Java에 람다를 포함시키는 것은 그 이후로 논의되었으며 기능 프로그래밍에 대한 현재의 추세에 의해서만 악화되었습니다.": 일부 커뮤니티 (C ++, Java, ...)에서 "람다 사용"은 종종 " 기능적 프로그래밍 수행 "
조르지오

8

분명히 이러한 기능 중 어느 것도 프로그래밍 분야에서 새로운 것이 아니며 지금까지 Java로 이러한 모든 것을 얻는 이유가 궁금해졌습니다.

Java는 "위원회 별 설계"와 유사한 프로세스에서 여러 명의 가시성이 높은 이해 관계자를 포함하는 승인 프로세스를 거쳐야하기 때문에 그 프로세스는 시간이 걸립니다.

다른 언어 들과는 대조적으로, 당신은 자비로운 독재자 또는 긴밀히 협력하고 기업의 관심사와 관련이없는 소규모 언어 디자이너위원회를 찾을 수 있습니다.

이전 버전과의 호환성을 유지해야하는 수백만 줄의 Java 코드로 구성된 기존 코드 기반과 결합하면 빙하 속도로 변화 할 수있는 모든 요소를 ​​갖추게됩니다.


1
OTOH, 당신은 또한 정말로 강력하고 널리 받아 들여진 표준을위한 재료를 가지고 있습니다. 예를 들어, JPA는 모든 웹 프레임 워크에 자체 ORA가있는 PHP의 상황과 대조됩니다.
Michael Borgwardt

내가 틀렸을 수도 있지만, 이해는 Haskell 또한 "위원회 별 디자인"언어이며 최첨단 언어입니다. 아마도 Java를 방해하는 것이 아닐까요?
Andres F.

@AndresF. 네,하지만 당신은 하스켈위원회에 큰 모 놀리 식 회사가 없다고 생각합니다. 여기 주석의 대화도 참조 하십시오 .
Robert Harvey

1

저는 프로그래밍 언어의 가장 중요한 목적이 사용되어야한다고 말합니다. 현재 C와 Java에는 람다식이 없으며 가장 많이 사용되는 언어입니다 (예 : TIOBE에 따름).

그리고 질문에 대답하기 위해 Java가 엔터프라이즈로 전달된다고 생각합니다. 이 영역에서 상황은 매우 안정적이고 신뢰할 수 있어야합니다. 예를 들어 Java 7은 거의 2 년 동안 등장했지만 Java 7의 프로젝트를 직접 알지 못합니다. 또 다른 중요한 점은 엔터프라이즈에서 매우 중요한 하위 호환성입니다.


나는 당신에 동의합니다 (+1) : 나는 Java를 (언어와 거대한 생태계로) 소중하게 생각하지만 Java 6에서 언어를 동결하는 것이 더 적절하다는 것을 알았습니다. 나는 어떤 노력도 기울이지 않을 것입니다 Java 7 또는 8을 강요받지 않는 한 (Java 7 또는 8이 필수 인 매우 흥미로운 프로젝트), 나는 오히려 시간을 Scala와 Clojure를 배우는 데 소비합니다.
조르지오
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.