V tomto prispevku vysvetlim OP, preco Java este zije. Bude to dlhy prispevok, ale o to zaujimavejsi.
Na uvod male odlahcenie v podobe lacneho vtipu.
Co má [Java] proti třeba Pythonu a novějším jazykům?
Len pre tvoju informaciu,
Java je novsia ako Python. Asi si nedaval pozor na hodine (
haha-h). Ked najblizsie budete mat Python, mozes ohurit skolitela.
A teraz uvediem perlu (takzvany
red pill), ktora nenecha Haskellistu, Lispistu a ineho funkcionalistu v klude:
Od jari 2014 v produkcnych systemoch (banky, vlady atd.) po celom svete a v masovej skale pribudli monady. Bez toho, aby o tom hlasali v televizii alebo pisali na root.cz bombasticke clanky, svet sa stal zo dna na den o trochu viac funkcionalnejsi...
A nestalo sa tak preto, ze od jari 2014 je Haskell najpopularnejsim jazykom. Stalo sa tak preto, ze vysla Java 8, do ktorej pribudli monadicke API, ktore su sucastou zakladneho JDK a teda su pritomne vsade tam, kde je Java 8 a vyssie. Tato myslienka nie je samozrejme moja, inak by som ju tak sebaisto neprezentoval. Povedal ju Ron Pressler na konferencii Curry on. Publikum sa sice zasmialo, ale bohuzial to nebol vtip. Okrem ineho do Javy pribudli aj lambdy...
Ako a kedy sme sa sem dostali? Su lambdy a monady listok pre Javu ako sa vratit medzi "nove" jazyky? Ale kdeze, v Jave su predsa aj lahke vlakna s kanalmi a kooperativnym multitaskingom podobne ako maju gorutiny v Go alebo procesy v Erlangu. Su tu aj namenej tri aktor frameworky (Akka, Orbit a Quasar) a samozrejme tzv. big data technologie, ci uz starucky YARN a MapReduce alebo mladsi Spark, near-realtime a adhoc analyticke nastroje ako Druid alebo Drill, zbierace a analyzatory prietokovych senzorickych dat Storm a NiFi, za tatru in-memory gridov (Genode, Hazelcast, Ignite) schopne spravovat PB v datalakeoch v RAMke, vyhladavace a indexery, ktore v inych jazykoch nemaju alternativne popularnu implementaciu. Alternativa k Spark ML? V neposlednom rade ma Java aj svoj polyglotny event driven "node.js" s nazvom Vertx.io a dokonca aj port Rx kniznice, ak by mal niekto potrebu ukojit svoje FRP tuzby.
A teraz k povodnej otazke
Ahoj, roky slýchávám, jak je Java stará a už nemá co nabídnout. I proto ji nedělám, ale mrzí mě, že je pořád nejpopulárnější. Proč to tak je?
Bezpochyby ma Java stale momentum. No je jasne, ze o toto momentum pomaly prichadza v prospech jazykov ako Go. Avsak treba si uvedomit, ze Java robi aj velmi riskantne kroky vo velmi (relativne) kratkom case, ktore inym jazykom trvaju roky (tymto pozdravujem Perl 6). Osobne si myslim, ze je to prave kombinacia riskovania, momentu a tiez schopnost Javy rozsirit "nove" technologie a koncepty na masovej skale medzi beznych programatorov, ktore drzia Javu nad vodou. Preto su ludia, ktory sa na Jave vezu, jeden den na koni a druhy den rukojemnici.
V Jave sa deju velke-male revolucie, ktore ale bezneho cloveka z ulice obchadzaju alebo o nich nikdy nepocul, lebo to nepotreboval. Napr. v roku 2010 to bolo zavedenie novej bytecodovej instrukcie
invokedynamic a v roku 2017 to bude v znameni IoT. V Java 9 sa bude balit do bundlov ako cez Webpack a pribudne AOT kompilcia do nativneho kodu - zatial iba na Linuxe. Pribude aj interaktivny shell. Stane sa Java potom dostatocne "mlada" ako Python?
Apropo, prave vdaka
invokedynamic sa stal JVM plnohodnotny domov novych jazykov (Scala, Closure, Kotlin, Python, Ruby, Haskell). Vtip je v tom, ze ked Java 7 vysla, samotny Java jazyk tuto instrukciu nijako nepouzival a kompiler ju ani nedokazal emittovat pre ziaden zo syntaktickych konstruktov. Ludia ako
Charles Oliver Nutter (tvorca JRuby) s ludmi zo Sun-u vtedy JVM riadne prefackali k zivotu aspon na dalsiu dekadu. Predsa ziaden zo staticky typovanych Javistov nepotreboval dynamicke prepajanie call site a target asistovane vlastnou bootstrap metodou pocas runtimu. Samotnemu jazyku Java trvalo dalsie 4 roky nez zacal
invokedynamic vyuzivat.
Dnes tuto dynamickost v Jave pouzijes tak, ze v IntelliJ kliknes prehodit slucku
for() na
forEach(). Alebo si do klastra 200 Ignite nodov posles
() -> { System.out.println("Hello World")} (Technicku diskusiu o tom, ze kompiler desugaruje lambdu na privatnu metodu na triede, kde je zadefinovana, vyemittuje invokedynamic call site v mieste volania a potom runtime musi za behu vytvorit ad hoc lambda factory triedu cez ASM kniznicu, nechame bokom).
Zaver z mojho prispevku je: Java sa vyvyja aj ked sa na nu nepozeras alebo inak
dnesna Java nie je ta ista, v ktorej zacinal pisat tvoj otec <-- velmi good read
[flame bait] Apropo, asi sa zhodneme, ze dochadza k istemu "revivalu typovosti" aj v dynamickych jazykoch, inak by TypeScript nenaberal tolko na popularite a nebol by primarnym vyvojovym jazykom Angular 4. Jasne, ze je to iny typ typovosti ako ma Java, ale stale lepsie ako JavaScript... Ze by to soudruzili architekti Javy odhadli v '96 spravnejsie ako Guido 5 rokov pred nimi?