Абстракция (информатика) - Abstraction (computer science)

Суть абстракции состоит в том, чтобы сохранить информацию, которая актуальна в данном контексте, и забыть информацию, которая не имеет отношения к этому контексту.

Джон В. Гуттаг[1]

В программная инженерия и Информатика, абстракция является:

  • процесс удаления физических, пространственных или временных деталей[2] или атрибуты при изучении предметов или системы сосредоточить внимание на более важных деталях;[3] это похоже на процесс обобщение;
  • создание Абстрактные концепция -объекты путем отражения общих черт или атрибутов различных неабстрактных объектов или систем обучения[3] - результат процесса абстракции.

Абстракция в целом, является фундаментальной концепцией информатики и разработка программного обеспечения.[4] Процесс абстракции также можно назвать моделирование и тесно связан с концепцией теория и дизайн.[5] Модели также могут считаться типами абстракций по их обобщению аспектов реальность.

Абстракция в информатике тесно связана с абстракция в математике из-за их общей ориентации на построение абстракций как объектов,[2] но также связано с другими понятиями абстракции, используемыми в других областях например искусство.[3]

Абстракции могут также относиться к объектам и системам реального мира, правилам вычислительные системы или правила языки программирования которые несут или используют особенности самой абстракции, такие как:

Обоснование

Вычислительная техника в основном работает независимо от конкретного мира. Аппаратное обеспечение реализует модель вычисления это взаимозаменяемо с другими.[нужна цитата ] Программное обеспечение структурировано в архитектуры чтобы люди могли создавать огромные системы, концентрируясь на нескольких проблемах одновременно. Эти архитектуры основаны на конкретном выборе абстракций. Десятое правило Гринспана является афоризм о том, насколько неизбежна и сложна такая архитектура.

Центральная форма абстракции в вычислениях - это абстракция языка: разрабатываются новые искусственные языки, чтобы выразить определенные аспекты системы. Языки моделирования помощь в планировании. Компьютерные языки можно обрабатывать на компьютере. Примером этого процесса абстракции является поколенческое развитие языки программирования от машинный язык к язык ассемблера и язык высокого уровня. Каждый этап можно использовать как ступеньку для следующего этапа. Абстракция языка продолжается, например, в языки сценариев и предметно-ориентированные языки программирования.

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

Некоторые абстракции пытаются ограничить круг концепций, о которых программист должен знать, полностью скрывая абстракции, на которых они, в свою очередь, построены. Инженер-программист и писатель Джоэл Спольски критиковал эти усилия, утверждая, что все абстракции дырявый - что они никогда не смогут полностью скрыть детали, указанные ниже;[10] однако это не отменяет полезности абстракции.

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

Особенности языка

Языки программирования

Различные языки программирования предоставляют разные типы абстракции в зависимости от предполагаемых приложений для языка. Например:

  • В объектно-ориентированные языки программирования такие как C ++, Object Pascal, или Ява, Концепция чего-либо абстракция сам стал декларативным заявлением - используя ключевые слова виртуальныйC ++ ) или Абстрактные[11] и интерфейс[12]Ява ). После такого объявления программист должен реализовать класс создать экземпляр объект декларации.
  • Функциональные языки программирования обычно демонстрируют абстракции, относящиеся к функциям, такие как лямбда-абстракции (превращение члена в функцию некоторой переменной) и функции высшего порядка (параметры - это функции).
  • Современные члены семейства языков программирования Lisp, такие как Clojure, Схема и Common Lisp поддержка макросистемы чтобы разрешить синтаксическую абстракцию. Другие языки программирования, такие как Scala также есть макросы или очень похожие метапрограммирование особенности (например, Haskell имеет Шаблон Haskell, и OCaml имеет MetaOCaml ). Это может позволить программисту исключить шаблонный код, абстрагируйтесь от утомительных последовательностей вызовов функций, реализуйте новые структуры потока управления, и реализовать Доменные языки (DSL), которые позволяют кратко и элегантно выразить предметно-ориентированные концепции. Все они при правильном использовании улучшают как эффективность программиста, так и ясность кода, делая предполагаемую цель более явной. Следствием синтаксической абстракции также является то, что любой диалект Лиспа и фактически практически любой язык программирования, в принципе, может быть реализован на любом современном Лиспе со значительно меньшими (но все же в некоторых случаях нетривиальными) усилиями по сравнению с «более традиционным» языки программирования, такие как Python, C или Ява.

