Biblioteca (computação)

Ilustração de um aplicativo que usa libvorbisfile para reproduzir um arquivo Ogg Vorbis

Na ciência da computação , uma biblioteca é uma coleção de recursos somente leitura que é aproveitada durante o desenvolvimento de software para implementar um programa de computador .

Historicamente, uma biblioteca consistia em subrotinas (geralmente chamadas de funções hoje). O conceito agora inclui outras formas de código executável , incluindo classes e dados não executáveis, incluindo imagens e texto . Também pode se referir a uma coleção de código-fonte .

Por exemplo, um programa pode usar uma biblioteca para fazer chamadas de sistema indiretamente , em vez de fazer essas chamadas de sistema diretamente no programa.

Características

Em geral

Uma biblioteca pode ser usada por múltiplos consumidores independentes (programas e outras bibliotecas). Isso difere de recursos definidos em um programa que geralmente só podem ser usados ​​por aquele programa.

Quando um consumidor usa um recurso de biblioteca, ele ganha o valor da biblioteca sem ter que implementá-lo ele mesmo. Bibliotecas incentivam a reutilização de código de forma modular .

Ao escrever um código que usa uma biblioteca, um programador só precisa saber informações de alto nível, como quais itens ela contém e como usar os itens – não todos os detalhes internos da biblioteca.

Bibliotecas podem usar outras bibliotecas, resultando em uma hierarquia de bibliotecas em um programa.

Executável

Uma biblioteca de código executável tem uma interface bem definida pela qual a funcionalidade é invocada. Por exemplo, em C , uma função de biblioteca é invocada por meio da capacidade de chamada de função normal de C. O vinculador gera código para chamar uma função por meio do mecanismo de biblioteca se a função estiver disponível em uma biblioteca em vez do próprio programa. [1]

As funções de uma biblioteca podem ser conectadas ao programa invocador em diferentes fases do ciclo de vida do programa . Se o código da biblioteca for acessado durante a construção do programa invocador, então a biblioteca é chamada de biblioteca estática . [2] Uma alternativa é construir o executável do programa para ser separado do arquivo da biblioteca. As funções da biblioteca são conectadas após o executável ser iniciado, seja no tempo de carregamento ou no tempo de execução . Neste caso, a biblioteca é chamada de biblioteca dinâmica .

A maioria das linguagens compiladas tem uma biblioteca padrão , embora os programadores também possam criar suas próprias bibliotecas personalizadas. A maioria dos sistemas de software modernos fornece bibliotecas que implementam a maioria dos serviços do sistema. Essas bibliotecas organizaram os serviços que um aplicativo moderno requer. Como tal, a maioria dos códigos usados ​​por aplicativos modernos é fornecida nessas bibliotecas do sistema.

História

A ideia de uma biblioteca de computadores remonta aos primeiros computadores criados por Charles Babbage . Um artigo de 1888 sobre sua Máquina Analítica sugeriu que as operações do computador poderiam ser perfuradas em cartões separados da entrada numérica. Se esses cartões perfurados de operação fossem salvos para reutilização, então "gradualmente a máquina teria uma biblioteca própria". [3]

Uma mulher trabalhando ao lado de um arquivo contendo a biblioteca de sub-rotinas em rolos de fita perfurada para o computador EDSAC.

Em 1947, Goldstine e von Neumann especularam que seria útil criar uma "biblioteca" de sub-rotinas para seu trabalho na máquina IAS , um computador antigo que ainda não estava operacional naquela época. [4] Eles imaginaram uma biblioteca física de gravações de fios magnéticos , com cada fio armazenando código de computador reutilizável. [5]

Inspirados por von Neumann, Wilkes e sua equipe construíram o EDSAC . Um arquivo de fita perfurada continha a biblioteca de sub-rotinas para este computador. [6] Os programas para o EDSAC consistiam em um programa principal e uma sequência de sub-rotinas copiadas da biblioteca de sub-rotinas. [7] Em 1951, a equipe publicou o primeiro livro-texto sobre programação, The Preparation of Programs for an Electronic Digital Computer , que detalhava a criação e o propósito da biblioteca. [8]

O COBOL incluiu "capacidades primitivas para um sistema de biblioteca" em 1959, [9] mas Jean Sammet descreveu-as como "instalações de biblioteca inadequadas" em retrospecto. [10]

O JOVIAL tem um Pool de Comunicação (COMPOOL), basicamente uma biblioteca de arquivos de cabeçalho.

