Yes. Different operating systems have different API's for communication between the program and the kernel. These are always accounted for in compile time by your compiler. In all the *nix systems (except OSX), the API's are identical and never change (additional API's may be added, but existing ones stay the way they are), meaning that in the *nix systems will always be backwards compatible and are rather universal. If it is full POSIX, than any program for it will be completely universal to all of the unix family, except (maybe) OSX; a good example is the Bourne sh shell or vi. The goal of this is programmer friendliness and cross-platform compatability at the software level.
OSX is based in OpenBSD (this is the original unix with slight modifications to keep up with hardware evolution), but for proprietary reasons, (meaning they realized they could make more money by making it difficult for non-apple programs to work on apple computers,) the API has been changed, but it never changes either. In fact, it models the old Apple OS API rather well, too.
And then there is Windows... They firmly belive that consistency and compatibility are the work of satan, and that humaity has wandered from the path of innocence, and it is their duty, as mandated by god himself, to right the wrongs of society and restore peace to the world, (this is the only sensible explaination I have come up with for windows). Thus, the API changes are random, unpredictable, and (get this) can actually vary between different update versions of the same operating system. Window's software guys are just like ,"Fuck it! It's Tuesday and I'm going to just make a new API," and then they do, (Indeed, some software you use may become unusable when you update your operating system.)
When Java was made, Apple OS wasn't a unix, Windows was some weird NT/DOS thing that literally had a line of code in it that made it fail after 90,000 seconds, and the unix family was basically the same at it is now and has always been: compatible with no known software, but runs on everything and it actually works. The goal of java was to create a scripting language that used one API (and instruction set), compiled to a psuedo code, then then cross compiled from that code into the assembly and API of the operating system and processor you were using... mostly in runtime. This in itself isn't that much of a problem... if you ignore windows. As I said before, the *nix family is all the same, and OSX is basically a 1:1 pneumonic of POSIX, but Windows is entirely random. That is what make java problematic. As far as I can tell, it straight up guesses what your API is, and then verifies the result (because you get an OS error if it's wrong.)
Other fun things include: dll's, fork bombing, compile loops, OS privelage shenanigans (mostly windows), and occasional errors (as a complete guess, I would say computers make about three hundred mistakes a second)
OSX is based in OpenBSD (this is the original unix with slight modifications to keep up with hardware evolution), but for proprietary reasons, (meaning they realized they could make more money by making it difficult for non-apple programs to work on apple computers,) the API has been changed, but it never changes either. In fact, it models the old Apple OS API rather well, too.
And then there is Windows... They firmly belive that consistency and compatibility are the work of satan, and that humaity has wandered from the path of innocence, and it is their duty, as mandated by god himself, to right the wrongs of society and restore peace to the world, (this is the only sensible explaination I have come up with for windows). Thus, the API changes are random, unpredictable, and (get this) can actually vary between different update versions of the same operating system. Window's software guys are just like ,"Fuck it! It's Tuesday and I'm going to just make a new API," and then they do, (Indeed, some software you use may become unusable when you update your operating system.)
When Java was made, Apple OS wasn't a unix, Windows was some weird NT/DOS thing that literally had a line of code in it that made it fail after 90,000 seconds, and the unix family was basically the same at it is now and has always been: compatible with no known software, but runs on everything and it actually works. The goal of java was to create a scripting language that used one API (and instruction set), compiled to a psuedo code, then then cross compiled from that code into the assembly and API of the operating system and processor you were using... mostly in runtime. This in itself isn't that much of a problem... if you ignore windows. As I said before, the *nix family is all the same, and OSX is basically a 1:1 pneumonic of POSIX, but Windows is entirely random. That is what make java problematic. As far as I can tell, it straight up guesses what your API is, and then verifies the result (because you get an OS error if it's wrong.)
Other fun things include: dll's, fork bombing, compile loops, OS privelage shenanigans (mostly windows), and occasional errors (as a complete guess, I would say computers make about three hundred mistakes a second)