CAR и CDR - CAR and CDR

В компьютерное программирование, МАШИНА (машина) /kɑːr/ (Об этом звукеСлушать) и CDR (CDR) (/ˈkʌdər/ (Об этом звукеСлушать) или /ˈkʊdər/ (Об этом звукеСлушать)) - примитивные операции над минусы клетки (или "неатомные S-выражения ") введены в Язык программирования Лисп. Консольная ячейка состоит из двух указатели; то машина операция извлекает первый указатель, а CDR операция извлекает второй.

Таким образом, выражение (машина (минусы Икс у)) оценивает Икс, и (cdr (минусы Икс у)) оценивает у.

Когда cons-ячейки используются для реализации односвязные списки (скорее, чем деревья и другие более сложные структуры ), машина операция возвращает первый элемент списка, а CDR возвращает остальные списка. По этой причине операциям иногда дают названия первый и остальные или голова и хвост.

Этимология

Изначально Лисп был реализован на IBM 704 компьютер, в конце 1950-х.

Популярное объяснение, что МАШИНА и CDR обозначают «Содержимое адресного регистра» и «Содержимое декрементного регистра»[1] не совсем соответствует архитектуре IBM 704; IBM 704 не имеет доступного программисту адресного регистра, и три регистра изменения адреса называются IBM "индексными регистрами".

704 и его преемники имеют 36-битный слово длина и 15-битный адресное пространство. На этих компьютерах было два инструкция форматы, один из которых, Тип A, имел короткий, 3-битный, код операции префикс и два 15-битных поля разделены 3-битным тегом. Первое 15-битовое поле было адресом операнда, а второе содержало декремент или счетчик. В теге указан один из трех индексные регистры. Индексирование на 704 было вычитающим процессом, поэтому значение, загружаемое в индексный регистр, называлось «декрементом».[2]:п. 8 Аппаратное обеспечение 704 имело специальные инструкции для доступа к полям адреса и декремента одним словом.[2]:п. 26 В результате было эффективно использовать эти два поля для хранения в одном слове двух указателей, необходимых для списка.[3]:Вступление.

Таким образом, «CAR» - это «Содержание адреса. часть Регистра ». Термин« регистр »в этом контексте относится к« ячейке памяти ».[4][5]

Прекурсоры[6][7] в Лисп включены функции:

  • машина («содержимое адресной части номера регистра»),
  • CDR («содержимое декрементной части номера регистра»),
  • cpr («содержимое префиксной части номера регистра»), и
  • ctr ("содержимое теговой части номера регистра"),

каждый из которых принимает в качестве аргумента машинный адрес, загружает соответствующее слово из памяти и извлекает соответствующие биты.

704 макроса

Макрос ассемблера 704 для машина был:[8][9][10]

LXD JLOC 4  # C (уменьшение JLOC) → C (C) # Загружает уменьшение местоположения JLOC в индексный регистр CCLA 0,4     # C (0 - C (C)) → C (AC) # Регистр AC получает начальный адрес спискаPAX 0,4     # C (Адрес AC) → C (C) # Загружает адрес AC в индексный регистр CPXD 0,4     # C (C) → C (Уменьшение AC) # Очищает AC и загружает индексный регистр C в Decrement AC

Макрос ассемблера 704 для CDR был:[8][9][10]

LXD JLOC 4  # C (уменьшение JLOC) → C (C) # Загружает уменьшение местоположения JLOC в индексный регистр CCLA 0,4     # C (0 - C (C)) → C (AC) # Регистр AC получает начальный адрес спискаPDX 0,4     # C (уменьшение AC) → C (C) # Загружает уменьшение AC в индексный регистр CPXD 0,4     # C (C) → C (Уменьшение AC) # Очищает AC и загружает индексный регистр C в Decrement AC

Машинное слово можно собрать заново минусы, который принял четыре аргумента (а,d,п,т).

Части префикса и тега были отброшены на ранних этапах разработки Lisp, оставив CAR, CDR и CONS с двумя аргументами.[3]

Композиции

Композиции из машина и CDR можно давать короткие и более или менее произносимые имена одинаковой формы. В Лиспе (кадр '(1 2 3)) эквивалентно (автомобиль (cdr '(1 2 3))); его ценность 2. Так же, (каар '((1 2) (3 4))) такой же как (автомобиль (автомобиль '((1 2) (3 4)))); его ценность 1. Например, большинство Лиспов Common Lisp и Схема, систематически определять все вариации двух-четырех композиций машина и CDR.

Другие компьютерные языки

Многие языки (особенно функциональный языки и языки, на которые влияет функционал парадигма ) использовать односвязный список в качестве базовой структуры данных и предоставляют примитивы или функции, аналогичные машина и CDR. Они называются по-разному первый и остальные, голова и хвости т. д. В Лиспе, однако, cons-ячейка используется не только для построения связанных списков, но также для построения парных и вложенных парных структур, т.е. CDR cons-ячейки не обязательно должен быть списком. В этом случае большинство других языков предоставляют различные примитивы, поскольку они обычно различают парные структуры от структур списков либо типично, либо семантически. В частности, в типизированных языках списки, пары и деревья будут иметь разные функции доступа с разными типами сигнатур: в Haskell, Например, машина и CDR становиться первый и snd при работе с парным типом. Точные аналоги машина и CDR поэтому редко встречаются в других языках.

Рекомендации

  1. ^ См., Например, Митчелл, Джон С. (2003), Концепции языков программирования, Cambridge University Press, стр. 28–29, ISBN  9781139433488, Раздел 3.4, Инновации в дизайне Lisp. Ссылка идентифицирует IBM 704 и правильно объясняет адрес и декремент части cons-ячейки, но затем опускает «часть» в объяснении Маккарти.
  2. ^ а б 704 - машина электронной обработки данных http://bitsavers.informatik.uni-stuttgart.de/pdf/ibm/704/24-6661-2_704_Manual_1955.pdf
  3. ^ а б Маккарти, Джон (1979-02-12). "История Лиспа".
  4. ^ Маккарти (1960, стр. 26–27). обсуждает регистры в свободном списке и в сборке мусора.
  5. ^ Маккарти, Джон; Abrahams, Paul W .; Эдвардс, Дэниел Дж .; Харт, Тимоти П .; Левин, Михаил Иванович (1985), Руководство программиста LISP 1.5 (второе изд.), Кембридж, Массачусетс: MIT Press, ISBN  978-0-262-13011-0, стр. 36, cons-ячейки описаны как слова с 15-битными полями «адрес» и «декремент».
  6. ^ Скомпилированный на Фортране язык обработки списков
  7. ^ Язык обработки списков, скомпилированный на Фортране; Транскрипция HTML
  8. ^ а б Отрывки из LISP PAGES NILS- http://t3x.dyndns.org/LISP/QA/carcdr.html
  9. ^ а б Записка 6 лаборатории искусственного интеллекта Массачусетского технологического института ftp://publications.ai.mit.edu/ai-publications/pdf/AIM-006.pdf
  10. ^ а б КОДИРОВКА ДЛЯ КОМПЬЮТЕРА MIT-IBM 704 ftp://bitsavers.informatik.uni-stuttgart.de/pdf/mit/computer_center/Coding_for_the_MIT-IBM_704_Computer_Oct57.pdf
Примечания