Кодирование CDR: сжатое представление списков Lisp
CDR coding
CDR-кодирование: сжатое представление списков Lisp, разработанное MIT. Экономит память, улучшает производительность за счет оптимизации ссылок на данные.
Сравнивайте с английским: нажмите на абзац — оригинал откроется в окне. Кнопка EN под абзацем показывает его прямо в тексте.
Введение
В информатике CDR-кодирование — это сжатое представление данных для связанных списков Lisp. Оно было разработано и запатентовано Лабораторией искусственного интеллекта MIT и реализовано в компьютерном оборудовании в ряде машин Lisp, основанных на MIT CADR. CDR-кодирование, по сути, является довольно общей идеей: когда объект данных A заканчивается ссылкой на другую структуру данных B, вместо ссылки можно поместить непосредственно саму структуру B, перекрывая конец A. Это освобождает место, необходимое для ссылки, что может быть значительным при многократном применении, а также улучшает локальность данных, повышая производительность на современных машинах. Преобразование особенно эффективно для списков, созданных на основе cons; оно позволяет освободить около половины пространства для каждого узла, к которому применяется. Выполнить такую замену не всегда возможно, так как за концом A может не быть достаточного количества свободного места. Таким образом, некоторые объекты заканчиваются реальной ссылкой, а другие — непосредственно ссылаемым объектом, и аппаратное обеспечение должно определять, какой из вариантов используется, считывая последнюю ячейку. Это можно реализовать в программном обеспечении с некоторой потерей эффективности, используя тегированные указатели, которые позволяют пометить указатель в конечной позиции как таковой, но оптимально это делать на аппаратном уровне. При наличии изменяемых объектов CDR-кодирование становится сложнее. Если ссылка обновляется для указания на другой объект, а в текущем поле хранится объект, этот объект необходимо переместить вместе со всеми другими указателями на него. Такие перемещения не только обычно дороги или невозможны, но и со временем приводят к фрагментации памяти. Обычно этой проблемы избегают, используя CDR-кодирование только для неизменяемых структур данных.
In computer science CDR coding is a compressed data representation for Lisp linked lists. It was developed and patented by the MIT Artificial Intelligence Laboratory, and implemented in computer hardware in a number of Lisp machines derived from the MIT CADR. CDR coding is in fact a fairly general idea; whenever a data object A ends in a reference to another data structure B, we can instead place the structure B itself there, overlapping and running off the end of A. By doing this we free the space required by the reference, which can add up if done many times, and also improve locality of reference, enhancing performance on modern machines. The transformation is especially effective for the cons based lists it was created for; we free about half of the space for each node we perform this transformation on. It is not always possible to perform this substitution, because there might not be a large enough chunk of free space beyond the end of A. Thus, some objects will end in a real reference, and some with the referenced object, and the machine must be able to tell by reading the final cell which one it is. This can be accomplished with some inefficiency in software by the use of tagged pointers, which allow a pointer in a final position to be specifically tagged as such, but is best done in hardware. In the presence of mutable objects, CDR coding becomes more complex. If a reference is updated to point to another object, but currently has an object stored in that field, the object must be relocated, along with any other pointers to it. Not only are such moves typically expensive or impossible, but over time they cause fragmentation of the store. This problem is typically avoided by using CDR coding only on immutable data structures.