Na czym koncentruje się Java? Dlaczego tak długo trwa uzyskanie nowych funkcji?

11

Badałem nowe funkcje JDK8, takie jak wyrażenia lambda, metody rozszerzenia i nowy interfejs API strumienia.

Najwyraźniej żadna z tych funkcji nie jest nowa w świecie programowania i dlatego zastanawiałem się, dlaczego wszystkie te rzeczy są dostępne w Javie.

Wyrażenia lambda mieliśmy w Lisp (1958), SML (1973), Haskell (1990), Python (1991), JavaScript (1994), Ruby (1995), Scala (2003), C # (2007) i 55 lat po Lisp i praktycznie wszyscy inni, w Javie (2013).

I czytałem o strumieniach w SIC (1996).

Zastanawiam się, dlaczego teraz? Dowody wskazują, że konkurowanie z innymi językami nie jest motywacją.

Wydaje się, że wszystkie fajne nowe funkcje w tej wersji Java są tylko produktem ubocznym implementacji równoległości. Mamy lambdy, ponieważ upraszczają pisanie równoległych algorytmów, i mamy metody rozszerzeń, ponieważ potrzebowaliśmy ich, aby wesprzeć zmiany wymagane przez wyrażenia lambda itp. Itp.

Więc moje pytanie brzmi: czy możemy bezpiecznie potwierdzić, że głównym tematem w nadchodzącym wydaniu Javy jest w rzeczywistości równoległość? Czy możemy uzasadnić inne powody pojawienia się najstarszych sztuczek w książce do tej pory w Javie?

edalorzo
źródło
4
Wszystko to może przerodzić się w płomienną opowieść o opóźnieniach Javy.
Michael K
5
The evidence suggests- proszę podziel się swoimi badaniami.
2
Żadna z funkcji ani w Javie, ani w JVM, ani w JRE nie była nigdy nowa. I nawet kombinacja funkcji nie jest nowa, Eiffel miał wszystkie te w 1985 roku (GC, OO, bezpieczeństwo typu, nawet Generics, których Java nie otrzymała aż do 2003 roku). W rzeczywistości bardzo wyraźnym celem projektantów Java było nie wprowadzanie niczego nowego.
Jörg W Mittag
2
@MichaelK - Zgadzam się, że to może przerodzić się w wojnę płomieni. Może również stać się ważną odpowiedzią na trudną historię firmy Sun; Przejęcie firmy Sun przez Sun i Java; oraz w jaki sposób obecni opiekunowie Java próbują sterować językiem. Mam nadzieję, że odpowiedzi skoncentrują się na konstruktywnych aspektach tego pytania.
@MichaelT: Mam nadzieję, że nie przerodzi się to w wojnę płomieni i mogą pojawić się ciekawe pomysły. Na przykład często zakładamy, że język, który nie stale ewoluuje, jest opóźniony. IMO nie jest to prawdą, ponieważ zakłada, że ​​ewolucja języka jest liniowa (że wszystkie nowe funkcje, które stają się popularne, są dobre i powinny zostać przyjęte przez wszystkie współczesne języki). Ale opiekunowie języka mogą zdecydować, że nowa funkcja nie pasuje do reszty języka. Weź również pod uwagę, że istnieją znormalizowane, stabilne języki, które zdecydowanie nie są opóźnione (np. Common Lisp).
Giorgio

Odpowiedzi:

12

Kiedy po raz pierwszy zaprojektowano Javę, uznano za właściwe pominięcie funkcji anonimowych. Mogę wymyślić dwa powody (ale mogą się różnić od oficjalnych):

  1. Java została zaprojektowana jako język obiektowy bez funkcji, więc anonimowe funkcje w języku bez funkcji nie były naturalne. A przynajmniej miałoby to duży wpływ na projekt języka.
  2. Anonimowe funkcje nie były popularne w społeczności programistów, które Java miała przyciągnąć (C, C ++, Pascal?). Nawet teraz wielu programistów Java wydaje się uważać te funkcje za dość egzotyczne (ale prawdopodobnie zmieni się to bardzo szybko w przypadku Java 8).

