2015-10-29 2 views
2

Я знаю, что они:Различия между императивными и декларативными языками программирования?

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

Однако я не знаю, как оптимизировать использование любого типа языка программирования. Как и в этом - есть ли какие-либо осложнения? Например, необходимость пространства/времени в запуске программы, разработанной на любом языке.

+1

Я бы сказал, что ответ на этот вопрос будет занимать всю книгу, или несколько. – biziclop

+0

@biziclop Мне просто нужны небольшие примеры, которые помогут обернуть всю идею вокруг моей головы. Haha – madcrazydrumma

+0

Вам нужно будет сузить ее, будь то с точки зрения языков или с точки зрения проблем, желательно и того, и другого. – biziclop

ответ

2

Сравнение производительности раздел Comparison of programming paradigms Страница WikiPedia довольно много охватывает то, что вы просите, в общем.

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

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

... он идет на

+0

И это даже не верно во всех случаях. – biziclop

+0

@biziclop вообще, к каким случаям это не относится? – madcrazydrumma

+1

@madcrazydrumma Вот что я пытаюсь сказать: нет «вообще», эти два семейства языков слишком разнообразны, чтобы получить какие-либо значимые и универсальные различия на этом уровне. Все зависит от конкретного языка и конкретной среды. (Например, большинство современных виртуальных машин Java ** используют ** обширную вставку, что делает этот абзац большей частью несущественным в случае Java.Но вы можете закончить кодирование на платформе, где компиляция JIT еще лучше или вообще не существует.) – biziclop

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