Fenner
Compilador

"fc --server e fc --client"

Um servidor de compilação que memoiza o resultado de cada pedido: recompilar sem mudança volta em frações de segundo.

O que é e por que existe#

Compilar um programa pequeno leva alguns segundos, quase todos gastos lendo a RTL. Num ciclo "editar, compilar, rodar" (ou num editor que compila a cada salvamento) vale evitar o trabalho repetido. O fc --server fica de pé esperando pedidos; o fc --client os envia. Cada pedido roda um fc filho (estado limpo, resultado idêntico ao da linha de comando) e, quando ele termina sem erro, a resposta fica memoizada pelo arquivo .fxdeps (a lista de arquivos de que a compilação dependeu).

Resultado: um pedido idêntico e sem mudança nos arquivos volta em frações de segundo. Medido aqui, numa máquina ocupada: o primeiro fc --client Defer.fxp levou 71 s; o segundo, idêntico, 1,3 s. O manual fala em ~0,2 s contra ~10 s numa máquina livre.

Uso#

terminal
fc --server [--server-pipe=NOME] [--server-idle=MIN] [--server-nocache]   # fica de pé (ocioso 30 min encerra)
fc --client MeuPrograma.fxp -O0           # usa o servidor; sem servidor, compila normalmente, no próprio processo
fc --server-ping | --server-status | --server-stop     # previstos no manual (veja a nota abaixo)

Os argumentos depois de --client são os de uma compilação comum. Sem servidor no ar, o cliente simplesmente compila como se o --client não existisse: não há risco de ficar sem compilar.

fc --server=stdio serve a integrações: uma linha JSON por pedido em stdin e uma por resposta em stdout:

texto
{"args":["MeuPrograma.fxp","-O0"],"cwd":"C:\\proj","env":[]}
{"rc":0,"out":"...","cache":"hit"}

cache vale hit (veio da memória), miss ou none.

Armadilhas e limites#

  • Não é compilação residente. Recompilar um arquivo alterado custa uma compilação inteira (mais ~0,15 s), porque o System já parseado não é reaproveitado (o compilador tem dezenas de variáveis globais). O ganho é só para o pedido repetido.
  • A memoização não vê um arquivo novo que passe a sombrear outro no SourcePath, nem variáveis de ambiente fora de FC_*/MYCOMPILER_*.
  • Um pedido por vez.
  • Um servidor vivo trava o fc.exe (o Windows não deixa sobrescrever um executável em uso): encerre o servidor antes de atualizar o compilador.
  • Segurança: o pipe é só do dono, mas quem conecta executa fc com qualquer linha de comando como aquele usuário. Não exponha o servidor a outros usuários.
  • --server-ping, --server-status e --server-stop não foram aceitos pelo fc.exe em que estas páginas foram conferidas (Erro: opcao desconhecida do servidor), embora o manual os descreva. O servidor encerra sozinho depois do tempo ocioso (--server-idle=MIN, padrão 30 min); se precisar liberar o fc.exe antes, encerre o processo fc.exe --server pelo gerenciador de tarefas.

Veja também#