O que são links dinâmicos e estáticos?

1

Eu ouço os termos "Vinculados dinamicamente" e "Vinculados estatisticamente" em relação a embalagem, e nunca fui claro sobre o que esses termos realmente significam.

O que são links dinâmicos e estáticos?

    
por Akiva 29.07.2015 / 08:16

1 resposta

2

Esta pergunta deve ser dividida em dois: "O que são links dinâmicos e estáticos?" e "Como o Click resolve problemas de dependência?". Os dois não estão relacionados. Aqui vou tentar responder a primeira pergunta.

O que são links dinâmicos e estáticos?

O código-fonte de qualquer programa de software faz uso de funções externas. Funções externas residem em bibliotecas. Ao compilar o programa em código de máquina *, as referências externas devem, de alguma forma, estar ligadas às suas definições, ou seja, à sua implementação no código de máquina. Existem duas abordagens para fazer isso. Ou (a) o código de implementação é "puxado" das bibliotecas e adicionado ao binário resultante, ou (b) as referências são deixadas pendentes e serão "apontadas" para sua implementação em tempo de execução . Nós chamamos (a) vinculação estática e (b) vinculação dinâmica.

Como em qualquer decisão de engenharia, nenhuma alternativa é melhor que a outra. A vinculação estática tem a vantagem de não criar uma dependência no ambiente de tempo de execução e, portanto, produz binários mais previsíveis. Isso ocorre ao custo da duplicação de código e, portanto, do consumo de disco, rede e memória. A vinculação dinâmica permite compartilhar o código da biblioteca em tempo de execução. Ele também permite a atualização de bibliotecas, por exemplo, quando um bug é encontrado, sem a necessidade de recompilar os binários que os utilizam. Todos os dependentes são corrigidos automaticamente. Obviamente, eles também são quebrados automaticamente, pelos bugs e incompatibilidades que a nova versão introduz.

Deixando de lado os prós e contras, a vinculação dinâmica produz inerentemente um sistema mais complexo. Existem mais partes móveis e, especialmente, existem dependências entre as partes móveis **. A questão então é como administrar essa complexidade. Por exemplo, como ter duas versões de um aplicativo no sistema, cada uma exigindo suas próprias dependências, dentre as quais pode haver duas versões secundárias diferentes de uma biblioteca. Como os nomes de arquivos dessas bibliotecas colidem, isso não é possível no Ubuntu.

Pode-se dizer que todo sistema de empacotamento, além de simplificar a instalação de software, é uma tentativa de resolver problemas de dependência e de versão, enquanto aproveita os benefícios de ter dependências dinâmicas. O sistema de pacotes Debian no momento em que surgiu foi muito melhor em fazer isso do que os existentes. Desde então, muitas outras soluções surgiram. Uma abordagem notavelmente completa é tomada pelo GNU Guix e seu Gerenciador de pacotes do Guix . Clique é outro.

*) Assumimos um programa compilado para código de máquina, não um que será interpretado ou compilado em um idioma intermediário (por exemplo, Python, Java). Em um nível abstrato, esses idiomas sofrem os mesmos problemas de resolução dinâmica ( ClassNotFoundException em Java), mas incluí-los aqui seria apenas confundir a explicação.

**) Observe que, se você mantiver binários vinculados estaticamente, não haverá interdependências de tempo de execução. Ou seja, sem dependências da biblioteca , existem outros tipos.

    
por zwets 30.07.2015 / 13:55