Para que é necessária a função `purecopy`?


23

Eu estava olhando compile.ele notei essa construção :

(defcustom compile-command (purecopy "make -k ")) 

Os purecopydocumentos afirmam:

purecopy é uma função embutida no `código fonte C '.

(OBJ de purecópia)

Faça uma cópia do objeto OBJ no armazenamento puro. Copia recursivamente o conteúdo de vetores e contras de células. Não copia símbolos. Copia cadeias de caracteres sem propriedades de texto.

Então, acho que entendo por que seria necessário se se esperava que compile-commandcontivesse uma lista complexa que pudesse exigir modificações posteriormente. No entanto, é apenas uma string simples, então por que é purecopynecessário? De maneira mais geral, quando é purecopynecessário?

Respostas:


31

purecopy nunca é necessário na configuração do usuário ou em bibliotecas de terceiros. Na verdade, é um no-op quando chamado de uma instância normal do Emacs. Da Pure Storage :

Esta função não funciona, exceto enquanto o Emacs está sendo construído e despejado ; geralmente é chamado apenas em arquivos Lisp pré-carregados.

Algumas informações básicas a seguir.

Armazenamento Puro

O Emacs tem um processo de construção em duas etapas. Primeiro, ele cria um binário comum e, em seguida, executa esse binário, carrega um conjunto selecionado de bibliotecas internas e despeja uma imagem de memória do processo e cria o emacsbinário real desse despejo.

As razões para esse processo complicado são o melhor desempenho e o menor uso de memória: o pré-carregamento das bibliotecas essenciais do Emacs Lisp permite uma inicialização mais rápida, pois não é necessário mais IO para carregar as bibliotecas integradas e diminui o uso da memória, pois as bibliotecas pré-carregadas pode ser compartilhado entre todas as instâncias do Emacs.

Essa área de memória específica que contém as bibliotecas pré-carregadas é o "armazenamento puro". É somente leitura, portanto, "puro", permitir o compartilhamento de memória acima mencionado. Portanto, purecopyé um não operacional em instâncias normais do Emacs: ele não conseguiu gravar no armazenamento puro de qualquer maneira. Consequentemente, o armazenamento puro também é isento de coleta de lixo.

No entanto, ao criar e despejar a imagem de memória para bibliotecas pré-carregadas, essas bibliotecas podem ser usadas purecopypara "marcar" objetos específicos para alocação em armazenamento puro, geralmente objetos usados ​​com frequência, necessários para toda a vida útil do Emacs.

As strings no armazenamento puro são essencialmente strings constantes estáticas globais. Como "make -k"será usado com freqüência na execução de sessões do Emacs (provavelmente é o comando de compilação mais usado ainda hoje), faz sentido manter essa sequência constante e estática, para evitar realocação desnecessária e coleta de lixo.

Este conceito de armazenamento puro também é a razão por que modificar os .elarquivos de alguns built-in bibliotecas (nomeadamente startup.el, subr.ele outros) não tem efeito: Emacs nunca realmente carrega os arquivos fonte dessas bibliotecas. Em vez disso, ele possui seu código de bytes embutido em seu binário e os carrega de uma área de memória especial.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.