News for hackers. Stuff that matters.
Re:How generics are implemented in Go 1.18 by kllrnohj on Tuesday March 01, 2022 @06:32PM (#30521527)
I see you haven't worked with the joy of gradle & modern Java development. By the time you stack up gradle, javac itself, proguard or for Android R8 which are basically required to fix the terrible bytecode javac produces, some annotation processors because WHY NOT, custom build plugins, etc... it gets big
Re:How generics are implemented in Go 1.18 by vips7L on Tuesday March 01, 2022 @10:49PM (#30523425)
I highly doubt that javac produces terrible bytecode.
Re:How generics are implemented in Go 1.18 by kllrnohj on Wednesday March 02, 2022 @09:11AM (#30527459)
I highly doubt you've ever looked at it then. javac more or less intentionally doesn't do any optimizations, it leaves it all for the job of the JIT at runtime. It doesn't do either class-local optimizations nor whole-program / LTO-equivalent optimizations. Things like proguard offer both, and hence why they can so easily claim things like +20% performance. There's a lot of low-hanging fruit in javac's output, at the cost of needing a map file to reconstruct source mappings of course (although Java could of course integrate this into the class files if it wanted, it would just rather invest more or less exclusively in the JIT & GC).

Here for example: https://godbolt.org/z/4nzPY3h57 javac doesn't even bother to resolve that static field at compile time, which wouldn't even have observable side effects. Nope, just blindly emits a static initializer to invoke square(2) at runtime.

Or for a real fun one, enums: https://godbolt.org/z/xjbYvc8dx

Now some of that is necessary to handle all the stuff other classes could do with the enum, but some of it is just unnecessary. Like building the values array, which invokevirtuals all the ordinals of all the enum values. Ordinals the compiler already knew, since it's literally in the same .class file further up (and these are always in the same .class file, they are in lock-step, so there's again no observable difference if the values array was defined with constants instead of invoking ordinals on each field).

And then the trivial switch statement there isn't optimized at all, either, which again wouldn't be observable (compare against what eg. gcc would produce: https://godbolt.org/z/414rGjbE1 )

Further note that these examples are both static initializers, which means the JIT never "fixes" these (and thus instead perpetually contribute to slow startup). So if javac was going to bother with any attempt to optimize at all, you'd think it'd be here.

Re:How generics are implemented in Go 1.18 by vips7L on Wednesday March 02, 2022 @09:47AM (#30527895)
While those are low hanging fruit and I want to see more things like that done (I'd cry for more aot scalar replacement), I don't think those are examples of "bad bytecode".

Bad bytecode is the kludge of byte code you get when you try to write the same thing in kotlin: https://godbolt.org/z/9sGa6csa6

Re:How generics are implemented in Go 1.18 by kllrnohj on Wednesday March 02, 2022 @09:55AM (#30527996)
This would be the same thing in kotlin: https://godbolt.org/z/dq86ezsKd

And the bytecode is of comparable quality to javac's.

Re:How generics are implemented in Go 1.18 by shadowgovt on Tuesday March 01, 2022 @09:22PM (#30522908)
Computers seem to have caught up. The Java stack is the slowest one I regularly use (though it does support a certain amount of hot-recompile that other toolchains I use don't or can't), but it's never just crashed because it can't find room to store all those bytecode files.
Re:How generics are implemented in Go 1.18 by vips7L on Tuesday March 01, 2022 @10:56PM (#30523474)
I’ve compiled projects with javac, scalac, g++, gcc, and dmd. Javac is faster than all of them.
Re:How generics are implemented in Go 1.18 by pkolaczk on Wednesday March 02, 2022 @04:32AM (#30525491)
javac doesn't have to generate optimized machine code, which saves it a lot of time. But you pay the price incrementally in all those slow startups of java apps.
Re:How generics are implemented in Go 1.18 by pjmlp on Wednesday March 02, 2022 @08:06AM (#30526878)
Only if stuck in Java 8, those of us in modern Java use JIT caches with PGO feedback.
Re:How generics are implemented in Go 1.18 by dboreham on Wednesday March 02, 2022 @04:07AM (#30525365)
You really need Scala to run out of memory though.