W następnych latach, jak wyjaśnił Robert Harvey, zasadą firmy Sun było zawsze zachowanie kompatybilności wstecznej i bardzo stabilnej Java.

Z drugiej strony pojawiły się inne konkurencyjne języki (najważniejsze to C #, który urodził się jako klon Java, a następnie obrał własny kierunek rozwoju).

Konkurencyjne języki wywierają presję na Javę z dwóch powodów:

Ekspresyjna moc

Nowe funkcje mogą ułatwić pisanie niektórych idiomów programowania, czyniąc język bardziej atrakcyjnym dla programistów. Zwykle zestaw funkcji zapewnianych przez język stanowi kompromis między mocą ekspresji, złożonością języka, spójnością projektu: dodanie większej liczby funkcji sprawia, że ​​język jest bardziej ekspresyjny, ale także bardziej złożony i trudny do opanowania.

W każdym razie w ciągu ostatnich kilku lat konkurenci Javy dodali wiele nowych funkcji, których Java nie miała, i można to uznać za zaletę.

Szum

Tak, niestety jest to czynnik decydujący o wyborze technologii, przynajmniej z tego, co widzę w moim codziennym doświadczeniu jako programisty: narzędzie musi mieć pewną funkcję, nawet jeśli większość członków zespołu nie wie, jak go używać i ci, którzy mogliby z niego korzystać, nie potrzebują go przez większość czasu.

Hype może być jeszcze ważniejszy dla osób nietechnicznych, takich jak menedżerowie, którzy mogą decydować o platformie dla określonego projektu. Menedżerowie czasami pamiętają tylko niektóre słowa kluczowe, takie jak lambda, paralelizm, wielordzeniowy, programowanie funkcjonalne, przetwarzanie w chmurze ... Jeśli nasza wybrana technologia ma zielony znak na każdej pozycji na liście, jesteśmy na bieżąco.

Więc IMO od pewnego czasu Java została złapana pomiędzy

  • oryginalna polityka stabilności języka i prostoty projektowania, ogromna baza kodu i społeczność programistów z jednej strony, oraz
  • presja konkurujących języków, które mogłyby przyciągnąć programistów Java, najpierw C #, a następnie Scala, Clojure, F # (wymieniam te, o których wiem, że mogą istnieć inni).

Ostatecznie Oracle zdecydowało się zaktualizować Javę, aby była bardziej konkurencyjna. Moim zdaniem nowe funkcje skierowane są w szczególności do programistów Java, którzy mogą ulec pokusie przejścia na C # i którzy postrzegają inne języki, takie jak Scala i Clojure, jako zbyt różne od Java. Z drugiej strony programiści, którzy mają pewne doświadczenie w programowaniu funkcjonalnym i nadal chcą korzystać z JVM, prawdopodobnie już przeszli na Scala, Clojure lub inny język.

Tak więc nowe funkcje Java 8 zwiększą możliwości Javy jako języka, a deklarowanym celem jest jednoczesne i równoległe programowanie, ale wydaje się, że aktualizacja dotyczy również aspektów marketingowych (Mark Reinhold, główny architekt Java w Oracle, powiedział: „Niektórzy powiedzmy, że dodanie wyrażeń Lambda ma nadążyć za fajnymi dziećmi, i jest w tym trochę prawdy, ale prawdziwym powodem są procesory wielordzeniowe; najlepszym sposobem na radzenie sobie z nimi jest Lambda ”, zobacz ten artykuł ).

Tak, wiele (wszystkie) funkcje Java 8 były już dobrze znane, ale dlaczego i kiedy funkcja jest dodawana do języka zależy od wielu czynników: grupy docelowej, istniejącej społeczności, istniejącej bazy kodu, konkurencji, marketingu itp.

EDYTOWAĆ

Krótka notatka dotycząca „... Czytałem o strumieniach w SIC (1996).”: Czy masz na myśli, że do implementacji strumieni potrzebujesz lambda Java 8? W rzeczywistości możesz je zaimplementować za pomocą anonimowych klas wewnętrznych.

Giorgio
źródło
+1 I chciałbym dać ci więcej punktów, ponieważ jest to najlepsza jak dotąd odpowiedź na pytanie.
edalorzo
Na podstawie twojej odpowiedzi zbadałem więcej o tym, co powiedział Mark Reinhold, że znalazłem interesujący artykuł. Zamieszczę go tutaj z twoją odpowiedzią na przyszłość: Closures for Java autorstwa Mark Reinhold .
edalorzo
I ten artykuł tak naprawdę odnosi się do tego innego Zamknięcia dla Javy .
edalorzo
1
Z przesłanego linku znalazłem ibm.com/developerworks/java/library/j-jtp03048/index.html#4.0 , mówiąc, że Java może korzystać z anonimowych klas wewnętrznych, ale są one zbyt szczegółowe. Jednak zamknięcie Java 8 to nie tylko cukier syntaktyczny dla anonimowych klas wewnętrznych. Zatem teraz Java będzie miała DWA (semantycznie) różne rodzaje zamknięć: anonimowe klasy wewnętrzne i wyrażenia lambda.
Giorgio
11

Z czasem Java zmieniła się. Początkowo został zaprojektowany jako prosty potężny język, jako reakcja na „potężny złożony” C ++. Niektóre funkcje, które były w C ++ zostały celowo pominięte, takie jak przeciążanie operatora, szablony, wyliczenia, które zostały uznane za zbyt skomplikowane lub relikty ery C, a OOP u szczytu popularności, wszystko stało się obiektem w jednym światopogląd paradygmatu. Lambdy w tym czasie były uważane za po prostu „niepotrzebne” od czasu wprowadzenia anonimowych / wewnętrznych klas w Javie 1.1. Fakt, że składnia była znacznie bardziej szczegółowa, był prawie uważany za cechę .

Gdy Java została opublikowana, nie było zachęty do zmiany, dopóki Microsoft nie wprowadził C #, który wyciągnął wnioski z błędów projektowych Java i wprowadził serię nowych funkcji językowych. Nie ograniczały ich kompatybilność wsteczna. Myślę, że konceptorzy Java zdali sobie sprawę z niebezpieczeństwa konkurencji w języku C # i wypuścili Javę 5 z rodzajami, wyliczeniami itp.

Od tego czasu dyskutowano o włączeniu lambda do Javy i tylko pogorszył go obecny trend programowania funkcjonalnego. Ale takie rzeczy powoli się poprawiają i za pierwszym razem musi być dobrze. Moim zdaniem Java spartaczyła generyczne z usuwaniem typu, ponieważ kompatybilność wsteczna była uważana za powód do implementacji jej jako zwykłego cukru syntaktycznego. Wydaje się, że zamknięcia zostały przemyślane dokładniej i będą czymś więcej niż tylko cukrem syntaktycznym.

Podsumowując, jaki jest główny temat Java 8? Nie sądzę, że wersja językowa ma temat. Podobnie jak C ++ 11, raison d'etre Java 8 ma nadążyć za konkurencją, wprowadzając w języku rzeczy, które coraz więcej programistów uważa za oczywiste. Lisp może mieć lambda od 1958 roku, jego popularność gwałtownie spada od dziesięcioleci i dopiero niedawno programowanie funkcjonalne zostało poważnie rozważone w programowaniu „głównym” (z powodu braku lepszego słowa).

Cyrille Ka
źródło
„Lisp może mieć lambda od 1958 r., Jej popularność gwałtownie spada od dziesięcioleci, a dopiero niedawno funkcjonalne programowanie było poważnie rozważane w przypadku programowania głównego nurtu: popularność języka nie wydaje się dobrym wskaźnikiem jego skuteczności. Programowanie funkcjonalne jest zalecane od wielu lat, ale większość ludzi w branży uważała, że ​​to rodzaj rzeczy, którymi naukowcy lubią się bawić, pisząc pracę doktorską. Nagle branża się budzi i daje szansę, może dlatego, że teraz, gdy OOP jest w głównym nurcie, szukają kolejnej wielkiej rzeczy.
Giorgio
1
Powód, dla którego zamknięcia nie były pierwotnie zawarte w Javie, zgodnie z: Zrozumienie debaty na temat zamknięć . Tam James Gossling powiedział: „Zamknięcia były początkowo wykluczone z Jawy z powodu presji czasu bardziej niż czegokolwiek innego. W pierwszych dniach Jawy brak zamknięć był dość bolesny, więc narodziły się wewnętrzne klasy: niewygodny kompromis, który próbował uniknąć wiele trudnych problemów. Ale jak to normalne w wielu kwestiach projektowych, uproszczenia tak naprawdę nie rozwiązały żadnych problemów, po prostu je przeniosły ”.
edalorzo,
„Od tego czasu dyskutowane jest włączenie lambd do Javy, a obecna tendencja programowania funkcjonalnego nasiliła się.”: Uważam za interesujące, że w niektórych społecznościach (C ++, Java, ...) „używanie lambdas” często oznacza „ robienie programowania funkcjonalnego ".
Giorgio,
8

Najwyraźniej żadna z tych funkcji nie jest nowa w świecie programowania i dlatego zastanawiałem się, dlaczego wszystkie te rzeczy są dostępne w Javie.

Ponieważ Java musi przejść proces zatwierdzania, który angażuje kilku interesariuszy o wysokiej widoczności w proces podobny do „projektowania przez komisję”, a proces ten wymaga czasu, to wszystko.

Porównaj to z innymi językami, a znajdziesz dobrotliwego dyktatora lub małą komisję projektantów języków, którzy ściśle ze sobą współpracują i nie są związani z interesami korporacyjnymi.

Połącz to z ustaloną bazą kodów milionów wierszy kodu Java, która musi pozostać kompatybilna wstecz, a masz wszystkie składniki do zmiany w lodowcowym tempie.

Robert Harvey
źródło
1
OTOH, masz również składniki naprawdę mocnych i powszechnie akceptowanych standardów. Porównaj np. JPA z sytuacją dla PHP, gdzie każdy framework sieciowy ma swoją częściowo ocenioną ORM.
Michael Borgwardt,
Mogę się mylić, ale rozumiem, że Haskell jest także językiem „projektu przez komisję” i jest to język najnowocześniejszy. Więc może nie to przeszkadza Javie?
Andres F.
@AndresF. Tak, ale wyobrażam sobie, że nie masz dużych monolitycznych kompanii zasiadających w komitecie Haskell. Zobacz także rozmowę w komentarzach tutaj .
Robert Harvey
1

Powiedziałbym, że należy wykorzystać najważniejszy cel języka programowania; obecnie C i Java nie mają wyrażeń lambda i są najczęściej używanymi językami (na przykład według TIOBE).

Aby odpowiedzieć na pytanie, uważam, że Java jest skierowana do przedsiębiorstwa; w tej dziedzinie rzeczy muszą być bardzo stabilne i niezawodne; na przykład Java 7 pojawia się od prawie 2 lat, ale nie znam bezpośrednio żadnego projektu w Javie 7. Kolejną ważną rzeczą jest kompatybilność wsteczna, która jest bardzo ważna dla przedsiębiorstwa.

m3th0dman
źródło
Zgadzam się z tobą (+1): Bardzo cenię Javę (jako język i jej ogromny ekosystem), ale uważam, że bardziej odpowiednie byłoby zamrożenie języka w Javie 6. Nie zamierzam wkładać żadnych wysiłków w naukę Java 7 lub 8, chyba że jestem do tego zmuszony (jakiś bardzo interesujący projekt, w którym Java 7 lub 8 jest koniecznością), raczej spędzam czas na nauce Scali i Clojure.
Giorgio