Programas compilados comuns "rodam diretamente" na CPU, mas um programa não roda no vácuo:
-
Muitos programas dependem de bibliotecas externas carregadas dinamicamente (
DLLs
ou.so
libraries). A maneira de vinculá-los é com o compilador / linker, e cada sistema operacional tem padrões diferentes. No entanto, existem também programas "estaticamente vinculados" que fornecem todo o seu próprio código. -
Um sistema operacional moderno não oferece controle total do computador para um programa em execução. Os programas dependem de "chamadas de sistema" para E / S, acesso a hardware e coisas como sinais e entrar em um estado de suspensão. Os serviços e interface disponíveis são definidos pelo sistema operacional. O sistema operacional também controla quais partes do sistema (memória, registros, interrupções) o programa pode usar.
-
Um programa GUI também deve funcionar através do ambiente gráfico do usuário para se desenhar na tela. Mas você provavelmente já pensou sobre isso.
Por esses motivos, os aplicativos independentes do sistema operacional devem contar com uma "máquina virtual" de algum tipo, como a fornecida pelo Java Runtime. Crucialmente, uma VM fornece uma interface padrão para recursos do sistema operacional (E / S, sinais, etc). É claro que java ou python também interpretam "bytecode" em vez de lidar com as peculiaridades do conjunto de instruções da Intel; mas essa é uma história diferente.