Skip to content
От: Божидар Маринов Дата: Последна промяна:

Урок 1, 🥞 Видове програмиране (обяснено с палачинки!)

Основни точки от този урок

Една рецепта, подобно на една компютърна програма, е съставена от поредица от стъпки.

Например, вижте следната рецепта за смес за палачинки:

Смес за палачинки:

  1. Взимаме 2-3 яйца, и ги счупваме в една купа.
  2. Разбиваме добре.
  3. Добавяме 1-2 чаши прясно мляко.
  4. Добавяме сол на вкус (аз ги правя без захар)
  5. Бъркайки, добавяме по малко брашно, докато не стане с гъстота на боза

Тази рецепта е подобна на една императивна програма. "Императивна" (подобно на думата "император") ще рече че програмата е съставена от команди. Така например, първата команда е "Взимаме 2-3 яйца, и ги счупваме в една купа". Тези команди се изпълняват една след друга в точно указания ред. Не можем примерно да изпълним стъпка 2 (разбиваме яйцата) преди да сме изпълнили стъпка 1 (счупваме яйцата).

Също, може да забележим че "(аз ги правя без захар)" не е команда. Това е коментар, който служи да подскаже защо не съм описал захарта в рецептата — не защото рецептата не става със захар (в който случай бих написал "не слагаме захар" като инструкция), нито пък защото съм забравил че в палачинките се слага захар, а защото аз лично по принцип не слагам захар.

В момента, за да разберем какви продукти ни трябват за да изпълним рецептата се налага да прочетем всяка стъпка внимателно и да предположим какво би ѝ било нужно. По лесно би било ако направим списък от продуктите най-отгоре:

Смес за палачинки:

  • 2-3 яйца
  • 1-2 чаши прясно мляко
  • ~2 чаши брашно
  1. Взимаме яйцата, и ги счупваме в една купа.
  2. Разбиваме добре.
  3. Добавяме прясното мляко.
  4. Добавяме сол на вкус (аз ги правя без захар)
  5. Бъркайки, добавяме по малко брашно, докато не стане с гъстота на боза

Описанието на продуктите най-отгоре е подобно на една декларативна програма. "декларативна" (от думата декларация) ще рече че програмата е описание на крайния резултат. Вече няма значение реда или начина по който някой ще набави тези продукти, а само че след като свърши "изпълнението" на списъка от продукти, имаме всички нужни продукти на масата.

В този ред на мисли, бихме могли да опишем и цялата рецепта като описание на крайния продукт. Може би нещо от рода на това, използвайки скоби за да е ясен реда на операциите:

Смес за палачинки: ((2-3 яйца, счупени и разбити) + (1-2 чаши прясно мляко)) + брашно, докато не стане с гъстота на боза

Императивните и декларативните програми се използват в различни случаи. И често се комбинират.
Една императивна програма е по-лесна за разбиране (обикновено) и изпълнение, но за сметка на това, няма как да преценим какъв ще бъде крайния резултат от изпълнението ѝ, освен ако не я изпълним от край до край. Една декларативна програма е по-лесно да бъде трансформирана по някакъв начин и ясно може да преценим какъв ще бъде крайния резултат, но за сметка на това е по-трудно да разберем как точно се изпълнява.
Императивни програми най-често се използват за неща, които са интерактивни по някакъв начин, например приложения, игри, операционни системи и прочие. Декларативни програми се използват най-често за неща, за които не искаме да обясняваме всяка стъпка, а само желания резултат; например конфигурации на програми, страници с текст, или пък заявки към бази от данни.

Програмния език JavaScript, за който ще учим в следващите уроци, е императивен. Това значи че всяка команда и линия код се изпълнява стъпка по стъпка, точно в реда в който сме ги задали. В последствие, ще работим и с някои декларативни програмни езици, но смятам че е полезно да се сблъскаме с тези два термина от рано.

Задача (по желание)

Попитайте някой възрастен около вас да ви разкаже някоя рецепта, която знае, и пробвайте да я запишете.

Има ли неща, които са коментари? Оградете ги в скоби!

Вашата рецепта императивна или декларативна е?

Можете ли да сведете рецептата до възможно най малко различни видове команди? Така например, в моята рецепта за палачинки, аз използвам командата "Добавяме ___" за млякото и солта, но може би бих могъл да я използвам и за яйцата, вместо "Взимаме ___".

Можете ли да опишете рецептата си декларативно? (Или, ако вече е декларативна, да я опишете императивно?)

Ако искате, може да пробвате да опишете рецептата си в езика ORF (Open Recipe Format) ориентирайки се по някои от примерите тук (страницата е на Английски). (Бележка: ORF е сравнително неизвестен формат за рецепти, но за жалост не успях да намеря някой по-удачен за задачата.)