Para dar una idea mas clara de la complejidad, hay que hablar de los sistemas operativos. Actualmente existen (basicamente, en los S.O. mas usados) varios tipos de ficheros ejecutables nativos (es decir, los compilados de C, C++ y otros que no usan una maquina virtual de procesos como Java) estos son ELF (
Executable and Linkable Format), PE (
Portable Executable) y Mach-O (usado por Mac OS X y iOS).
El formato ELF es usado por los sistemas UNIX (excepto Mac OS X) y Unix-Like (como Linux y *BSD) así como otros sistemas operativos menos conocidos.
ELF esta diseñado para soportar al menos 94 plataformas (marcas de procesadores) y solamente la familia de BSD es capas de ejecutar ficheros ELF de algunos procesadores y sistemas operativos distintos de forma nativa y limitada, ya que cada sistema operativo y cada hardware funciona de forma distinta y programar un sistema operativo que se comporte como al menos 10 sistemas operativos distintos es muy complicado. Ahora, esto es en un mismo tipo de fichero.
De hecho, si tomas un ejecutable de Windows compilado en ARM y lo tratas de ejecutar en uno Intel (distinto a ARM) no te aseguro que no funcionara. Intala GNU/Linux en un Intel y trata de ejecutar un ELF compilado en un GNU/Linux SPARC... no ejecuta verdad?
si quieres que tu programa se ejecute tanto en linux como en windows, solo tienes que compilarlo en windows ( asi tienes el programa para windows) y compilarlo en linux (asi tienes el programa para linux)
Ahora, existen maquinas virtuales, emuladores y "capas de compatibilidad" que permiten ejecutar con ciertas limitaciones distintos ficheros ejecutables. Ver Wine
en linux un .out
No, los ejecutables de Linux normalmente no tiene extension.
Como anecdota curiosa:
OS/2 offered excellent compatibility with DOS and Windows 3.1 applications. No, this is not an error. Many application vendors argued that by developing a DOS or Windows app, they would reach the OS/2 market in addition to DOS/Windows markets and they didn't develop native OS/2 applications.