Compiling, hmm, one could say is the process of translating a high-level programming language to a low-level-language as understood by machines. High-Lvl languages have many advantages, if you're a human being, such as much better readable than low-lvl language, thus easier to trace bugs, easier to write and so on. All in all, it easens a developers life if he writes his app in a high-lvl language a lot. Now, while compiling, the code is parsed, all dependencies (sth like dictionaries) are fetched, and finally the code is translated back into machine-capable language.
Now there are basically 2 different types of architectures, 32bit and 64bit.
Windows usually ships with 32bit by default (only very few 64bit versions around, due to the need of providing 2 different versions very few 64bit apps for win as well)
This is the one hand side, the other, imho even more important side is the difference between commercial and opensource software in general.
If Microsoft announces a new Windows Version, this Version will have it's final state as soon as it's shipped, except updates and patches of course.
Now the major difference is that OpenSource Software will never reach it's final status. It's more like an ever ongoing development, aiming towards a certain goal, tho never actually achieving this goal. The closer you get to your goal, the further you'll push your goals.
Thus, a patch provided by MS is intended to provide the status Win had when it was released. If you install a WinXP today, it won't defer in its hardware capabilities compared to a 3 year old install if WinXP.
While, a kernelupdate in linux usually provides better support, new features and so on.
So, in total this means:
A Win developer has his base and his intents are to secure, maintain and harden this base. A UNIX developer has a goal, which is hard to define itself, and provides upgrades towards this imaginary goal.
So it's very easy to provide an application for windows, which will be able to run on nearly any installation of windows, independent of the hardware specifications. But, as Linux not only has to handle different archs, but as well different features of each kernel (many user configure their own kernel for instance). So, applications provided have to be translated for each system, which is done by compiling, so that a 32bit CPU can handle an application just as a 64bit CPU can. The source often is the same, but afterwards, translated into different languages. Configurations could be compared to different dialects throughout the same country, here in Germany we have a whole lot of different dialects, but still every german from Hamburg will understand what someone from Bavaria or so tells him. But maybe he has to ask back here and there. A compilation would be as if the bavarian and the hamburger wouldn't talk to each other, but talk to each other by writing it down. This way it's clear and dialects are obsolete.
Got it? A generic pkg will always work, just not as smooth as a custom compiled one.