Applications depend on the operation system to provide services.
You might create an application with minimal dependency on the OS. But even if (with some serious Fu, Magic and handwaving) you make it run on "every computer", it's not what we want.
Script and Script-like languages (like Python and Perl as mentioned) go that way: they use minimal features of the OS, and build everything they provide on top of it. That's great for command line applications because all you need (more or less) is reading and writing files and the user console.
Rich applications today need much more services though, they need to "run on the OS" rather than "on the CPU" alone: we expect them to integrate wih the OS, The UI should look native, you want to use the clipboard, the "open file" dialog should provide all the features the other open file dialogs provide.
An environment like Java tries to provide that in a portable way by using a higher level of abstraction: there are windows and widgets and all the beautiful things. But that has some problems of its own:
First, you always have to balance between "Virtualization Platform consistency" (i.e. the application works the same no matter where you run it) and "Host platform consistency" (i.e. the application works like a native application).
You could try to put away completely with the "native stuff" to avoid that problem, but then you aim for the intersection of functionality that all platforms provide. You run on Apple? Do away with the second mouse button. etc. Also your abstraction platform will always limp behind innovations on the host platforms.
The gist of it is that there's no silver bullet: there is always a compromise you have to make. There are different compromises successful at the market.