Още една статия под това заглавие, но този път е гледна точка от среда за програмиране.
По дефиниция в речника, декларативното програмиране е стил на изграждане на структурата и елементите на компютърните програми, които изразяват логиката на изчислението, без да описват неговия контролен поток¹. Жалко е, че този тип определения не обясняват как и двата подхода влияят на разработчиците върху ежедневието им.
Разбирането на поведението на двете изпълнения улеснява решаването на дилемата и дава конкретни практики.
Нека започнем с императивно време за изпълнение, което изпълнява кодови редове според указанията и разработчикът е изцяло отговорен за потока. Някои повтарящи се работи може да бъдат автоматизирани в рамките на методи/тактики като OOP, AOP и т.н., но в крайна сметка това е нещо, което програмистът трябва да управлява и конфигурира независимо. Например, имате обект и всеки път, когато неговото свойство се промени, вие трябва да промените времето за актуализиране, когато се е случило, така че трябва да извикате функцията updateTime()
. От инженерна гледна точка не е най-добрата практика да се кодира твърдо навсякъде, защото това увеличава броя на кодовите редове заедно със сложността, което може да доведе до сериозни проблеми с поддръжката. Въпреки това, ако сте дефинирали aspect
, той автоматично се актуализира, така че прави преки пътища, но теорията остава същата, тъй като изисква разработчиците да кодират и конфигурират.
Декларативното време за изпълнение работи с междинен език, който се счита най-вече за декларативни изявления като абстракция на желаещи (не буквални изявления). Въпреки това, важното тук е да се разбере времето за изпълнение, тъй като неговите спецификации определят поведението на системата. Например:
> a = 1 > b = a + 1 > a = 2 > b 3
В този случай b = a + 1
е декларативен израз, че когато a
се промени, времето за изпълнение трябва да актуализира b
заедно с, така че b
да стане 3
.
Ако изпълняваме едни и същи изрази в императивно време за изпълнение като JavaScript двигател, резултатът ще бъде различен:
> a = 1 > b = a + 1 > a = 2 > b 2
Тъй като a
в b = a + 1
представлява само местоположение на блок памет, така че актуализирането на a
с 2
не оказва влияние върху самия b
.
Можем да използваме по-усъвършенстван случай като включване на if
израз:
> a = 1 > b = a + 1 > if( b > 5 ) { c = true } else { c = false } > c false > a = 5 > c true
Сега в този случай, когато a = 5
се извика, времето за изпълнение автоматично подравнява rest с извикването на b = a + 1
и if( b > 5 ) { .. }
изрази.
Контролният поток е може би най-важният параметър, за да се разграничат и двата, тъй като в края на транзакцията целостта на логическите данни/данните не може да бъде нарушена, така че страничните ефекти от изпълнението изискват привеждане в съответствие с останалата част от системата. При императивното програмиране това е отговорност на разработчика, тъй като той/тя директно управлява контролния поток. Въпреки това, при декларативното програмиране, тъй като системата приема декларативни изрази, времето за изпълнение е напълно отговорно. В последния пример по-горе потокът на зависимост върви като c -> b -> a
, така че в момента, в който a
се промени, времето за изпълнение автоматично стартира отново b = a + 1
, както и if( b > 5 ) {..}
. Въпреки това, при императивно програмиране разработчикът трябва да изпълни нещо като a = 5; updateB(a); updateC(b);
, като приеме, че функциите съдържат логиката.
Заключение
И двата стила на програмиране играят значителна роля при програмирането. При програмиране на високо ниво, особено в приложения, управлявани от данни, Declarative runtime може да автоматизира повтарящ се поток заедно с опростяване на структурата на кода и в същото време императивното програмиране дава пълен контрол на програмиста, особено това е много важно при програмиране на ниско ниво или критични за мисията работни места. Ясно е, че популярността на декларативното и функционалното програмиране нараства, но от днес императивното програмиране, включително неговите библиотеки, инструменти и т.н., силно доминира в езиците за програмиране.
Nucleoid е с отворен код (Apache 2.0), среда за изпълнение, която позволява декларативно програмиране, написано в ES6 (JavaScript) синтаксис. Тъй като изявленията са декларативни, времето за изпълнение осигурява логическа цялост и постоянство като скрие технически подробности.
Научете повече на nucleoid.org
- Лойд, Дж. У., Практически предимства на декларативното програмиране