Урок 1, 🥞 Видове програмиране (обяснено с палачинки!)
Основни точки от този урок
Една рецепта, подобно на една компютърна програма, е съставена от поредица от стъпки.
Например, вижте следната рецепта за смес за палачинки:
Смес за палачинки:
- Взимаме 2-3 яйца, и ги счупваме в една купа.
- Разбиваме добре.
- Добавяме 1-2 чаши прясно мляко.
- Добавяме сол на вкус (аз ги правя без захар)
- Бъркайки, добавяме по малко брашно, докато не стане с гъстота на боза
Тази рецепта е подобна на една императивна програма. "Императивна" (подобно на думата "император") ще рече че програмата е съставена от команди. Така например, първата команда е "Взимаме 2-3 яйца, и ги счупваме в една купа". Тези команди се изпълняват една след друга в точно указания ред. Не можем примерно да изпълним стъпка 2 (разбиваме яйцата) преди да сме изпълнили стъпка 1 (счупваме яйцата).
Също, може да забележим че "(аз ги правя без захар)" не е команда. Това е коментар, който служи да подскаже защо не съм описал захарта в рецептата — не защото рецептата не става със захар (в който случай бих написал "не слагаме захар" като инструкция), нито пък защото съм забравил че в палачинките се слага захар, а защото аз лично по принцип не слагам захар.
В момента, за да разберем какви продукти ни трябват за да изпълним рецептата се налага да прочетем всяка стъпка внимателно и да предположим какво би ѝ било нужно. По лесно би било ако направим списък от продуктите най-отгоре:
Смес за палачинки:
- 2-3 яйца
- 1-2 чаши прясно мляко
- ~2 чаши брашно
- Взимаме яйцата, и ги счупваме в една купа.
- Разбиваме добре.
- Добавяме прясното мляко.
- Добавяме сол на вкус (аз ги правя без захар)
- Бъркайки, добавяме по малко брашно, докато не стане с гъстота на боза
Описанието на продуктите най-отгоре е подобно на една декларативна програма. "декларативна" (от думата декларация) ще рече че програмата е описание на крайния резултат. Вече няма значение реда или начина по който някой ще набави тези продукти, а само че след като свърши "изпълнението" на списъка от продукти, имаме всички нужни продукти на масата.
В този ред на мисли, бихме могли да опишем и цялата рецепта като описание на крайния продукт. Може би нещо от рода на това, използвайки скоби за да е ясен реда на операциите:
Смес за палачинки: ((2-3 яйца, счупени и разбити) + (1-2 чаши прясно мляко)) + брашно, докато не стане с гъстота на боза
Императивните и декларативните програми се използват в различни случаи. И често се комбинират.
Една императивна програма е по-лесна за разбиране (обикновено) и изпълнение, но за сметка на това, няма как да преценим какъв ще бъде крайния резултат от изпълнението ѝ, освен ако не я изпълним от край до край. Една декларативна програма е по-лесно да бъде трансформирана по някакъв начин и ясно може да преценим какъв ще бъде крайния резултат, но за сметка на това е по-трудно да разберем как точно се изпълнява.
Императивни програми най-често се използват за неща, които са интерактивни по някакъв начин, например приложения, игри, операционни системи и прочие. Декларативни програми се използват най-често за неща, за които не искаме да обясняваме всяка стъпка, а само желания резултат; например конфигурации на програми, страници с текст, или пък заявки към бази от данни.
Програмния език JavaScript, за който ще учим в следващите уроци, е императивен. Това значи че всяка команда и линия код се изпълнява стъпка по стъпка, точно в реда в който сме ги задали. В последствие, ще работим и с някои декларативни програмни езици, но смятам че е полезно да се сблъскаме с тези два термина от рано.
Задача (по желание)
Попитайте някой възрастен около вас да ви разкаже някоя рецепта, която знае, и пробвайте да я запишете.
Има ли неща, които са коментари? Оградете ги в скоби!
Вашата рецепта императивна или декларативна е?
Можете ли да сведете рецептата до възможно най малко различни видове команди? Така например, в моята рецепта за палачинки, аз използвам командата "Добавяме ___" за млякото и солта, но може би бих могъл да я използвам и за яйцата, вместо "Взимаме ___".
Можете ли да опишете рецептата си декларативно? (Или, ако вече е декларативна, да я опишете императивно?)
Ако искате, може да пробвате да опишете рецептата си в езика ORF (Open Recipe Format) ориентирайки се по някои от примерите тук (страницата е на Английски). (Бележка: ORF е сравнително неизвестен формат за рецепти, но за жалост не успях да намеря някой по-удачен за задачата.)