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?
źródło
The evidence suggests
- proszę podziel się swoimi badaniami.Odpowiedzi:
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):
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
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.
źródło
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).
źródło
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.
źródło
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.
źródło