News for hackers. Stuff that matters.
Re:Why Aren’t More Users More Happy with Our VMs? Part 1 by cm2187 on Thursday September 06, 2018 @04:12AM (#17924663)
One thing I am struggling to understand is why do we need JIT in the first place? What would be wrong with statically compiling java or c#? Portability is nice but the reality is that almost no one uses it. Typically you have to create different packages for different platforms anyway just because of the installer. Most backend applications are designed to work on a single platform (who is running a mixed windows+linux/x86+ARM backend for the same binaries?). For front end applications, most platforms have different UIs, and all new platforms (android, iOS) have incompatible APIs anyway.

Is there a fundamental benefit I am missing?

Re:Why Aren’t More Users More Happy with Our VMs? Part 1 by naasking on Thursday September 06, 2018 @08:42AM (#17925788)
> Portability is nice but the reality is that almost no one uses it. Typically you have to create different packages for different platforms anyway just because of the installer.

Strange you think that, because mobile phones use a variety of processors and architectures, and virtually all the binaries running on them were shipped with a platform-agnostic bytecode. Not to mention all the Java servers out there, or cloud services like Azure and Google Cloud which host .NET VMs.

As for your question, JIT has a few advantages beyond portability:

1. The fact that the bytecode isn't tied to the machine means the CPU and architecture has more flexibility to change, introduce new registers, vector units, and so on, and the VM can take advantage of these features without needing recompilation and redistribution of every program.

2. The machinery permitting runtime compilation is typically used for other things by programmers, like manually dynamically compiling new program fragments based on user input which are more performance-optimal (think LINQ expression trees and other forms of quasiquotation/explicit staging).

3. Programs can benefit from progress in optimization algorithms without needing to statically recompile and redistribute every program.

4. Bytecode is typically much safer and easier to analyze for various safety and security properties, so they can be shipped to clients on-demand for special purposes. Like web assembly.

As you can see, the main benefits aren't tied to performance, but to portability, safety and flexibility. I think the usual focus on performance is a red herring.

Re:Why Aren’t More Users More Happy with Our VMs? Part 1 by kannanvijayan on Thursday September 06, 2018 @10:00AM (#17926310)
> As you can see, the main benefits aren't tied to performance, but to portability, safety and flexibility. I think the usual focus on performance is a red herring.

I'd recharacterize the performance question - the question as I've observed it has been "can we get all of these nice things without sacrificing too much performance", where the bar for "too much" has continually moved.

From the 100x slower days of early TCL implementations, to 10x, now down to some small percentage overhead.

It's good that the bar keeps moving - it puts pressure on the JIT world to keep delivering. I don't have the time to write up a long post about my personal thoughts on the long-term future of JITs, but I can summarize it thus (I realize it's a bit of polemic perspective):

1. I believe JIT compilation will slowly become the norm for most program execution environments - even for static languages. Wasm is a kick in that direction, and more will follow.

2. One reason I'm excited about JITs slowly making their way into static languages is things like proper first-class, _highly performant_ implementations of higher-order parametric polymorphism. For a quick example, I am always slightly annoyed when Rust tells me that I can't take a reference to a trait because it's not an Object trait:

``` trait Foo { fn bar<A>(...); }

let foo: &Foo = ...; // Invalid. Foo is not an object trait. ```

The reason we don't get to have this very nice, wonderful, powerful thing is because we need to specialize ALL occurrences of `bar`. I want this feature in my life. I've butted my head too many times against it and had to implement a compromised solution with type erasure and re-discovery on the other end of an API, leading to lots of unnecessary complexity, code duplication, and surface area for bugs.

A VM carrying a JIT that knows how to compile new specializations on demand effectively renders the notion of `object traits` obsolete.

Now Rust is not the right language for that (it wants to be bare metal and runtime-free and low-level). However, I would love for higher-level statically typed languages to start offering me these capabilities.

3. I actually believe performance with JITs will eventually be better than pre-compiled code. Our techniques are still young and somewhat ad-hoc. There are concrete areas where there is significant room for improvement in the design and implementation of JIT engines. This industry is still basically in its infancy.

Re:Why Aren’t More Users More Happy with Our VMs? Part 1 by pjmlp on Friday September 07, 2018 @04:45AM (#17932769)
You should spend some time reading about mainframe execution environments for z/OS and IBM i.

JIT has been the norm since they exist, code is compiled to bytecode and AOT compiled at installation time or on demand if the environment is changed in some way.

In a way, similar to deployment scenarios adopted by Android, Windows Store and to a smaller extent Apple devices.

Re:Why Aren’t More Users More Happy with Our VMs? Part 1 by pjmlp on Thursday September 06, 2018 @09:50AM (#17926231)
And chips on smart cards, electricity meters, telephone PBX,...
Re:Why Aren’t More Users More Happy with Our VMs? Part 1 by varjag on Thursday September 06, 2018 @04:54AM (#17924819)
The theoretic fundamental benefit is you are able to optimize for code paths practically occurring during the runtime with particular set of data or inputs. There is no way to know that at compile time, hence it's often touted as a way to make things "faster than C" with sufficiently smart JIT compiler.

But of course no JIT compiler ever is sufficiently smart and any execution path benefit gained is lost to poor cache discipline of VMs. And the whole JIT/hotspot concept was really a hindsight attempt to get away from abysmal performance of VM based languages.

Re:Why Aren’t More Users More Happy with Our VMs? Part 1 by pron on Thursday September 06, 2018 @06:34AM (#17925207)
You're forgetting that the whole idea is not to compile the same language better, but to compile different languages (that are supposed to offer better productivity) to have similar performance to C. Obviously, languages such as Javascript or Ruby cannot possibly be compiled AOT with good performance, but even Java relies heavily on virtual dispatch, and a JIT can inline through virtual calls. Languages that don't rely on virtual dispatch as much will benefit less from a JIT.

Today, as we have both AOT and JIT compilers for Java, we can see that the JIT does, indeed, generate better code. By how much depends on your specific use-case.

> lost to poor cache discipline of VMs

What are you referring to? If you're talking about memory layout, then this has nothing to do with the VM and everything to do with the language design. The reason Java has little control over memory layout was that it didn't make much of a difference in the '90s; now it does, so Java is getting control of layout.

Re:Why Aren’t More Users More Happy with Our VMs? Part 1 by cm2187 on Thursday September 06, 2018 @07:12AM (#17925375)
But you don't need JIT for that. You need an intermediary language (ByteCode / MSIL). In a non-JIT world you would use ByteCode/MSIL libraries, and just before deploying, statically compile them for the platform they will be deployed to. JIT just means you are doing that step everytime the program runs (+/- caching) for every machine.
Re:Why Aren’t More Users More Happy with Our VMs? Part 1 by pron on Thursday September 06, 2018 @08:10AM (#17925631)
You cannot efficiently compile ahead of time languages whose semantics heavily rely on dynamic dispatch. AOT profile-guided optimization would help, but it carries added effort (and still cannot be as aggressive if there is no possibility of deoptimization and recompilation by a JIT). Intermediate representation is completely irrelevant.

Java now offers "deploy-time" AOT compilation, and the results are not as good as a JIT (YMMV).

Re:Why Aren’t More Users More Happy with Our VMs? Part 1 by pjmlp on Thursday September 06, 2018 @09:54AM (#17926264)
Java now offers "deploy-time" AOT compilation for free.

It has been available since the early days in commercial JDKs and initially it was the deployment option on IBM mainframes, by converting JVM bytecodes into the bytecodes of the mainframe execution environments.

Re:Why Aren’t More Users More Happy with Our VMs? Part 1 by hyperman1 on Thursday September 06, 2018 @05:03AM (#17924868)
There is another very practical benefit: You can use all features available on your PC.

E.g. when you compile an application C-style, you set the target architecture to the lowest CPU you want to support. If this is , say, SSE, then no SSE2 instructions will be used by the program and the sometimes huge performance gains from them are lost.

A VM like hotspot can generate code for this specific machine. If you have SSE2, it will generate SSE2 instructions. If you dont, it wont.

Recently, I see more applications choosing code paths based on CPUID, but this only works for CPUs existing at compile time. If you app was compiled in 2016, in wont use CPU features from 2018. If your java app from 2016 runs on a JRE from 2018, it will use them.

Re:Why Aren’t More Users More Happy with Our VMs? Part 1 by varjag on Thursday September 06, 2018 @06:30AM (#17925192)
I would really like to see a Java program beating a C program in this use case. Say, outperforming it (or even matching to same order of magnitude) on DCT/IDCT even by using SSE2 vs SSE/MMX. Can only say am immensely sceptical.

Another thing is these kind of gains with instruction level efficiencies are exceedingly rare and your typical VM program never runs any code where SIMD extensions would make a difference.

Re:Why Aren’t More Users More Happy with Our VMs? Part 1 by hyperman1 on Thursday September 06, 2018 @09:13AM (#17925973)
This article is not what you ask, but it is an example of a VM beating native:

https://nullprogram.com/blog/2018/05/27/

Java uses the same technique.

Basically, a JIT allows you to skip the overhead of the GOT.

Devirtualization is another case.

I have personally seen Java beating an existing C++ program for the reason I describe, but I cant publish the results here. You have to program carefully or you loose all speed benefits because of pointer chasing. But it is possible.

Re:Why Aren’t More Users More Happy with Our VMs? Part 1 by wolfgke on Thursday September 06, 2018 @11:34AM (#17927001)
> Basically, a JIT allows you to skip the overhead of the GOT.

This is a problem that is GNU/Linux-specific. Windows DLLs are not PIC (position-independent code), so they do not suffer from this problem and don't need a GOT.

See

> https://www.symantec.com/connect/articles/dynamic-linking-li...

for details.

The method that Windows uses is much faster in the average case, but slower in the "bad" case. So GNU/Linux vs Windows have different performance tradeoffs.

Re:Why Aren’t More Users More Happy with Our VMs? Part 1 by hyperman1 on Thursday September 06, 2018 @02:16PM (#17928197)
Yes and no: there is another indirection mechanism at work on windows: All results for imports in the import table are at the beginning of the DLL's data segment. So a call to another DLL first has to fetch the data from there, then do an indirect call. In x86 assembler:

  some_import_address    dd some_import ; will be filled in by dll import
      [... lots of unrelated code and  data...]
      call [some_import_address]
a JIT can read the address from code and do directly:

      call some_import
that's one less memory load.

The benefit is that the dynamic linking does not modify the code segment, so there are less private, modified pages mmapped, thus more sharing and less memory usage.

Re:Why Aren’t More Users More Happy with Our VMs? Part 1 by hyperman1 on Thursday September 06, 2018 @10:31AM (#17926555)
I'll add another one: Inlining across libraries. AFAIK, Even if you statically precompile bytecode on the target system a la dotnet this is not possible as the individual library and executable files are barriers the compiler can't cross.
Re:Why Aren’t More Users More Happy with Our VMs? Part 1 by cm2187 on Thursday September 06, 2018 @05:59AM (#17925064)
But don't static compilers generate checks for the availability of these features and ship both versions? I guess it is rather to take advantage of new features that were not available when the code was compiled.
Re:Why Aren’t More Users More Happy with Our VMs? Part 1 by de_watcher on Thursday September 06, 2018 @08:09AM (#17925626)
In other words "an obfuscated Gentoo".
Re:Why Aren’t More Users More Happy with Our VMs? Part 1 by nickpsecurity on Thursday September 06, 2018 @11:44AM (#17927065)
"There is no way to know that at compile time"

Profile-guided, whole-program optimization can do that for whatever execution patterns the developer feeds them. It will be faster than the JIT's because it has more time to analyze and optimize. The JIT will be better on the exceptional cases the AOT compiler didn't optimize for. In many apps, I'd much rather have the AOT approach than the JIT approach. Heck, some routines in fast path might even get superoptimized if developer wants. :)

Re:Why Aren’t More Users More Happy with Our VMs? Part 1 by magicalhippo on Thursday September 06, 2018 @08:35AM (#17925740)
.Net relies on runtime code generation for generics. This allows .Net to support generic instantiation with a type parameter the compiler hasn't seen at compile-time. Thus I don't need the source code for your generic data structure to use it with my custom types. I can just link in the compiled library.

It also allows the .Net regular expression library to be able to dynamically generate IL-code to match a given regular expression, which is then dynamically loaded into the process and JIT compiled to machine code. Other projects surely use the same facilities to dynamically generate and run specialized code based on user input and/or environment.

Re:Why Aren’t More Users More Happy with Our VMs? Part 1 by pjmlp on Thursday September 06, 2018 @09:51AM (#17926236)
Not when doing AOT compilation.
Re:Why Aren’t More Users More Happy with Our VMs? Part 1 by magicalhippo on Thursday September 06, 2018 @11:53AM (#17927121)
Indeed. The question was why do JIT instead of AOT, and I tried to list some benefits.
Re:Why Aren’t More Users More Happy with Our VMs? Part 1 by pjmlp on Thursday September 06, 2018 @12:41PM (#17927520)
Ah ok, sorry for the pedantic comment then.
Re:Why Aren’t More Users More Happy with Our VMs? Part 1 by magicalhippo on Thursday September 06, 2018 @03:04PM (#17928697)
No worries! I realize I could have been more explicit in my original comment.
Re:Why Aren’t More Users More Happy with Our VMs? Part 1 by pdpi on Thursday September 06, 2018 @08:32AM (#17925724)
> Portability is nice but the reality is that almost no one uses it

That's not true — Everybody actually uses it in practice. The .jar you grab from Maven Central just works unconditionally, your CI server builds one single artefact that runs on your Mac and on the Linux server.

Re:Why Aren’t More Users More Happy with Our VMs? Part 1 by brazzy on Thursday September 06, 2018 @08:09AM (#17925625)
A JIT compiler can optimize based on the runtime behaviour of the code. For example, it can reduce the costs of runtime polymorphism by optimizing virtual method calls as if they were statically bound, and then when a second implementation shows up, deoptimize the code to make it work correctly. Here's an in-dept article about that: https://shipilev.net/blog/2015/black-magic-method-dispatch/
Re:Why Aren’t More Users More Happy with Our VMs? Part 1 by antonvs on Thursday September 06, 2018 @05:20AM (#17924928)
It's not just about portability, but also things like dynamic loading and runtime modification of code, which modern systems rely on quite a lot under the hood.

People often aren't aware of this because the actual mechanisms tend to be hidden inside libraries or tools they depend on.

Re:Why Aren’t More Users More Happy with Our VMs? Part 1 by mbel on Thursday September 06, 2018 @06:29AM (#17925187)
> dynamic loading and runtime modification of code, which modern systems rely on quite a lot under the hood

Can you provide any example? I can't think of any and it sounds very interesting since you seem to be implying that it's common. I assume that "dynamic loading" means something more sophisticated than loading a dynamic library at run-time?

Re:Why Aren’t More Users More Happy with Our VMs? Part 1 by Iem3ohvi on Thursday September 06, 2018 @06:47AM (#17925249)
Dynamically generated code, e.g. proxy classes and aspect pointcuts being inserted into code and then recompiled by the JIT.

And even "just" dynamically loading a library requires recompilation because it will invalidate optimizer assumptions such as devirtualization (part of class hierarchy analysis in hotspot).

Re:Why Aren’t More Users More Happy with Our VMs? Part 1 by tikkabhuna on Thursday September 06, 2018 @06:38AM (#17925226)
Portability is a great feature for us. Our servers are Linux, our desktops are Windows. I can start up the entire Java stack on my PC if I need to debug something. The C++ components have to run on the Linux boxes.

Of course, I could run the applications on the Linux servers and remote debug, but the round trip time for rebooting and getting back to the same breakpoint is longer with more manual interaction.

Re:Why Aren’t More Users More Happy with Our VMs? Part 1 by brazzy on Thursday September 06, 2018 @07:58AM (#17925592)
> Portability is nice but the reality is that almost no one uses it.

Um, no. The reality is that almost everyone uses it. It's extremely common for developers to develop on Windows or Mac and deploy on Linux.

Re:Why Aren’t More Users More Happy with Our VMs? Part 1 by taway_1212 on Thursday September 06, 2018 @10:06AM (#17926358)
> Portability is nice but the reality is that almost no one uses it.

On the contrary - for example, lots of people develop on MacOS and deploy to Linux.