Запись (информатика) - Record (computer science)

В Информатика, а записывать (также называемый структура, структура, или же составные данные) является основным структура данных. Записи в база данных или же электронная таблица обычно называются "ряды ".[1][2][3][4]

Запись - это собрание поля, возможно, разных типов данных, обычно в фиксированном количестве и последовательности.[5] Поля записи также могут называться члены, особенно в объектно-ориентированного программирования; поля также могут называться элементы, хотя это рискует ошибиться с элементами коллекция.

Например, дату можно сохранить как запись, содержащую числовой год поле, а месяц поле, представленное в виде строки, и числовое день месяца поле. В трудовой книжке может содержаться имя, а зарплата, а классифицировать. Запись Circle может содержать центр и радиус- в этом случае сам центр можно было бы представить как точка запись, содержащая Икс и у координаты.

Рекорды отличаются от массивы тем фактом, что их количество полей обычно фиксировано, каждое поле имеет имя и что каждое поле может иметь различный тип.

А тип записи это тип данных который описывает такие значения и переменные. Большинство современных компьютерных языков позволяют программисту определять новые типы записей. Определение включает указание типа данных каждого поля и идентификатор (имя или ярлык), по которому к нему можно получить доступ. В теория типов, виды продукции (без имен полей) обычно предпочтительнее из-за их простоты, но правильные типы записей изучаются на таких языках, как Система F-sub. Поскольку теоретико-типовые записи могут содержать первоклассная функция -типированные поля в дополнение к данным, они могут выражать многие особенности объектно-ориентированного программирования.

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

Параметры функция или процедура часто можно рассматривать как поля переменной записи; и аргументы, переданные этой функции, можно рассматривать как значение записи, которое получает назначен к этой переменной во время вызова. Также в стек вызовов который часто используется для реализации вызовов процедур, каждая запись является запись активации или же кадр вызова, содержащий параметры процедуры и локальные переменные, адрес возврата и другие внутренние поля.

Объект в объектно-ориентированный язык - это, по сути, запись, содержащая специализированные процедуры для обработки этой записи; а типы объектов - это разработка типов записей. Действительно, в большинстве объектно-ориентированных языков записи - это просто частные случаи объектов, известные как простые старые структуры данных (PODS), чтобы контрастировать с объектами, использующими объектно-ориентированные функции.

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

Ключи

В записи может быть ноль или более ключс. Ключ - это поле или набор полей в записи, которые служат идентификатором. Уникальный ключ часто называют первичный ключ, или просто ключ записи. Например, файл сотрудника может содержать номер сотрудника, имя, отдел и зарплату. Номер сотрудника будет уникальным в организации и будет основным ключом. В зависимости от носителя и файловой организации номер сотрудника может быть индексированный - который также хранится в отдельном файле для ускорения поиска. Код отдела не может быть уникальным; он также может быть проиндексирован, и в этом случае он будет считаться вторичный ключ, или же альтернативный ключ. Если он не проиндексирован, необходимо просканировать весь файл сотрудника, чтобы получить список всех сотрудников в определенном отделе. Поле зарплаты обычно не считается ключевым. Индексирование является одним из факторов, учитываемых при разработке файла.

История

Журнальный лист из Перепись населения США 1880 г., показывая табличные данные со строками данных, каждая из которых соответствует одному человеку.

Понятие записи можно проследить до различных типов столы и бухгалтерские книги используется в бухгалтерский учет издавна. Современное представление о записях в компьютерных науках с полями четко определенного типа и размера уже подразумевалось в механических калькуляторах 19 века, таких как Бэббидж с Аналитическая машина.[6][7]

Холлерит перфокарта (1895)

Исходный машиночитаемый носитель, используемый для данных (в отличие от контроля), был перфокарты используется для записей в Перепись населения США 1890 г.: каждая перфокарта была отдельной записью. Сравните дневниковую запись 1880 года и перфокарту 1895 года. Записи были хорошо установлены в первой половине 20 века, когда большая часть обработки данных производилась с использованием перфокарт. Обычно каждая запись файла данных записывается на одну перфокарту с определенными столбцами, назначенными определенным полям. Как правило, запись была наименьшей единицей, которую можно было прочитать из внешнего хранилища (например, устройства чтения карт, ленты или диска).

Наиболее машинный язык реализации и ранние языки ассемблера не имел специального синтаксиса для записей, но эта концепция была доступна (и широко использовалась) благодаря использованию индексные регистры, косвенная адресация, и самомодифицирующийся код. Некоторые ранние компьютеры, такие как IBM 1620, имел аппаратную поддержку для разграничения записей и полей, а также специальные инструкции для копирования таких записей.

Концепция записей и полей была центральной в некоторых ранних файлах. сортировка и табулирование утилиты, такие как Генератор программ отчетов IBM (RPG).