Методы спецификации

Аналитики разработали различные методы формального определения программных систем. Некоторые известные методы включают:

  • Метод на основе абстрактной модели (VDM, Z);
  • Алгебраические техники (Larch, CLEAR, OBJ, ACT ONE, CASL);
  • Технологии, основанные на процессах (LOTOS, SDL, Estelle);
  • Трассовые методы (СПЕЦИАЛЬНЫЕ, ТАМ);
  • Техники, основанные на знаниях (Refine, Gist).

Языки спецификации

Языки спецификаций обычно полагаются на абстракции того или иного типа, поскольку спецификации обычно определяются раньше в проекте (и на более абстрактном уровне), чем окончательная реализация. В UML язык спецификаций, например, позволяет определять Абстрактные классы, которые в проекте водопада остаются абстрактными на этапе архитектуры и спецификации проекта.

Абстракция управления

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

а: = (1 + 2) * 5

Человеку это кажется довольно простым и очевидным расчетом ("один плюс два равно три, умноженный на пять равно пятнадцать"). Однако шаги низкого уровня, необходимые для выполнения этой оценки и возврата значения «15», а затем присвоения этого значения переменной «a», на самом деле довольно тонкие и сложные. Значения необходимо преобразовать в двоичное представление (часто гораздо более сложная задача, чем можно было бы подумать), а вычисления разложить (компилятором или интерпретатором) на инструкции сборки (опять же, которые гораздо менее интуитивно понятны для программиста: такие операции, как сдвиг двоичного регистра влево или добавление двоичного дополнения содержимого одного регистра к другому - это просто не то, как люди думают об абстрактных арифметических операциях сложения или умножения). Наконец, присвоение результирующего значения «15» переменной с меткой «а», чтобы «а» можно было использовать позже, включает в себя дополнительные «закулисные» шаги по поиску метки переменной и результирующего местоположения на физическом носителе. или виртуальная память, хранящая двоичное представление числа «15» в этой ячейке памяти и т. д.

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

  1. это заставляет программиста постоянно повторять довольно обычные задачи каждый раз, когда требуется аналогичная операция
  2. он заставляет программиста программировать для конкретного оборудования и набора команд

Структурированное программирование

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

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

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

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

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

Абстракция данных

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

Например, можно определить абстрактный тип данных называется Справочная таблица который однозначно объединяет ключи с участием ценности, и в каких значениях можно получить, указав соответствующие ключи. Такая таблица поиска может быть реализована различными способами: как хеш-таблица, а двоичное дерево поиска, или даже простой линейный список пар (ключ: значение). Что касается клиентского кода, абстрактные свойства типа в каждом случае одинаковы.

Конечно, все это в первую очередь зависит от правильного получения деталей интерфейса, поскольку любые изменения могут иметь серьезные последствия для клиентского кода. Как один из способов взглянуть на это: интерфейс формирует договор о согласованном поведении между типом данных и клиентским кодом; все, что не оговорено в контракте, может быть изменено без предварительного уведомления.

Ручная абстракция данных

Хотя большая часть абстракции данных происходит с помощью информатики и автоматизации, бывают случаи, когда этот процесс выполняется вручную и без вмешательства программирования. Один из способов понять это - абстрагирование данных в процессе проведения регулярный обзор литературы. В этой методологии данные абстрагируются одним или несколькими абстракторами при проведении метаанализ, с уменьшением ошибок за счет двойной абстракции данных с последующей независимой проверкой, известной как судебное решение.[13]

Абстракция в объектно-ориентированном программировании

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

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

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

C ++ является примером другой крайности: он сильно полагается на шаблоны и перегрузка и другие статические привязки во время компиляции, что, в свою очередь, имеет определенные проблемы с гибкостью.

