Още една статия под това заглавие, но този път е гледна точка от среда за програмиране.

По дефиниция в речника, декларативното програмиране е стил на изграждане на структурата и елементите на компютърните програми, които изразяват логиката на изчислението, без да описват неговия контролен поток¹. Жалко е, че този тип определения не обясняват как и двата подхода влияят на разработчиците върху ежедневието им.

Разбирането на поведението на двете изпълнения улеснява решаването на дилемата и дава конкретни практики.

Нека започнем с императивно време за изпълнение, което изпълнява кодови редове според указанията и разработчикът е изцяло отговорен за потока. Някои повтарящи се работи може да бъдат автоматизирани в рамките на методи/тактики като 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

  1. Лойд, Дж. У., Практически предимства на декларативното програмиране