3 ms·
The JVM is better for these workloads than JITted runtimes for dynamic languages, but I'd still stay Go, Rust, and C++ are better -- both in a practical sense o
by chubot 4y ago
The JVM is better for these workloads than JITted runtimes for dynamic languages, but I'd still stay Go, Rust, and C++ are better -- both in a practical sense of what tool to use, and in theory (AoT compilation, static types, and language control over memory layout).
It's not like people have been ignoring them on purpose. Plenty of code has been written in those languages, but the point of my post is that these pointer-rich workloads are even harder for them.
Java seems to lack value types on the stack, which results in a lot of extra garbage for language processors (something I learned the hard way)
(IIRC Guy Steele's famous "growing a language" talk over 20 years ago specifically advocated for value types in Java.)
Speed isn't the only important dimension -- they often trade speed for memory usage and startup time, and those become issues. As well as the weight/size/complexity/deployment of the runtime (i.e. Go is managed, but there's no separate runtime to deploy or configure). Also IIRC Java bytecode is untyped, so the JIT has do a lot of work to recover the types again, which is weird.
I think the JVM / CLR make a lot of sense for many server-side workloads. They haven't caught on much for tools deployed to people's desktops, I think for good reasons.
- pjmlp 4y agoJVM and .NET have had AOT compilation for 20 years now, even if not always available as free beer. > I think the JVM / CLR make a lot of sense for many server-side workloads. They haven't caught on much for tools deployed to people's desktops, I think for good reasons. Only if we are talking about "Linux Desktop".
- kaba0 4y ago> but I'd still stay Go, Rust, and C++ are better How does go fit in with the other two? I hate that it somehow considered low level, when it is closer to JS in execution semantics/performance/everything. Also, Java byte code is typed.
- jpgvm 4y agoGo exists in a weird space. It's not the top performer but is respectable (as long as you don't pressure the GC too much) however it's also not very expressive. This leads to it not being favoured as a high level language because it lacks the primitives to write very concise code. On the other hand it has a big runtime and a GC so it's too high level for many true systems programming tasks. This lack of high level language features coupled with it's higher level runtime means that it finds itself occupying a space between systems languages like Rust and C++ but "lower" than Python/JS/Ruby/Kotlin/Swift/etc. Essentially it ends up competing with Java on the server and supplanting C/C++ for systemsy tools in fields it got to before Rust arrived on the scene.
- kaba0 4y agoThat’s a good summary. I just see it way too often bundled together with low-level languages and it benefits no one to prefer/not prefer a language based on false knowledge.
- chubot 4y agoWith respect to performance and semantics, it's not closer to JS -- it's a typed language that uses types for AoT compilation, like C++ and Rust. The GC is a big difference, but it's also a pretty good one from what I know. The author of esbuild is understands software performance deeply (e.g. architected Figma in the browser in C++). He tried esbuild in both Rust and Go, and preferred Go for performance. https://esbuild.github.io/faq/ https://esbuild.github.io/faq/ There are some comments about it here on HN. edit: found some: https://news.ycombinator.com/item?id=22336284 https://news.ycombinator.com/item?id=22336284 https://news.ycombinator.com/item?id=22338442 https://news.ycombinator.com/item?id=22338442 https://news.ycombinator.com/item?id=30094498 https://news.ycombinator.com/item?id=30094498
- kaba0 4y agoGo barely does any optimizations, and its GC is quite subpar if anything (it does optimizes for latency, while most other optimizes for throughput, for what it’s worth). It does have value types and pointers (so do C# and D for quite some time), but with a naive compiler it will generally sit at the ~2+x niche of C performance, which.. performant JITted languages also occupy, including JS.
- chubot 4y agoOK, but what's your point? That Go isn't good for writing language processors? For that problem, Go can be put in the family of Rust and C++, and IMO the GC is actually an advantage over them. As mentioned, ASTs are often graphs. Putting Go closer to JS is just wrong, in an absolute sense, and relative to this problem. esbuild proves that Go is good for these workloads (again see those links). I think you're over-generalizing language performance without paying respect to the workload -- performance is very multi-dimensional. On microbenchmarks, Go is probably 2x slower than C, but (1) that's VERY good, and (2) those benchmarks aren't representative of the pointer-rich AST workloads we're talking about here. I have some beefs with Go myself, but it sounds like you just have some beefs with it that aren't all that relevant to the problem being discussed.
- jpgvm 4y agoI agree for short lived executions like tools etc. That said value types are coming to Java as part of Project Vahalla (and tangentially related to Project Panama) and AoT will be shipping as part of OpenJDK proper which would likely allow Java to be suitable for some of those cases. I would say Rust has a distinct advantage for language processing tasks however, not just because it's small runtime, compact memory layout etc but also because the existing body of work w.r.t language projects is very rich and well developed.