Outro grande contribuidor para o conceito de biblioteca moderna veio na forma da inovação de subprograma do FORTRAN . Os subprogramas do FORTRAN podem ser compilados independentemente uns dos outros, mas o compilador não tinha um vinculador . Então, antes da introdução de módulos no Fortran-90, a verificação de tipo entre subprogramas do FORTRAN [NB 1] era impossível. [11]

Em meados da década de 1960, bibliotecas de cópia e macro para assemblers eram comuns. Começando com a popularidade do IBM System/360 , bibliotecas contendo outros tipos de elementos de texto, por exemplo, parâmetros de sistema, também se tornaram comuns.

No OS/360 da IBM e seus sucessores, isso é chamado de conjunto de dados particionados .

A primeira linguagem de programação orientada a objetos , Simula , desenvolvida em 1965, suportava a adição de classes a bibliotecas por meio de seu compilador. [12] [13]

Ligação

Bibliotecas são importantes no processo de vinculação ou ligação de programas , que resolve referências conhecidas como links ou símbolos para módulos de biblioteca. O processo de vinculação geralmente é feito automaticamente por um programa vinculador ou vinculador que pesquisa um conjunto de bibliotecas e outros módulos em uma determinada ordem. Normalmente, não é considerado um erro se um alvo de link puder ser encontrado várias vezes em um determinado conjunto de bibliotecas. A vinculação pode ser feita quando um arquivo executável é criado (vinculação estática) ou sempre que o programa é usado em tempo de execução (vinculação dinâmica).

As referências que estão sendo resolvidas podem ser endereços para saltos e outras chamadas de rotina. Elas podem estar no programa principal ou em um módulo dependendo de outro. Elas são resolvidas em endereços fixos ou realocáveis ​​(de uma base comum) alocando memória de tempo de execução para os segmentos de memória de cada módulo referenciado.

Algumas linguagens de programação usam um recurso chamado smart linking , pelo qual o vinculador está ciente ou integrado ao compilador, de modo que o vinculador sabe como referências externas são usadas, e o código em uma biblioteca que nunca é realmente usado , mesmo que referenciado internamente, pode ser descartado do aplicativo compilado. Por exemplo, um programa que usa apenas inteiros para aritmética, ou não faz nenhuma operação aritmética, pode excluir rotinas de biblioteca de ponto flutuante. Esse recurso de smart linking pode levar a tamanhos menores de arquivo de aplicativo e uso reduzido de memória.

Realocação

Algumas referências em um programa ou módulo de biblioteca são armazenadas em um formato relativo ou simbólico que não pode ser resolvido até que todos os códigos e bibliotecas sejam atribuídos a endereços estáticos finais. A realocação é o processo de ajuste dessas referências, e é feito pelo vinculador ou pelo carregador . Em geral, a realocação não pode ser feita para bibliotecas individuais porque os endereços na memória podem variar dependendo do programa que as usa e de outras bibliotecas com as quais elas são combinadas. O código independente de posição evita referências a endereços absolutos e, portanto, não requer realocação.

Bibliotecas estáticas

Quando a vinculação é realizada durante a criação de um executável ou outro arquivo objeto, ela é conhecida como vinculação estática ou vinculação inicial . Nesse caso, a vinculação geralmente é feita por um vinculador , mas também pode ser feita pelo compilador . [14] Uma biblioteca estática , também conhecida como arquivo , é aquela que se destina a ser vinculada estaticamente. Originalmente, existiam apenas bibliotecas estáticas. A vinculação estática deve ser realizada quando quaisquer módulos são recompilados.

Todos os módulos requeridos por um programa são algumas vezes vinculados estaticamente e copiados para o arquivo executável. Este processo, e o arquivo autônomo resultante, são conhecidos como uma construção estática do programa. Uma construção estática pode não precisar de nenhuma realocação adicional se a memória virtual for usada e nenhuma randomização do layout do espaço de endereço for desejada. [15]

Bibliotecas compartilhadas

Uma biblioteca compartilhada ou objeto compartilhado é um arquivo que se destina a ser compartilhado por arquivos executáveis ​​e outros arquivos de objeto compartilhado . Módulos usados ​​por um programa são carregados de objetos compartilhados individuais para a memória no tempo de carregamento ou tempo de execução , em vez de serem copiados por um vinculador quando ele cria um único arquivo executável monolítico para o programa.