Хотя эти примеры предлагают альтернативные стратегии для достижения той же абстракции, они принципиально не меняют необходимость поддержки абстрактных существительных в коде - все программирование полагается на способность абстрагировать глаголы как функции, существительные как структуры данных или как процессы.

Рассмотрим для примера образец Ява фрагмент, представляющий некоторых обычных сельскохозяйственных «животных» на уровне абстракции, пригодном для моделирования простых аспектов их голода и кормления. Он определяет Животное класс, представляющий как состояние животного, так и его функции:

общественный класс Животное расширяет Живое существо{     частный Расположение место;     частный двойной ЭнергияЗапасы;     общественный логический голоден() {         вернуть ЭнергияЗапасы < 2.5;     }     общественный пустота есть(Еда еда) {         // Потребляем еду         энергияЗапасы += еда.getCalories();     }     общественный пустота moveTo(Расположение расположение) {         // Перемещение в новое место         этот.место = расположение;     }}

С помощью приведенного выше определения можно создавать объекты типа Животное и назовите их методы так:

свинья = новый Животное();корова = новый Животное();если (свинья.голоден()) {    свинья.есть(стол);}если (корова.голоден()) {    корова.есть(трава);}корова.moveTo(сарай);

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

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

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

Объектно-ориентированный дизайн

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

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

Соображения

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

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

Однако абстракции, хотя и не обязательно точный, должно быть звук. То есть должна быть возможность получить от них надежные ответы - даже если абстракция может просто дать результат неразрешимость. Например, учащихся в классе можно абстрагировать по их минимальному и максимальному возрасту; если спросить, принадлежит ли определенный человек к этому классу, можно просто сравнить возраст этого человека с минимальным и максимальным возрастом; если его возраст выходит за рамки допустимого, можно смело ответить, что человек не принадлежит к классу; если нет, можно ответить только «не знаю».

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

Абстракции могут оказаться полезными при работе с компьютерными программами, потому что нетривиальные свойства компьютерных программ по существу неразрешимый (увидеть Теорема Райса ). Как следствие, автоматические методы получения информации о поведении компьютерных программ должны либо отказываться от завершения (в некоторых случаях они могут давать сбой, давать сбой или никогда не давать результата), надежности (они могут предоставлять ложную информацию) или точности ( на некоторые вопросы они могут ответить «не знаю»).

Абстракция - это основная концепция абстрактная интерпретация. Проверка модели в основном имеет место на абстрактных версиях изучаемых систем.

Уровни абстракции

Информатика обычно представляет уровни (или, реже, слои) абстракции, в которой каждый уровень представляет другую модель одной и той же информации и процессов, но с разным количеством деталей. На каждом уровне используется система выражения, включающая уникальный набор объектов и композиций, применимых только к определенной области.[14]Каждый относительно абстрактный, «более высокий» уровень строится на относительно конкретном «более низком» уровне, который имеет тенденцию обеспечивать более «детализированное» представление. Например, ворота построены на электронных схемах, двоичные данные на воротах, машинный язык на двоичном, язык программирования на машинном языке, приложения и операционные системы на языках программирования. Каждый уровень воплощается, но не определяется нижележащим уровнем, что делает его языком описания, который в некоторой степени самодостаточен.

Системы баз данных

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

Уровни абстракции данных в системе баз данных

Физический уровень: Самый низкий уровень абстракции описывает Как система фактически хранит данные. Физический уровень подробно описывает сложные низкоуровневые структуры данных.

Логический уровень: Следующий более высокий уровень абстракции описывает какая данные, хранящиеся в базе данных, и какие отношения существуют между этими данными. Таким образом, логический уровень описывает всю базу данных в виде небольшого числа относительно простых структур. Хотя реализация простых структур на логическом уровне может включать сложные структуры физического уровня, пользователю логического уровня не нужно знать об этой сложности. Это называется физическая независимость данных. Администраторы баз данных, кто должен решать, какую информацию хранить в базе данных, используют логический уровень абстракции.

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

Многослойная архитектура

Возможность предоставить дизайн разных уровней абстракции могут

  • значительно упростить дизайн
  • позволить различным ролевым игрокам эффективно работать на разных уровнях абстракции
  • поддерживать переносимость программные артефакты (в идеале на основе модели)

Системный дизайн и проектирование бизнес-процессов оба могут использовать это. Немного процессы проектирования специально создавать проекты, содержащие различные уровни абстракции.

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

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

использованная литература

  1. ^ Гуттаг, Джон В. (18 января 2013 г.). Введение в вычисления и программирование с использованием Python (Издание весны 2013 г.). Кембридж, Массачусетс: MIT Press. ISBN  9780262519632.
  2. ^ а б Колберн, Тимоти; Шут, Гэри (5 июня 2007 г.). «Абстракция в информатике». Умы и машины. 17 (2): 169–184. Дои:10.1007 / s11023-007-9061-7. ISSN  0924-6495. S2CID  5927969.
  3. ^ а б c Крамер, Джефф (1 апреля 2007 г.). «Является ли абстракция ключом к вычислениям?». Коммуникации ACM. 50 (4): 36–42. Дои:10.1145/1232743.1232745. ISSN  0001-0782. S2CID  12481509.
  4. ^ Бен-Ари, Мордехай (1 марта 1998 г.). «Конструктивизм в образовании по информатике». Бюллетень ACM SIGCSE. 30 (1): 257, 257–261. Дои:10.1145/274790.274308. ISSN  0097-8418.
  5. ^ Комер, Д. Э .; Грис, Дэвид; Малдер, Майкл К .; Такер, Аллен; Тернер, А. Джо; Янг, Пол Р. / Деннинг (1 января 1989 г.). «Вычислительная техника как дисциплина». Коммуникации ACM. 32 (1): 9–23. Дои:10.1145/63238.63239. ISSN  0001-0782. S2CID  723103.
  6. ^ Лисков, Варвара (1 мая 1988 г.). «Основной доклад - абстракция и иерархия данных». Уведомления ACM SIGPLAN. ACM. 23: 17–34. Дои:10.1145/62138.62141. ISBN  0897912667. S2CID  14219043.
  7. ^ Барендрегт, Хендрик Питер (1984). Лямбда-исчисление: его синтаксис и семантика (Пересмотренная ред.). Амстердам: Северная Голландия. ISBN  0444867481. OCLC  10559084.
  8. ^ Барендрегт, Хендрик Питер (2013). Лямбда-исчисление с типами. Деккерс, Вил., Статман, Ричард, Алесси, Фабио, Ассоциация символической логики. Кембридж, Великобритания: Издательство Кембриджского университета. ISBN  9780521766142. OCLC  852197712.
  9. ^ Ньюэлл, Аллен; Саймон, Герберт А. (1 января 2007 г.). Информатика как эмпирическое исследование: символы и поиск. ACM. п. 1975 г. Дои:10.1145/1283920.1283930. ISBN  9781450310499.
  10. ^ Спольски, Джоэл. "Закон дырявых абстракций".
  11. ^ «Абстрактные методы и занятия». Учебники по Java ™. Oracle. Получено 4 сентября 2014.
  12. ^ «Использование интерфейса как типа». Учебники по Java ™. Oracle. Получено 4 сентября 2014.
  13. ^ Э, Цзянь-Ю; Салдана, Ян Дж .; Каннер, Джозеф; Шмид, Кристофер Х .; Ле, Джимми Т .; Ли, Тяньцзин (2020). «Решение, а не опыт абстрагирования данных имеет большее значение для уменьшения количества ошибок при абстракции данных в систематических обзорах». Методы исследования синтеза. 11 (3): 354–362. Дои:10.1002 / jrsm.1396. ISSN  1759-2879. PMID  31955502.
  14. ^ Лучано Флориди, Левеллизм и метод абстракции IEG - Отчет об исследовании 22.11.04

дальнейшее чтение

внешние ссылки

  • SimArch пример многоуровневой архитектуры для распределенных систем моделирования.