"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#
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:
{"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
Systemjá 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 deFC_*/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
fccom qualquer linha de comando como aquele usuário. Não exponha o servidor a outros usuários. --server-ping,--server-statuse--server-stopnão foram aceitos pelofc.exeem 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 ofc.exeantes, encerre o processofc.exe --serverpelo gerenciador de tarefas.
Veja também#
- Linha de comando, fc --lsp, que por baixo também paga a leitura da RTL a cada análise.