Bibliotecas compartilhadas podem ser vinculadas estaticamente durante o tempo de compilação, o que significa que referências aos módulos da biblioteca são resolvidas e os módulos recebem memória alocada quando o arquivo executável é criado. [ citação necessária ] Mas frequentemente a vinculação de bibliotecas compartilhadas é adiada até que sejam carregadas. [ duvidosodiscutir ]

Bibliotecas de objetos

Embora tenha sido pioneira na década de 1960, a vinculação dinâmica não chegou aos sistemas operacionais mais comumente usados ​​até o final da década de 1980. Ela estava geralmente disponível de alguma forma na maioria dos sistemas operacionais no início da década de 1990. Durante esse mesmo período, a programação orientada a objetos (POO) estava se tornando uma parte significativa do cenário de programação. POO com vinculação de tempo de execução requer informações adicionais que as bibliotecas tradicionais não fornecem. Além dos nomes e pontos de entrada do código localizado dentro, eles também exigem uma lista dos objetos dos quais dependem. Este é um efeito colateral de um dos principais conceitos da POO, herança, o que significa que partes da definição completa de qualquer método podem estar em lugares diferentes. Isso é mais do que simplesmente listar que uma biblioteca requer os serviços de outra: em um verdadeiro sistema POO, as próprias bibliotecas podem não ser conhecidas no momento da compilação e variam de sistema para sistema.

Ao mesmo tempo, muitos desenvolvedores trabalharam na ideia de programas multicamadas, nos quais um "display" rodando em um computador de mesa usaria os serviços de um mainframe ou minicomputador para armazenamento ou processamento de dados. Por exemplo, um programa em um computador baseado em GUI enviaria mensagens para um minicomputador para retornar pequenas amostras de um enorme conjunto de dados para exibição. Chamadas de procedimento remoto (RPC) já lidavam com essas tarefas, mas não havia um sistema RPC padrão.

Logo, a maioria dos fornecedores de minicomputadores e mainframes instigaram projetos para combinar os dois, produzindo um formato de biblioteca OOP que poderia ser usado em qualquer lugar. Tais sistemas eram conhecidos como bibliotecas de objetos , ou objetos distribuídos , se suportassem acesso remoto (nem todos suportavam). O COM da Microsoft é um exemplo de tal sistema para uso local. O DCOM, uma versão modificada do COM, suporta acesso remoto.

Por algum tempo, as bibliotecas de objetos mantiveram o status de "próxima grande novidade" no mundo da programação. Houve uma série de esforços para criar sistemas que rodassem em várias plataformas, e as empresas competiam para tentar prender os desenvolvedores em seus próprios sistemas. Exemplos incluem o System Object Model (SOM/DSOM) da IBM , o Distributed Objects Everywhere (DOE) da Sun Microsystems , o Portable Distributed Objects (PDO) da NeXT , o ObjectBroker da Digital , o Component Object Model (COM/DCOM) da Microsoft e qualquer número de sistemas baseados em CORBA .

Bibliotecas de classe

Bibliotecas de classes são o equivalente OOP aproximado de tipos mais antigos de bibliotecas de código. Elas contêm classes , que descrevem características e definem ações ( métodos ) que envolvem objetos. Bibliotecas de classes são usadas para criar instâncias , ou objetos com suas características definidas para valores específicos. Em algumas linguagens OOP, como Java , a distinção é clara, com as classes frequentemente contidas em arquivos de biblioteca (como o formato de arquivo JAR do Java ) e os objetos instanciados residindo apenas na memória (embora potencialmente capazes de se tornarem persistentes em arquivos separados). Em outras, como Smalltalk , as bibliotecas de classes são meramente o ponto de partida para uma imagem do sistema que inclui todo o estado do ambiente, classes e todos os objetos instanciados.

Hoje, a maioria das bibliotecas de classe são armazenadas em um repositório de pacotes (como o Maven Central para Java). O código do cliente declara explicitamente as dependências para bibliotecas externas em arquivos de configuração de build (como um Maven Pom em Java).

Bibliotecas remotas

Outra técnica de biblioteca usa executáveis ​​completamente separados (frequentemente em alguma forma leve) e os chama usando uma chamada de procedimento remoto (RPC) por uma rede para outro computador. Isso maximiza a reutilização do sistema operacional: o código necessário para dar suporte à biblioteca é o mesmo código que está sendo usado para fornecer suporte e segurança de aplicativo para todos os outros programas. Além disso, esses sistemas não exigem que a biblioteca exista na mesma máquina, mas podem encaminhar as solicitações pela rede.