КОБОЛ был первым широко распространенным языком программирования, поддерживающим типы записей,[8] и его средства определения записи были довольно сложными в то время. Язык позволяет определять вложенные записи с буквенно-цифровыми, целочисленными и дробными полями произвольного размера и точности, а также поля, которые автоматически форматируют любое присвоенное им значение (например, вставка знаков валюты, десятичных точек и разделителей групп цифр. ). Каждый файл связан с переменной записи, в которую данные считываются или записываются. COBOL также предоставляет ДВИГАТЬСЯ СООТВЕТСТВУЮЩИЙ оператор, который присваивает соответствующие поля двух записей в соответствии с их именами.

Ранние языки, разработанные для числовых вычислений, такие как FORTRAN (вплоть до FORTRAN IV ) и Алгол 60, не было поддержки типов записей; но более поздние версии этих языков, такие как Фортран 77 и Алгол 68 добавил их. Оригинал Язык программирования Лисп тоже не хватало записей (кроме встроенной cons-ячейка ), но это S-выражения предоставил адекватный суррогат. В Язык программирования Паскаль был одним из первых языков, полностью интегрировавших типы записей с другими базовыми типами в логически согласованную систему типов. В PL / I язык программирования для записей в стиле COBOL. В C язык программирования изначально предоставлял концепцию записи как своего рода шаблон (структура), который может быть размещен поверх области памяти, а не истинного типа данных записи. Последние были предоставлены в итоге ( typedef декларацию), но эти две концепции по-прежнему различны в языке. Большинство языков, разработанных после Паскаля (например, Ада, Modula, и Ява ) также поддерживает записи.

Операции

  • Объявление нового типа записи, включая позицию, тип и (возможно) имя каждого поля;
  • Объявление переменных и значений как имеющих данный тип записи;
  • Построение значения записи из заданных значений полей и (иногда) с заданными именами полей;
  • Выбор поля записи с явным именем;
  • Присвоение значения записи переменной записи;
  • Сравнение двух рекордов на равенство;
  • Расчет стандарта хеш-значение Для записи.

Выбор поля из значения записи дает значение.

Некоторые языки могут предоставлять средства для перечисления всех полей записи или, по крайней мере, полей, которые являются ссылками. Это средство необходимо для реализации определенных услуг, таких как отладчики, сборщики мусора, и сериализация. Это требует некоторой степени полиморфизм типов.

В системах с подтипами записей операции со значениями типа записи также могут включать:

  • Добавление нового поля в запись, установка значения нового поля.
  • Удаление поля из записи.

В таких настройках конкретный тип записи подразумевает наличие определенного набора полей, но значения этого типа могут содержать дополнительные поля. Запись с полями Икс, у, и z таким образом, будет принадлежать к типу записей с полями Икс и у, как и запись с полями Икс, у, и р. Обоснование состоит в том, что передача (Икс,у,z) запись в функцию, которая ожидает (Икс,у) запись в качестве аргумента должна работать, поскольку эта функция найдет все требуемые поля в записи. Многие способы практической реализации записей на языках программирования не позволят допустить такую ​​вариативность, но этот вопрос является центральной характеристикой типов записей в более теоретическом контексте.

Присвоение и сравнение

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

Некоторые языки могут также разрешать назначение между записями, поля которых имеют разные имена, сопоставляя каждое значение поля с соответствующей переменной поля по их положению в записи; так что, например, комплексное число с полями, называемыми настоящий и воображать может быть отнесен к 2D точка запись переменной с полями Икс и Y. В этом альтернативном варианте два операнда должны иметь одинаковую последовательность типов полей. Некоторые языки могут также требовать, чтобы соответствующие типы имели одинаковый размер и кодировку, чтобы вся запись могла быть назначена как неинтерпретируемая битовая строка. Другие языки могут быть более гибкими в этом отношении и требовать только того, чтобы каждое поле значения могло быть юридически присвоено соответствующему полю переменной; так что, например, короткое целое число поле может быть присвоено длинное целое поле или наоборот.

Другие языки (например, КОБОЛ ) может соответствовать полям и значениям по их именам, а не позициям.

Эти же возможности применимы к сравнению двух значений записи на равенство. Некоторые языки могут также допускать сравнение порядка ('<' и '>'), используя лексикографический порядок на основе сравнения отдельных полей.[нужна цитата ]

PL / I позволяет оба предыдущих типа присваивания, а также позволяет структурные выражения, Такие как а = а + 1; где «a» - это запись или структура в терминологии PL / I.

Выбор распределительного поля в Алголе 68

В Алголе 68, если Оч был массивом записей, каждая с целочисленными полями Икс и Yможно было написать Y из Оч чтобы получить массив целых чисел, состоящий из Y поля всех элементов Оч. В результате заявления Y из Баллы [3]: = 7 и (Y из Баллы) [3]: = 7 будет иметь такой же эффект.

