Do czego jest potrzebna funkcja „purecopy”?

23

Przeglądałem compile.eli zauważyłem tę konstrukcję :

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

Dokumenty purecopymówią:

purecopy to wbudowana funkcja w kodzie źródłowym `C '.

(czysta kopia OBJ)

Wykonaj kopię obiektu OBJ w czystej pamięci. Rekurencyjnie kopiuje zawartość wektorów i komórek przeciw. Nie kopiuje symboli. Kopiuje ciągi bez właściwości tekstu.

Myślę więc, że rozumiem, dlaczego może to być konieczne, jeśli oczekiwano, że compile-commandzawiera złożoną listę, która może wymagać modyfikacji w późniejszym terminie. Jest to jednak zwykły ciąg, więc dlaczego jest purecopypotrzebny? Mówiąc bardziej ogólnie, kiedy jest to purecopypotrzebne?

zdeterminowany
źródło

Odpowiedzi:

31

purecopy nigdy nie potrzebne w konfiguracji użytkownika lub bibliotekach stron trzecich. W rzeczywistości jest to brak możliwości połączenia z normalną instancją Emacsa. Z czystego przechowywania :

Ta funkcja nie działa, z wyjątkiem sytuacji, gdy Emacs jest budowany i zrzucany ; zwykle jest wywoływany tylko we wstępnie załadowanych plikach Lisp.

Poniżej podano niektóre informacje ogólne.

Czyste przechowywanie

Emacs ma dwustopniowy proces kompilacji. Najpierw buduje zwykły plik binarny, a następnie uruchamia ten plik binarny, ładuje wybrany zestaw wbudowanych bibliotek, a następnie zrzuca obraz pamięci procesu i tworzy prawdziwy emacsplik binarny z tego zrzutu.

Powodem tego zawiłego procesu jest lepsza wydajność i mniejsze zużycie pamięci: Wstępne ładowanie niezbędnych bibliotek Emacs Lisp pozwala na szybsze uruchomienie, ponieważ nie jest wymagane dalsze IO do ładowania bibliotek wbudowanych i zmniejsza zużycie pamięci, ponieważ wstępnie załadowane biblioteki mogą być współużytkowane przez wszystkie instancje Emacsa.

Ten szczególny obszar pamięci, który zawiera wstępnie załadowane biblioteki, to „czysta pamięć”. To tylko do odczytu, stąd „czyste”, aby umożliwić wspomniane współużytkowanie pamięci. Stąd purecopybrak możliwości w normalnych instancjach Emacsa: i tak nie można zapisać w czystej pamięci. W związku z tym czyste przechowywanie jest również zwolnione z wyrzucania elementów bezużytecznych.

Jednak podczas tworzenia i zrzucania obrazu pamięci dla wstępnie załadowanych bibliotek, biblioteki te mogą używać purecopydo „oznaczania” określonych obiektów do alokacji w czystej pamięci, zwykle często używanych obiektów, które są potrzebne przez cały okres życia Emacsa.

Ciągi w czystym magazynie są zasadniczo ciągami globalnymi stałymi statycznymi. Ponieważ "make -k"będzie często używany podczas uruchamiania sesji Emacsa (prawdopodobnie jest to najczęściej używane polecenie kompilacji, nawet dzisiaj), sensowne jest utrzymywanie tego łańcucha na stałym poziomie, aby uniknąć niepotrzebnego ponownego przydzielania i wyrzucania elementów bezużytecznych.

Ta koncepcja czystej pamięci jest również powód, modyfikując .elpliki niektórych wbudowanych bibliotek (w szczególności startup.el, subr.eli inne) nie ma wpływu: Emacs nigdy nie ładuje pliki źródłowe tych bibliotek. Zamiast tego ma wbudowany kod binarny w swoim pliku binarnym i ładuje je ze specjalnego obszaru pamięci.

księżycowy
źródło