No entanto, tal abordagem significa que cada chamada de biblioteca requer uma quantidade considerável de overhead. Chamadas RPC são muito mais caras do que chamar uma biblioteca compartilhada que já foi carregada na mesma máquina. Esta abordagem é comumente usada em uma arquitetura distribuída que faz uso pesado de tais chamadas remotas, notavelmente sistemas cliente-servidor e servidores de aplicativos como Enterprise JavaBeans .

Bibliotecas de geração de código

Bibliotecas de geração de código são APIs de alto nível que podem gerar ou transformar código de bytes para Java . Elas são usadas por programação orientada a aspectos , algumas estruturas de acesso a dados e para testes para gerar objetos proxy dinâmicos. Elas também são usadas para interceptar acesso de campo. [16]

Nomeação de arquivo

A maioria dos sistemas modernos do tipo Unix

O sistema armazena libfoo.ae libfoo.soarquiva em diretórios como /lib, /usr/libou /usr/local/lib. Os nomes de arquivo sempre começam com lib, e terminam com um sufixo de .a( archive , static library) ou de .so(shared object, dynamically linked library). Alguns sistemas podem ter vários nomes para uma biblioteca dinamicamente vinculada. Esses nomes geralmente compartilham o mesmo prefixo e têm sufixos diferentes indicando o número da versão. A maioria dos nomes são nomes para links simbólicos para a versão mais recente. Por exemplo, em alguns sistemas libfoo.so.2seria o nome do arquivo para a segunda revisão de interface principal da biblioteca dinamicamente vinculada libfoo. Os .laarquivos às vezes encontrados nos diretórios da biblioteca são arquivos libtool , não utilizáveis ​​pelo sistema como tal.

Mac OS

O sistema herda convenções de biblioteca estática do BSD , com a biblioteca armazenada em um .aarquivo, e pode usar .sobibliotecas dinamicamente vinculadas no estilo - (com o .dylibsufixo em vez disso). A maioria das bibliotecas no macOS, no entanto, consiste em "frameworks", colocadas dentro de diretórios especiais chamados " bundles " que envolvem os arquivos e metadados necessários da biblioteca. Por exemplo, um framework chamado MyFrameworkseria implementado em um bundle chamado MyFramework.framework, MyFramework.framework/MyFrameworksendo o arquivo de biblioteca dinamicamente vinculada ou sendo um link simbólico para o arquivo de biblioteca dinamicamente vinculada em MyFramework.framework/Versions/Current/MyFramework.

Microsoft Windows

Bibliotecas de vínculo dinâmico geralmente têm o sufixo *.DLL, [17] embora outras extensões de nome de arquivo possam identificar bibliotecas vinculadas dinamicamente para propósitos específicos, por exemplo, *.OCXpara bibliotecas OLE . As revisões de interface são codificadas nos nomes de arquivo ou abstraídas usando interfaces de objeto COM . Dependendo de como são compilados, *.LIBos arquivos podem ser bibliotecas estáticas ou representações de bibliotecas dinamicamente vinculáveis ​​necessárias apenas durante a compilação, conhecidas como " bibliotecas de importação ". Ao contrário do mundo UNIX , que usa extensões de arquivo diferentes, ao vincular .LIBum arquivo no Windows, é preciso primeiro saber se é uma biblioteca estática regular ou uma biblioteca de importação. No último caso, um .DLLarquivo deve estar presente no tempo de execução.

Veja também

Notas

  1. ^ Era possível antes, por exemplo, entre subprogramas Ada.