Утверждение Паскаля "with"

в Язык программирования Паскаль, команда с R сделать S выполнит последовательность команд S как будто все поля записи р были объявлены как переменные. Итак, вместо того, чтобы писать Pt.X: = 5; Pt.Y: = Pt.X + 3 можно было написать с Pt начинаем X: = 5; Y: = X + 3 конец.

Представление в памяти

Представление записей в памяти зависит от языков программирования. Обычно поля хранятся в последовательных позициях в памяти в том же порядке, в каком они объявлены в типе записи. Это может привести к сохранению двух или более полей в одном и том же слове памяти; действительно, эта функция часто используется в системное программирование для доступа к определенным битам слова. С другой стороны, большинство компиляторов будут добавлять поля заполнения, в основном невидимые для программиста, чтобы соответствовать ограничениям выравнивания, налагаемым машиной - скажем, что плавающая точка поле должно занимать одно слово.

Некоторые языки могут реализовать запись в виде массива адресов, указывающих на поля (и, возможно, на их имена и / или типы). Объекты в объектно-ориентированных языках часто реализуются довольно сложными способами, особенно в языках, которые позволяют наследование нескольких классов.

Самоопределяющиеся записи

А самоопределяющаяся запись - это тип записи, которая содержит информацию для идентификации типа записи и поиска информации в записи. Может содержать смещения элементов; поэтому элементы могут быть сохранены в любом порядке или могут быть опущены.[9] В качестве альтернативы, различные элементы записи, каждый из которых включает идентификатор элемента, могут просто следовать друг за другом в любом порядке.

Примеры

Ниже показаны примеры определений записей:

  • PL / I:
      объявить 1 дату, 2 года фиксированной двоичной, 2 месяца фиксированной двоичной, 2 дня фиксированной двоичной;
  • Алгол 68:
  Режим Дата = структура (int год, int месяц, int день);
  • C:
    структура Дата {   int год;   int месяц;   int день;};
  • Фортран:
    тип :: Дата   целое число :: год, месяц, деньтип конца Дата
  • Идти:
    тип Дата структура {        год  int        месяц время.Месяц        день   int}
  • Паскаль:
    тип TDate = записывать   Год: Целое число;   Месяц: 1..12;   День: 1..31;конец;
  • Ржавчина:
    структура Дата{год: u32,месяц: u32,день: u32,}
  • Haskell:
    данные Дата = Дата { год :: Целое число                 , месяц :: Целое число                 , день :: Целое число                 }
  • Юля:
    структура Дата    год::Int    месяц::Int    день::Intконец
  • Стандартный ML:
    тип Дата = {год:int, месяц:int, день:int}
  • КОБОЛ:
     01 WS-DATE.    02 WS-YEAR  ПИК 9999.    02 WS-МЕСЯЦ ПИК 99.    02 WS-ДЕНЬ   ПИК 99.
  • Java 15:
    записывать Дата(int год, int месяц, int день) {    // это необходимый минимум }

Смотрите также

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

  1. ^ "Определения словаря компьютерных наук". Компьютерные студенты. Получено 22 янв, 2018.
  2. ^ Радвани, Тибор (2014). Системы управления базами данных. Колледж Эстерхази Кароли. п. 19. Получено 23 сентября 2018.
  3. ^ Кахате, Атул (2006). Введение в системы управления базами данных. Пирсон. п. 3. ISBN  978-81-317-0078-5. Получено 23 сентября 2018.
  4. ^ Коннолли, Томас (2004). Решения для баз данных: пошаговое руководство по созданию баз данных (2-е изд.). Пирсон. п.7. ISBN  978-0-321-17350-8.
  5. ^ Фелляйзен, Маттиас (2001). Как разрабатывать программы. MIT Press. стр.53, 60. ISBN  978-0262062183.
  6. ^ Бромли, Аллан (октябрь 1998 г.). "Аналитическая машина Чарльза Бэббиджа, 1838 г.". IEEE Annals of the History of Computing. 20 (4): 29–45. Дои:10.1109/85.728228. S2CID  2285332. Получено 23 сентября 2018.
  7. ^ Swade, Дорон. «Автоматические вычисления: Чарльз Бэббидж и вычислительный метод». Журнал Резерфорда. Журнал Резерфорда. Получено 23 сентября 2018.
  8. ^ Себеста, Роберт В. Концепции языков программирования (Третье изд.). Эддисон-Уэсли Паблишинг Компани, Инк. Стр.218. ISBN  0-8053-7133-8.
  9. ^ Краймер, Мартин Р. "Руководство разработчика приложений контроллера ввода / вывода EPICS (IOC)". Аргоннская национальная лаборатория. Получено 25 ноября, 2015.