# Execução (computação)

Execução em engenharia da computação e de software é o processo pelo qual um computador ou máquina virtual lê e age sobre as instruções de um programa de computador. Cada instrução de um programa é uma descrição de uma determinada ação que deve ser executada para que um problema específico seja resolvido. A execução envolve seguir repetidamente um ciclo "buscar-decodificar-executar" para cada instrução. À medida que a máquina executora segue as instruções, efeitos específicos são produzidos de acordo com a semântica dessas instruções.
Programas para um computador podem ser executados em um processo em lote sem interação humana ou um usuário pode digitar comandos em uma sessão interativa de um interpretador. Neste caso, os "comandos" são simplesmente instruções de programa, cuja execução é encadeada.
O termo correr (run) é usado quase como sinônimo. Um significado relacionado de "executar" e "correr" refere-se à ação específica de um usuário iniciando (ou lançando ou invocando) um programa, como em "corra o aplicativo, por favor".

## Processo

Antes da execução, um programa deve primeiro ser escrito. Isso geralmente é feito no código-fonte, que é compilado em tempo de compilação (e vinculado estaticamente em tempo de vinculação) para produzir um executável. Esse executável é então invocado, na maioria das vezes por um sistema operacional, que carrega o programa na memória (tempo de carregamento), possivelmente realiza vinculação dinâmica e, em seguida, inicia a execução movendo o controle para o ponto de entrada do programa; todas essas etapas dependem da interface binária de aplicativo do sistema operacional. Neste ponto, a execução começa e o programa entra em tempo de execução. O programa então é executado até terminar, seja um término normal ou uma falha.

## Executável

Código executável, um arquivo executável ou um programa executável, às vezes simplesmente chamado de executável ou binário, é uma lista de instruções e dados para fazer com que um computador "execute tarefas indicadas de acordo com instruções codificadas", diferentemente de um arquivo de dados que deve ser interpretado (analisado) por um programa para ser significativo.
A interpretação exata depende do uso. Tradicionalmente, "instruções" significa instruções de código de máquina para uma unidade de processamento central (CPU) física. Em alguns contextos, um arquivo contendo instruções de script (como bytecode) também pode ser considerado executável.

## Contexto de execução

O contexto em que a execução ocorre é crucial. Muito poucos programas são executados em uma máquina vazia. Os programas geralmente contêm suposições implícitas e explícitas sobre os recursos disponíveis no momento da execução. A maioria dos programas é executada com o suporte de um sistema operacional e bibliotecas de tempo de execução específicas para a linguagem de origem que fornecem serviços cruciais não fornecidos diretamente pelo próprio computador. Esse ambiente de suporte, por exemplo, geralmente dissocia um programa de manipulação direta dos periféricos do computador, fornecendo serviços mais gerais e abstratos.

## Sistema de tempo de execução

Um sistema de tempo de execução, também chamado de ambiente de tempo de execução, implementa principalmente partes de um modelo de execução. Isso não deve ser confundido com a fase do ciclo de vida do tempo de execução de um programa, durante a qual o sistema de tempo de execução está em operação. Ao tratar o sistema de tempo de execução como distinto do ambiente de tempo de execução (RTE), o primeiro pode ser definido como uma parte específica do software de aplicativo (IDE) usado para programação, um software que fornece ao programador um ambiente mais conveniente para executar programas durante sua produção (testes e similares), enquanto o segundo (RTE) seria a própria instância de um modelo de execução sendo aplicado ao programa desenvolvido que é então executado no sistema de tempo de execução mencionado.
A maioria das linguagens de programação tem algum tipo de sistema de tempo de execução que fornece um ambiente no qual os programas são executados. Esse ambiente pode abordar vários problemas, incluindo o gerenciamento de memória do aplicativo, como o programa acessa variáveis, mecanismos para passar parâmetros entre procedimentos, interface com o sistema operacional e outros. O compilador faz suposições dependendo do sistema de tempo de execução específico para gerar o código correto. Normalmente, o sistema de tempo de execução terá alguma responsabilidade pela configuração e gerenciamento da pilha e do heap, e pode incluir recursos como coleta de lixo, threads ou outros recursos dinâmicos incorporados à linguagem.

## Ciclo de instrução

O ciclo de instrução (também conhecido como ciclo de busca-decodificação-execução, ou simplesmente o ciclo de busca-execução) é o ciclo que a unidade de processamento central (CPU) segue desde a inicialização até o desligamento do computador para processar as instruções. É composto por três estágios principais: o estágio de busca, o estágio de decodificação e o estágio de execução.
Nas unidades de processamento central (CPUs) mais simples, o ciclo de instrução é executado sequencialmente, cada instrução sendo processada antes que a próxima seja iniciada. Na maioria das CPUs modernas, os ciclos de instrução são executados simultaneamente, e geralmente em paralelo, por meio de uma pipeline de instruções: a próxima instrução começa a ser processada antes que a instrução anterior termine, o que é possível porque o ciclo é dividido em etapas separadas.

## Interpretador

Um sistema que executa um programa é chamado de interpretador do programa. Falando livremente, um interpretador executa diretamente um programa. Isso difere de um tradutor de linguagens que converte um programa de uma linguagem para outra antes de ser executado.

## Máquina virtual

Uma máquina virtual (VM) é a virtualização/emulação de um sistema de computador. As máquinas virtuais são baseadas em arquiteturas de computadores e fornecem a funcionalidade de um computador físico. Suas implementações podem envolver hardware especializado, software especializado ou uma combinação de ambos.
As máquinas virtuais diferem e são organizadas por suas funções, mostradas aqui:
* As máquinas virtuais de sistema (também chamadas de VMs de virtualização completa) fornecem uma alternativa (substituta) para uma máquina real. Elas fornecem a funcionalidade necessária para executar sistemas operacionais inteiros. Um hipervisor usa a execução nativa para compartilhar e gerenciar hardware, permitindo vários ambientes isolados uns dos outros, mas que existem na mesma máquina física. Os hipervisores modernos usam virtualização assistida por hardware, hardware específico de virtualização, principalmente das unidades de processamento central (CPUs) do host.
* As máquinas virtuais de processo são projetadas para executar programas de computador em um ambiente independente de plataforma.
Alguns emuladores de máquinas virtuais, como o QEMU e emuladores de console de videogame, são projetados para também emular (ou "imitar virtualmente") diferentes arquiteturas de sistema, permitindo assim a execução de aplicativos de software e sistemas operacionais escritos para outra unidade de processamento central (CPU) ou arquitetura. A virtualização em nível de sistema operacional permite que os recursos de um computador sejam particionados por meio do núcleo (kernel). Os termos não são universalmente intercambiáveis.