“Rodar um programa” passo a passo

Executar código não é mágica: é uma sequência conhecida de eventos — leitura do arquivo, preparação do ambiente, execução instrução por instrução, saída e encerramento. Entender esse fluxo reduz ansiedade diante de erros e termina confusão entre “salvar arquivo” e “programa funcionando”.

Código-fonte vs linguagem de máquina

Você escreve código-fonte em linguagem legível (JavaScript, Python). CPU executa linguagem de máquina (binário). Entre os dois existem tradutores:

  • Interpretador: lê linha a linha e executa (Node/V8 para JS, Python).
  • Compilador: traduz tudo antes e gera executável (C, Rust, Go).
  • Híbrido (JIT): interpreta, otimiza trechos quentes em tempo de execução — V8 faz isso.

JavaScript moderno no Node e no Chrome usa motor JIT — você escreve JS, runtime compila pedaços para código nativo sob demanda.

Diagrama PlantUML

O que acontece ao digitar node hello.js

  1. Terminal pede ao SO criar processo node.
  2. Node lê hello.js do disco para memória.
  3. Parser verifica sintaxe — erro de digitação para aqui com mensagem.
  4. Motor executa top-level: declara variáveis, chama console.log.
  5. console.log escreve no stdout (terminal).
  6. Script termina; processo encerra com código de saída 0 (sucesso) ou ≠0 (falha).
// hello.js
const mensagem = 'Processo iniciado';
console.log(mensagem);
console.log('PID do processo:', process.pid); // Node expõe ID do processo

Rode e observe: cada execução nova pode ter PID diferente — nova instância de processo.

Terminal vs navegador: dois runtimes

ContextoComando / açãoO que executa
Terminalnode script.jsNode.js (sem DOM, tem filesystem)
NavegadorAbrir HTML + scriptMotor JS do browser (tem DOM, sem fs direto)

Mesma linguagem, APIs diferentes. document.querySelector só no browser. require('fs') no Node. Erro “document is not defined” no Node significa código de browser rodando no lugar errado.

Erros antes vs durante execução

  • SyntaxError: parser não entende — programa nem inicia.
  • ReferenceError / TypeError: sintaxe ok, falha em tempo de execução — variável inexistente, tipo errado.
  • Erro de ambiente: arquivo não encontrado, porta ocupada, módulo não instalado.
console.log(x); // ReferenceError: x is not defined — executou, mas x não existe

Mensagem indica fase e linha — habilidade central de depuração (post dedicado na semana 2).

Dependências e node_modules

Programas reais importam bibliotecas. npm install express baixa pacotes para node_modules. Ao rodar, Node resolve import/require procurando nessa árvore. Sem instalar dependência → Cannot find module.

Versionamento de dependências (package.json) garante que colega e servidor executem o mesmo conjunto — assunto avançado, mas saiba que “rodar” inclui ambiente preparado.

Variáveis de ambiente

Config sensível (token API, senha banco) não fica no código — passa por variáveis de ambiente:

PORT=3000 node server.js
const porta = process.env.PORT || 3000;
console.log(`Servidor na porta ${porta}`);

Mesmo código, comportamento diferente conforme ambiente — dev vs produção.

Código de saída e scripts em pipeline

Processos retornam número ao SO: 0 = sucesso. Scripts de deploy e CI encadeiam comandos — se testes falham (exit 1), pipeline para. Você verá isso ao usar GitHub Actions no futuro.

Programa que “não para” vs script one-shot

node hello.js termina rápido. node server.js com servidor HTTP fica rodando — loop de eventos aguardando requisições. Ctrl+C envia sinal ao SO para encerrar processo. Entender diferença evita achar que “travou” quando na verdade está aguardando conexões.

Prática obrigatória deste post

  1. Crie 02-processo.js com três console.log em sequência.
  2. Execute e confirme ordem de saída.
  3. Introduza SyntaxError (parêntese faltando) — leia mensagem.
  4. Corrija e rode de novo até exit code 0.

No próximo post você monta ferramentas (editor, Node, pasta de estudos) com esse modelo mental já claro.

Para aprofundar na web

Para entender melhor este tema, pesquise por:

  • "interpretado vs compilado linguagens diferença" — entender como JS, Python e C/C++ chegam à CPU
  • "como funciona Node.js V8 engine" — saber o que executa seu JavaScript no terminal
  • "exit code processo terminal significado" — ler códigos de saída em scripts e CI
  • "browser vs Node.js diferenças APIs" — evitar rodar código web no Node e vice-versa
  • "variáveis de ambiente Node.js process.env" — configurar apps sem hardcodar segredos

Priorize documentação oficial (MDN, docs do Node.js, Git) e artigos com data recente. Anote o que aprendeu no seu README pessoal.

Atividades

  1. SyntaxError ocorre em qual fase?

    • A) Antes/durante parsing — código mal formado impede execução normal
    • B) Só após deploy em produção
    • C) Apenas no CSS
    • D) Quando RAM enche
    Ver resposta

    Resposta correta: A) Antes/durante parsing — código mal formado impede execução normal

    Erros de sintaxe são detectados ao analisar o código, antes da lógica rodar.

  2. document is not defined ao rodar node app.js indica:

    • A) Código de browser executado no Node
    • B) Falta instalar Git
    • C) CPU incompatível
    • D) Arquivo HTML corrompido
    Ver resposta

    Resposta correta: A) Código de browser executado no Node

    DOM (document) existe no navegador, não no runtime Node padrão.

  3. Exit code 0 significa:

    • A) Erro fatal
    • B) Execução bem-sucedida do ponto de vista do SO
    • C) Programa ainda rodando
    • D) Falta de memória
    Ver resposta

    Resposta correta: B) Execução bem-sucedida do ponto de vista do SO

    Convenção Unix: 0 = sucesso; valores não zero indicam falha.

  4. Liste três diferenças entre executar JS no Node e no navegador.

    Ver resposta

    Exemplos: Node tem fs/path/process; browser tem DOM/window/fetch nativo; entrada/saída via terminal vs tela; módulos npm vs script tag/bundler.