2010-09-21 3 views
2

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

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

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

Может ли кто-нибудь прокомментировать?

+0

Возможный дубликат: http://stackoverflow.com/questions/3634915/what-is-data-abstraction-exactly-means – Tesserex

+0

Хорошо, эффективность - это сложный термин. – Andrey

ответ

7

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

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

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

+0

для повторного использования кода требуется не только абстракция – Andrey

+0

@Andrey - согласовано. Необходимо, но недостаточно. Я просто не упомянул остальных в своем посте, потому что мы говорим об абстракции. – Tesserex

+1

Ну, если кто-то может записать оптимальный машинный код для данной проблемы, он будет работать более эффективно, чем решение, построенное на сотне уровней на абстракциях (только для ОС, для которых я предположил бы 40: D). Но люди не могут этого сделать, не говоря уже в разумные сроки. «Достаточно умные компиляторы» могли бы, но для большинства языков, которые обеспечивают высокую степень абстракций, компилятор недостаточно умен. Но, по крайней мере, на C и C++ компиляторы теперь могут победить большинство программистов сборки в 99% случаев -> написание вещей в сборке может очень хорошо снизить производительность. – delnan

2

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

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

2

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

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

2

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

c = add(a, b); 

который выглядит как

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

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

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

+1

Метод, такой как ваше добавление, не абстракция, это мозг. Но в любом случае это было бы наклонно, что привело бы к нулю накладных расходов. Плохой пример. – delnan

+0

@ delnan, Это иллюстрация, а не пример. Он предназначен для того, чтобы заставить OP думать о том, что происходит, когда метод называется не защищающим, фактически называя метод «добавить». И да, это, скорее всего, будет встроено, но дело не в этом. –

1

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

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

1

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

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

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

Смежные вопросы