Referências

  1. ^ Deshpande, Prasad (2013). Detecção metamórfica usando análise de gráfico de chamada de função (tese). Biblioteca da Universidade Estadual de San Jose. doi : 10.31979/etd.t9xm-ahsc .
  2. ^ "Static Libraries". TLDP. Arquivado do original em 2013-07-03 . Recuperado em 2013-10-03 .
  3. ^ Babbage, HP (1888-09-12). "The Analytical Engine". Anais da Associação Britânica . Banho.
  4. ^ Goldstine, Herman H. (2008-12-31). O computador de Pascal a von Neumann. Princeton: Princeton University Press. doi :10.1515/9781400820139. ISBN 978-1-4008-2013-9.
  5. ^ Goldstine, Herman ; von Neumann, John (1947). Planejamento e codificação de problemas para um instrumento de computação eletrônica (Relatório). Institute for Advanced Study. pp. 3, 21–22. OCLC  26239859. provavelmente será muito importante desenvolver uma "biblioteca" extensa de sub-rotinas
  6. ^ Wilkes, MV (1951). "O Computador EDSAC". 1951 Workshop Internacional sobre Gerenciamento de Conhecimento de Requisitos . 1951 Workshop Internacional sobre Gerenciamento de Conhecimento de Requisitos. IEEE. pág. 79. doi :10.1109/afips.1951.13.
  7. ^ Campbell-Kelly, Martin (setembro de 2011). "Em louvor a 'Wilkes, Wheeler e Gill'". Comunicações da ACM . 54 (9): 25–27. doi :10.1145/1995376.1995386. S2CID  20261972.
  8. ^ Wilkes, Maurice ; Wheeler, David ; Gill, Stanley (1951). A preparação de programas para um computador digital eletrônico. Addison-Wesley. pp. 45, 80–91, 100. OCLC  641145988.
  9. ^ Wexelblat, Richard (1981). História das Linguagens de Programação. Série de Monografias da ACM. Nova York, NY: Academic Press (Uma subsidiária da Harcourt Brace ). p. 274. ISBN 0-12-745040-8.
  10. ^ Wexelblat, op. cit. , pág. 258
  11. ^ Wilson, Leslie B.; Clark, Robert G. (1988). Linguagens de programação comparativa . Wokingham, Inglaterra: Addison-Wesley. pág. 126. ISBN 0-201-18483-4.
  12. ^ Wilson e Clark, op. cit. , pág. 52
  13. ^ Wexelblat, op. cit. , pág. 716
  14. ^ Kaminsky, Dan (2008). "Capítulo 3 - Formatos de executáveis ​​portáteis e executáveis ​​e de vinculação". Engenharia reversa de código com IDA Pro . Elsevier. pp. 37–66. doi :10.1016/b978-1-59749-237-9.00003-x. ISBN 978-1-59749-237-9. Recuperado em 27/05/2021 .
  15. ^ Collberg, Christian; Hartman, John H.; Babu, Sridivya; Udupa, Sharath K. (2003). SLINKY: Static Linking Reloaded. USENIX '05. Departamento de Ciência da Computação, Universidade do Arizona . Arquivado do original em 2016-03-23 . Recuperado em 2016-03-17 .
  16. ^ "Code Generation Library". Source Forge . Arquivado do original em 2010-01-12 . Recuperado em 2010-03-03 . Byte Code Generation Library é uma API de alto nível para gerar e transformar bytecode JAVA. É usada por AOP, testes, frameworks de acesso a dados para gerar objetos proxy dinâmicos e interceptar acesso a campos.
  17. ^ Bresnahan, Christine; Blum, Richard (2015-04-27). Guia de estudo para certificação do LPIC-1 Linux Professional Institute: Exame 101-400 e Exame 102-400. John Wiley & Sons (publicado em 2015). pág. 82. ISBN  9781119021186. Arquivado do original em 2015-09-24 . Recuperado em 2015-09-03 . Bibliotecas compartilhadas do Linux são semelhantes às bibliotecas de vínculo dinâmico (DLLs) do Windows. DLLs do Windows são geralmente identificadas por .dllextensões de nome de arquivo.

Leitura adicional

  • Levine, John R. (2000) [outubro de 1999]. "Capítulo 9: Bibliotecas compartilhadas e Capítulo 10: Links dinâmicos e carregamento". Linkers e carregadores. The Morgan Kaufmann Series in Software Engineering and Programming (1 ed.). São Francisco, EUA: Morgan Kaufmann . ISBN 1-55860-496-0. OCLC  42413382. Arquivado do original em 2012-12-05 . Recuperado em 2020-01-12 .Código: [1][2] Errata: [3]
  • Artigo Guia para iniciantes em Linkers por David Drysdale
  • Artigo Inicialização mais rápida de programas C++ por meio da melhoria da eficiência de vinculação em tempo de execução por Léon Bottou e John Ryland
  • Como criar bibliotecas de programas por Baris Simsek
  • BFD - Biblioteca de Descritores de Arquivos Binários
  • 1º Workshop de Design de Software Centrado em Bibliotecas LCSD'05 Arquivado em 2019-08-28 no Wayback Machine em OOPSLA'05
  • 2º Workshop de Design de Software Centrado em Bibliotecas LCSD'06 na OOPSLA'06
  • Como criar uma biblioteca compartilhada por Ulrich Drepper (com muitas informações básicas)
  • Anatomia das bibliotecas dinâmicas do Linux em IBM.com
Obtido em "https://pt.wikipedia.org/w/index.php?title=Biblioteca_(computação)&oldid=1245613058"