[HN Gopher] Java 21 VirtualThreads vs. Clojure Lazy Seqs
       ___________________________________________________________________
        
       Java 21 VirtualThreads vs. Clojure Lazy Seqs
        
       Author : grzm
       Score  : 151 points
       Date   : 2023-10-06 15:44 UTC (7 hours ago)
        
 (HTM) web link (clojure.org)
 (TXT) w3m dump (clojure.org)
        
       | theanonymousone wrote:
       | Still waiting for VS Code to support Java 21. Java is not the
       | language to use without an IDE.
        
         | [deleted]
        
         | avodonosov wrote:
         | What in the java language makes you think it is less suitable
         | to be used without an IDE than other languages?
        
           | jillesvangurp wrote:
           | The fact that IDEs are just unusually smart specifically for
           | that languages relative to relatively dumb editors like vs
           | code, which lack most of the conveniences in the form of auto
           | complete, a wide variety of refactorings, auto fixes, etc.
           | Opting out of all that is not something a lot of people do.
           | Botttom line, you are missing out on so many good tools by
           | not using a proper IDE with Java that it's borderline
           | negligent to opt out of that. It's negligent because you
           | start opting into preventable issues (formatting, warnings,
           | common bug patterns, dead code, etc.) and generally end up
           | wasting a lot of time fixing things manually that you
           | shouldn't have to deal with because your IDE should be doing
           | those things. For example imports are not a thing I ever type
           | manually. Not a thing. Most warnings are addressed with a
           | simple alt+enter, which will typically suggest a usable fix.
           | With and IDE you see those warnings and can act on them.
           | 
           | Kotlin has the same advantage and is developed by Jetbrains
           | who also develop intellij and of course know what they are
           | doing on this front. Support for other languages in intellij
           | is also nice but typically a lot more limited than the
           | support for Java and Kotlin. E.g. pycharm is alright for
           | python but not that much different from what you get in vs
           | code. You get a handful of refactorings and that's about it.
           | Dynamically typed languages are just a lot harder to support
           | with proper tools. Too much uncertainty about what does what
           | or even what types things are.
        
           | lern_too_spel wrote:
           | Class-level imports and lots of classes.
        
           | paulddraper wrote:
           | It's verbose to write and read.
           | 
           | You need an assist for both.
        
             | palata wrote:
             | > You need an assist for both.
             | 
             | I don't. Do you?
        
               | collinvandyck76 wrote:
               | Obviously GP think it's helpful? Just because you're in
               | the minority that doesn't need IDE or LSP assist writing
               | Java, I think that most people would argue that assist
               | for Java is beneficial even if you personally don't need
               | it and there's no sense in flexing about it.
               | 
               | I personally always use IDE/LSP for Java, even though
               | it's been many years since I've written it, because it
               | helps me deliver business value faster.
        
           | matsemann wrote:
           | It used to be lots of boilerplate. Like
           | 
           | MyClassType myClassType = new MyClassType()
           | 
           | And then it was nice to use an IDE to help write some of
           | that. Or generate java beans etc.
           | 
           | But with that said, I don't think it's much you _need_ an IDE
           | for, it 's more that java enables IDEs to do much more than
           | it can for certain other languages.
        
             | vips7L wrote:
             | You haven't had to declare the type since Java 10.
             | var myThing = new MyThing();
        
               | matsemann wrote:
               | Yup, hence "used to", but I could be clearer it's no
               | longer an issue.
        
             | palata wrote:
             | That's a thing I don't get. Maybe I am doing something
             | completely wrong, but the vast majority of my time as a
             | developer, I am not typing code. I can afford 5s typing
             | `MyClass myClass = new MyClass()`.
        
         | vips7L wrote:
         | Things take time. If you want you can contribute resources to
         | the vs code plugin and the eclipse language server.
        
         | matsemann wrote:
         | I can't imagine doing Java in VS Code instead of Intellij. Is
         | there something I'm missing out on?
        
           | jcadam wrote:
           | No idea. I use IntelliJ for Java/Kotlin and emacs for
           | everything else (Clojure, Python, JS, etc). I still encounter
           | the occasional lunatic who uses eclipse or netbeans.
           | 
           | I know VSCode is the "standard" editor for front-end devs,
           | and so I assume some of them are trying to keep their code
           | editor when moving into backend work. I have to believe it's
           | not as good - for a time I really, really tried to make emacs
           | work for Java development, but it just.... doesn't :)
        
             | bafe wrote:
             | How's the Kotlin language server performance for you? When
             | I last tried it was using up so much resources for the
             | simplest Kotlin file. I gave up and moved to intelliJ
             | (which incidentally offers plenty of refactoring features
             | you don't get in vscode)
        
               | mey wrote:
               | Kotlin is horrible in every IDE other than
               | IntelliJ/AndroidStudio and JetBrains has little
               | motivation to fix that.
        
             | Phelinofist wrote:
             | At my job a lot of people hate on Eclipse, but honestly I
             | find it quite nice. I use IntelliJ for my private projects
             | and think both are on par.
        
               | zmmmmm wrote:
               | fellow eclipse die hard here ...
               | 
               | It's definitely a very complex beast but once you do
               | master that complexity it is such a power tool. Even
               | though I routinely do work in IntelliJ I miss various
               | things enough from Eclipse that I always go back.
               | 
               | I just wish it had proper Kotlin support.
        
             | theanonymousone wrote:
             | The reason I use VSCode is Code Server[0]. It is certainly
             | not as powerful as IntelliJ, but the I have to get used to
             | it because the web-based IDE is a must for me.
             | 
             | By the way, unless my English is terribly bad, calling
             | someone lunatic for their choice of IDE may not be a great
             | idea.
             | 
             | [0] https://github.com/coder/code-server
        
               | ilikehurdles wrote:
               | Lunatic meaning maniac or fool.
        
               | jcadam wrote:
               | I was being facetious, of course :)
        
           | specialist wrote:
           | Though I prefer IntelliJ, VS Code is fine.
           | 
           | I sometimes switch to VS Code just to use Lischke's terrific
           | ANTLR plugin.
           | 
           | https://marketplace.visualstudio.com/items?itemName=mike-
           | lis...
        
         | jgon wrote:
         | Brian Goetz just gave a talk about all the stuff that's been
         | delivered up to Java 21 that announced they'd be rolling out a
         | fully supported VS Code plugin for Java that should be better
         | than the current language support. It should be out within the
         | next week or two.
         | 
         | Timestamp for the announcement:
         | https://youtu.be/eXCx2hW_xNI?t=1955
        
       | mike_hearn wrote:
       | The Clojure devs should be aware that the synchronization pinning
       | problem is intended to be temporary and doesn't apply at all with
       | GraalVM native images. One of the Loom developers talks about it
       | here:
       | 
       | https://mail.openjdk.org/pipermail/loom-dev/2023-September/0...
       | 
       | So they could also just choose to ignore this problem for now.
        
         | [deleted]
        
         | puredanger wrote:
         | We are aware, and that is one of the options. :)
        
           | puredanger wrote:
           | The other thing I didn't mention is that the change to remove
           | biased locking a while back has also had an impact in some
           | places that do almost always uncontended locking, so we're
           | kind of considering that too.
        
         | fnordsensei wrote:
         | A lot of Clojure projects choose to stick with the LTS releases
         | though, so it might take a while before this problem disappears
         | on its own, even if fixed in the JVM.
        
           | vips7L wrote:
           | As pron always says.. that's a risk of staying on an LTS
           | release. You're choosing to not receive updates.
        
             | geodel wrote:
             | It seems to me by design or by indifference Java is now
             | tired of JVM ecosystem languages at large who claim
             | innovation by surface level changes while relying heavily
             | on JVM bedrock.
             | 
             | Now Java is moving fast and they are taking JVM compiler,
             | runtime, class metadata etc along where _Java, the
             | language_ is headed.
        
               | Tainnor wrote:
               | And many developers are tired of Java making minuscule
               | improvements to developer ergonomics while pretending to
               | be progressing, when even now, it doesn't have features
               | that other languages have had for 30 years.
        
               | kaba0 wrote:
               | Based on pure statists about the number of important,
               | business critical java-applications that run most of the
               | internet, it seems like it just straight doesn't matter
               | in any significant way.
        
               | Tainnor wrote:
               | Maybe it doesn't matter to you, but it does matter to me.
               | 
               | All the power to people who enjoy working in Java, but
               | that doesn't have to make me like it.
        
               | pjmlp wrote:
               | Not only Java, that is the fate of all guest languages,
               | as they don't evolve alongside the platform, always
               | require additional tooling and most language cultures
               | than start making their own little islands of idiomatic
               | libraries instead of directly using platform libraries.
               | 
               | Since most platforms are leaky, one ends up needing to
               | master two ecosystem in parallel, eventually it gets
               | tiring and always cost extra in development.
               | 
               | C++, Objective-C and Typescript get around this problem
               | in UNIX and Web, as they are extensions of the platform
               | languages, not something completely different.
        
               | geodel wrote:
               | Yep agree with all you said. Nowadays _new job every
               | year_ people at work are scaring me with their enthusiasm
               | to replace decades old solid Java applications which are
               | performant and working fine with Kotlin and what not.
        
               | Alupis wrote:
               | I wouldn't advocate for replacing/re-writing old stuff -
               | but you _should_ try out Kotlin for backend work. It 's
               | amazing.
               | 
               | Java programmers will have only a small learning curve
               | before feeling productive, and can gradually get more
               | comfortable with idomatic Kotlin as they progress through
               | their journey.
               | 
               | Kotlin, as a language, was very well through out, letting
               | you use as much or as little of it as you are comfortable
               | with.
        
               | vips7L wrote:
               | For me personally Kotlin does not bring that much to the
               | table over a modern version of Java. Sure if you're stuck
               | in Java 8 it can be a win, but compared to Java 21 it
               | just doesn't bring enough to warrant the switch for me.
        
               | skwirl wrote:
               | I've seen this sentiment a lot and I don't understand it.
               | I actually feel like very little has been added between
               | Java 8 and Java 21. Virtual threads is probably the
               | biggest thing, and it looks very promising, but the
               | language itself is still a chore to use, and Kotlin does
               | a good job at cleaning a lot of that up.
               | 
               | I think Kotlin is at risk, though, of having the JVM
               | force them to support two competing models to accomplish
               | the same thing - coroutines and virtual threads is a good
               | example (although Java still doesn't have language level
               | structured concurrency). This could really make things
               | messy.
        
               | vips7L wrote:
               | > I've seen this sentiment a lot and I don't understand
               | it.
               | 
               | I just don't think any feature of the language of Kotlin
               | is that much better than Java's implementation. I'm also
               | a big supporter of brevity != clarity when it comes to
               | code.
               | 
               | What language feature in Kotlin do you think is that much
               | better?
        
               | Alupis wrote:
               | I was you not that long ago. I've had the same
               | conversation with a lot of other Java developers too -
               | they/we always say the same things.
               | 
               | It's weird being on the other side of the fence now -
               | hearing the same things I used to say.
               | 
               | Kotlin was a gateway drug out of not just Java, but
               | OO/Solid and into FP for me (FP being another thing I
               | used to not "get"). The beauty of Kotlin is you don't
               | have to ever write FP code if you don't want to - but you
               | will want to before too long.
               | 
               | I would recommend trying it out for yourself. It's Spring
               | integration is amazing, and you'll have a great time.
               | Write even a little Kotlin and you'll have an "ah ha!"
               | moment and everything will forever be different.
               | 
               | It's one of those things where you need to experience it
               | for yourself before you actually understand how great it
               | is. There is no argument you will hear that will convince
               | you, sadly. I was the same once...
        
               | sitta wrote:
               | > I actually feel like very little has been added between
               | Java 8 and Java 21.
               | 
               | var, records, sealed types, and pattern matching make a
               | huge difference in how Java is written. A lot has changed
               | since 8.
        
               | Alupis wrote:
               | The issue with these new structures is they're
               | necessarily clunky, to maintain interoperability with
               | non-modern Java. Java's backwards compatibility is
               | legendary, but is also why some of it's newer features
               | are often criticized as not being as good as they could
               | be.
        
               | jcadam wrote:
               | Kotlin is the closest thing to a "better Java" that I've
               | found. I've used it with Spring Boot and the
               | interoperability with Java is fantastic. A Java dev would
               | have no problem picking it up quickly (as opposed to
               | Clojure and even Scala).
               | 
               | I say this as a Clojure fan, there are many instances
               | where I'd probably choose Kotlin nowadays. You can also
               | mix JVM languages within the same application; I've found
               | it rather useful to sprinkle some Clojure into a
               | Java/Spring application for certain tasks. Maven and
               | Gradle both have tooling to handle it :)
        
               | Alupis wrote:
               | If you're into FP stuff, using Arrow within Kotlin takes
               | you to that next level. It even works with Spring/Boot.
        
               | bafe wrote:
               | Couldn't agree more! It's particularly disappointing when
               | you need to work on an older java codebase after
               | finishing a Kotlin project. You'll constantly miss
               | features
        
               | ahoka wrote:
               | Even C# seems like something stuck in the 1990s compared
               | to Kotlin. (I know it's not a high bar).
        
               | pjmlp wrote:
               | Not kept up with the times in regards to C# 12 features?
        
               | Alupis wrote:
               | C#'s problem is it's quickly becoming C++ in that it
               | doesn't just have the kitchen sink, it has three kitchen
               | sinks...
               | 
               | Unlike C++ though, one day the powers that be will just
               | remove features as part of yet-another framework rewrite
               | and you'll just have to deal with it.
               | 
               | The other issue is just how tightly coupled C# as a
               | language is to the .NET framework/platform. Some of the
               | things people like C# for are actually framework things
               | and they don't realize it because that separation isn't
               | as clear as with Java and say, JavaEE or Spring or $X.
               | 
               | If you talk to a C# developer - of course they're using
               | .NET and of course they're using Entity Framework - to
               | them, there's no other way. It's inconceivable that any
               | other library or framework might do it _better_ than
               | Microsoft 's official offering... and then you'll find
               | the official offering to be lacking in fundamental ways.
               | 
               | Talk with a Java developer and you'll find there's a lot
               | more diversity of frameworks and libraries being used -
               | so there's a lot more differing opinions on priorities
               | and a lot more good ideas being tried out or implemented
               | everywhere. The communities are vastly different in that
               | regard.
        
               | pjmlp wrote:
               | It is still another syntax, with idioms moving away from
               | JVM, their own little islands of Kontlin only libraries,
               | and only works on InteliJ/Android Studio.
               | 
               | I don't see any value in Kotlin outside Android shops.
        
               | jcadam wrote:
               | > I don't see any value in Kotlin outside Android shops.
               | 
               | Developer experience is important to some people - not
               | just devs, but those who seek to recruit and retain good
               | ones.
               | 
               | Of course, if you're looking to hire massive numbers of
               | butts-in-seats (gov work, large enterprise shops, etc) I
               | suppose Java is probably the ideal choice.
        
               | Alupis wrote:
               | While true it has it's own syntax, the syntax is better
               | than Java and more ergonomic. With that said, you can
               | write Java in Kotlin - and by that I mean Kotlin code
               | that looks almost exactly like Java. Heck, you can have
               | .java and .kt source within the same project all mixed
               | together if you want.
               | 
               | Kotlin libraries are interoperable with Java and vice
               | versa. In some specific cases, a Kotlin library needs a
               | little syntactic sugar to make it work with Java like a
               | Java developer would expect, but it's easy to do. Going
               | the other direction though - Java library used in Kotlin,
               | zero issues, it just works. Some Java developers don't
               | even realize they're already using Kotlin - take a look
               | at OKHttp and friends...
               | 
               | Lastly, there's Kotlin support is all major IDE's,
               | including IntelliJ of course, but also Eclipse and likely
               | whatever editor/ide you prefer. Kotlin is basically just
               | a bunch of libs.
               | 
               | I would argue Kotlin is better outside of Android than in
               | Android. For backend work, particularly when coupled with
               | Spring/Boot, it's freaking amazing. The Spring team has
               | put in an impressive amount of work to make Kotlin a
               | first-class language within the ecosystem, and it really
               | shows.
        
               | pjmlp wrote:
               | Try to call Kotlin co-routines from Java.
               | 
               | Telling me there is Kotlin support in Eclipse only tells
               | me you never actually tried it, specially after JetBrains
               | ramped down the team that was doing the now stale plugin.
        
               | Alupis wrote:
               | You should look harder before saying it doesn't work.
               | Updated 10/6/2023[1]
               | 
               | Coroutines are a specific paradigm within Kotlin, and
               | should not be in library code anyway. With the addition
               | of JVM Virtual Threads, the need for Coroutines is
               | significantly diminished anyway.
               | 
               | It's anecdata, yes, but I've written a lot of Kotlin code
               | and do not use coroutines. Kotlin really just lets you do
               | what you want - as much or as little idomatic code as you
               | need.
               | 
               | Kotlin on the backend is amazing. You really should give
               | it a try. Java sucks badly, in comparison (I say that as
               | a former Java nerd...)
               | 
               | [1] https://marketplace.eclipse.org/content/kotlin-
               | plugin-eclips...
        
               | pjmlp wrote:
               | And you should read before posting random links,
               | After installation of the Kotlin plugin the Java plugin
               | is not running anymore. I cannot open a Java project
               | anymore.             The log file says:
               | !MESSAGE org/eclipse/jdt/internal/ui/refactoring/actions/
               | RenameJavaElementAction$AjcClosure1        !STACK 0
               | java.lang.NoClassDefFoundError: org/eclipse/jdt/internal/
               | ui/refactoring/actions/RenameJavaElementAction$AjcClosure
               | 1         at org.eclipse.jdt.ui.actions.RenameAction.<ini
               | t>(RenameAction.java:60)         at org.eclipse.jdt.ui.ac
               | tions.RefactorActionGroup.<init>(RefactorActionGroup.java
               | :372)         at org.eclipse.jdt.ui.actions.RefactorActio
               | nGroup.<init>(RefactorActionGroup.java:206)         at or
               | g.eclipse.jdt.internal.ui.packageview.PackageExplorerActi
               | onGroup.<init>(PackageExplorerActionGroup.java:139)
               | at ...
        
               | Alupis wrote:
               | You copy/pasted an error some random person on the
               | internet had in June due to using an incompatible Eclipse
               | & plugin versions?
               | 
               | The beauty of Eclipse is the ecosystem. If that official
               | Jetbrains plugin doesn't do it for you for some reason,
               | then use another one[1].
               | 
               | [1] https://marketplace.eclipse.org/content/enhanced-
               | kotlin-ecli...
        
               | pianoben wrote:
               | I've worked in several JVM backend projects, and Kotlin
               | has been a stark improvement over Java (at least up
               | through version 17, the most recent with which I've
               | worked directly). Compose, and Compose UI, are
               | tremendously promising technologies; I've shipped desktop
               | apps with Kotlin for multiple platforms, and compared to
               | just about every other desktop UI framework, it's a clear
               | winner in terms of productivity and an ability to GSD.
               | 
               | All that to say, I believe that Kotlin has a _lot_ of
               | value, independently of Android.
        
               | Tainnor wrote:
               | "Only works on IntelliJ" is patently false. Stop
               | spreading FUD.
        
               | pjmlp wrote:
               | Where is Kotlin support for Eclipse and Netbeans?
               | 
               | Prove me wrong.
        
               | Alupis wrote:
               | Do you use Eclipse? Have you looked at the available
               | plugins?
               | 
               | There's nothing special about Kotlin. It's a bunch of
               | libraries for runtime and compile time... like anything
               | else you use.
        
               | pjmlp wrote:
               | It is my main Java IDE.
               | 
               | There is a difference between supporting a language with
               | a Notepad++ like experience, and what JetBrains was doing
               | before ramping down the Eclipse plugin team, as means to
               | sell more InteliJ licenses instead.
        
               | Alupis wrote:
               | What do you believe you are missing?
               | 
               | It compiles fine with Maven or Gradle, it provides auto-
               | prompt/complete/hints. It just works.
        
               | pjmlp wrote:
               | Same experience as in InteliJ, which JetBrains no longer
               | provides.
               | 
               | And above all, no crashes left and right.
        
               | Alupis wrote:
               | I'll ask again more clearly - what is the "same
               | experience" you are missing?
               | 
               | Kotlin is plugins for Maven/Gradle, and classpath
               | libraries. There is no magic going on here...
        
               | never_inline wrote:
               | That's an interesting hypothesis. Is that applicable to
               | platforms other than programming languages?
        
           | vemv wrote:
           | To be entirely fair, there's arguably little overlap between
           | devs that stick to LTS, and devs that will play with JVM
           | virtual threads on Clojure (before the Clojure team has any
           | particular, public stance on them).
        
             | fulafel wrote:
             | Yes, especially since the use case for virtual threads is
             | so niche.
        
               | weatherlight wrote:
               | Is this sarcasm, or just generally true in the java
               | community?
        
               | fulafel wrote:
               | Neither for me (I'm in the Clojure camp), it just seems
               | to me there aren't many situations where you'd need
               | millions of threads. Plus we've got core.async to reach
               | for to multiplex many control flows on one OS thread -
               | though I feel it's more needed when targeting JS
               | (ClojureScript) and the single-threaded world there.
        
               | weatherlight wrote:
               | I'm coming at this from a Erlang/Elixir background ,
               | Where we basically have "virtual threads" but they aren't
               | at the OS level. It's easy to use and making things
               | concurrent (or parallel) is often trivial. Whether it's 1
               | extra virtual thread or millions of virtual threads, the
               | code (and the horizontal scaling of that code is the
               | same)
        
               | [deleted]
        
               | bcrosby95 wrote:
               | I can't think of a project I've worked on in the past 10
               | or so years that couldn't benefit from virtual threads.
               | Right-sizing your thread pools in an environment with a
               | lot of IO is/was a pain in the ass.
               | 
               | Many of the core concurrency constructs in Clojure has
               | separate functions for when you are doing something that
               | is blocking vs not blocking. If it were all virtual
               | threads this distinction generally wouldn't matter.
        
               | Alupis wrote:
               | Not just that - the kicker is everything that already
               | exists (libraries, JDBC drivers, etc) are now just
               | automagically non-blocking too if you seed the thread
               | pool with a virtual thread factory.
               | 
               | I can't remember the last time such a transparent, drop-
               | in-able change was so impactful for just about
               | everything.
               | 
               | While it doesn't remove the need for the
               | event/reactive/async paradigm in all cases, it does
               | removes the need for async code just for the sake of
               | being non-blocking.
               | 
               | Code can now be written much more clearly, and still be
               | non-blocking. That's huge.
        
               | [deleted]
        
           | koito17 wrote:
           | In fact, the officially supported Java releases for Clojure
           | are all LTS releases. This is also reflected in their CI. At
           | the moment, that means 1.8, 11, 17, and 21.
           | 
           | I would also like to mention, for non-Clojure users: it took
           | _ages_ for Clojure to finally get off Java 1.5. The compiler
           | was still emitting 1.5 compatible bytecode as late as 2018.
           | Since the release of Clojure 1.10 (17 December 2018), the
           | minimum Java version was bumped up to 1.8, in the sense that
           | the compiler now emits 1.8-compatible bytecode.
           | 
           | There is a strong emphasis on moving slowly and NOT breaking
           | things in the Clojure community. Likewise, if you look at the
           | most recent Clojure survey results, the vast majority of
           | people were still on 1.8 and 11 releases.[1]
           | 
           | [1] See Q24 in https://www.surveymonkey.com/stories/SM-_2BH3b
           | 49f_2FXEkUlrb_...
        
             | tombert wrote:
             | I actually do feel like this is partly what's responsible
             | for Clojure's relative success in industry. If you have a
             | company with a ton of Java 5 code, and you want some of the
             | sexy functional programming features, your options
             | basically boil down to "upgrade everything to the newer
             | Java 8 to get maps and optionals and whatnot" or "just
             | write this new service in Clojure that will happily interop
             | with our Java 5 code".
             | 
             | I'm not making a judgement on which decision is better, but
             | I can totally see the appeal, at least in the short term,
             | for people choosing Clojure, especially if they think that
             | Clojure's API will be largely unchanged in the Java 8
             | update. It doesn't hurt that Clojure is just broadly a
             | really pleasant to work with, at least in my opinion.
        
               | Quekid5 wrote:
               | > If you have a company with a ton of Java 5 code...
               | 
               | You are in deep deep trouble already, just process-wise.
               | If you're making money hand over fist you might be able
               | to afford to do that, but choice of language is not even
               | on the radar in terms of what needs fixing.
               | 
               | Now, if you mean in terms of digging out of that hole...
               | just upgrade to newer dependencies, newer JDK versions,
               | etc. That's the way to better performance, better memory
               | usage, better GC, better everything... and _THEN_ think
               | about the language you 're using.
        
       ___________________________________________________________________
       (page generated 2023-10-06 23:00 UTC)