Цель абстракции - PullRequest
       24

Цель абстракции

2 голосов
/ 21 сентября 2010

Какова цель абстракции в кодировании:

Эффективность программиста или эффективность программы?

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

Может ли кто-нибудь любезно уточнить?

Ответы [ 6 ]

7 голосов
/ 21 сентября 2010

Я бы сказал, что он наполовину прав.

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

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

2 голосов
/ 21 сентября 2010

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

c = add(a, b);

, который выглядит примерно так:

public int add(int a, int b){
  return a + b;
}

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

В конечном счете, каждый вызов метода, который вы делаете, немного увеличивает нагрузку на вашу программу.Однако, как отмечает @Tesserex, в большинстве современных компьютерных систем ничтожно мало, и, как отмечает @ Эндрю Барбер, этот компромисс, как правило, полностью затмевается увеличением эффективности работы программистов.

2 голосов
/ 21 сентября 2010

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

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

2 голосов
/ 21 сентября 2010

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

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

1 голос
/ 21 сентября 2010

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

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

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

1 голос
/ 21 сентября 2010

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

В качестве примера абстракции, которая не влияет на производительность, рассмотрим сборку.Пневмоника, такая как mov и add, является абстракцией, которая облегчает запоминание кодов операций по сравнению с запоминанием байт-кодов и других деталей кодирования команд.Тем не менее, учитывая сопоставление 1 к 1, я полагаю, что это абстракция имеет нулевой эффект на конечную производительность.

...