Pitanja sa predavanja Flashcards
.
Шта је програмски језик? Чему служи програмски језик?
Програмски језик је скуп синтаксних и семантичких правила који служи за опис
рачунарских програма. Служи за комуникацију између човека и рачунара, између 2 машине,
а може служити и за комуникацију између двоје људи, тако што нпр.Читају код један
другом.
Предности и мане машински зависних језика у односу на машински независне.
Предности: ближи су архитектури па су погоднији за оптимизацију и ефикаснији су, лакше и брже се преводе на машински језик.
Мане: потребно је детаљно познавање архитектуре/хардвера, теже се дебагује
Шта је парадигма? Шта је програмска парадигма?
Парадигма је шаблон/оквир по коме се нешто дешава. Програмска парадигма је
шаблон/скуп правила које задовољавају сви програмски језици који спадају у ту парадигму.
Она је одређен начин на који се врши програмирање
Навести 4 основне програмске парадигме.
Импреативна, ООР, логичка и функционална.
- Које су основне особине процедуралне програмске парадигме?
Процедуралну парадигму карактерише то да ми задајемо ток извршавања програма, тј.
ми описујемо решење проблема, а машина прати наше решење.
Које су основне особине декларативне програмске парадигме?
За разлику од процедуралне декларативна је описна, тј. програмер описује проблем, а
сам механизам долази до решења проблема.
Навести 2 најпознатија језика функционалне парадигме.
LISP, Haskell
Навести 2 најпознатија језика логичке парадигме.
Prolog, ASP
Навести главне представнихе упитних језика базе података.
SQL, xQuery
Навести 4 додатне програмске парадигме.
Конкурентна, компонентна, скриптна, реактивна
Навести основну особину реактивног програмирања.
Код реактивног програмирања акценат је на преношењу измена приликом асинхроне
промене података. Нпр. а+б=ц значи да свака промена вредности променљивих а и б, утиче
на вредност променљиве ц.
Навести 2 типичне особине скрипт језика.
Динамички типизирани и интерпретирају се.
Да ли је парадигма програмирања ограничења декларативна или императивна.
Објасни.
Она је декларативна зато што се заснива на постављању релација између
променљивих у виду ограничења и пуштању програма да сам дође до решења које
задовољава те релације
Пример домена употребе компонентне парадигме
Креирање интерфејса апликације-постављање текстуалних поља, прозора, дугмића
Шта је генеричко програмирање?
То је стил програмирања у којем се алгоритми пишу са апстрахованим типовима где се типови об као параметри да би се избегло дуплирање кода.
- Навести основне особине конкурентне парадигме.
Конкурентна парадигма представља више процеса који се извршавају истовремено и имају исти о.
- Које форме конкурентности постоје?
Конкурентност у ужем смислу-један процесор, једна меморија
Паралелно програмирање-више процесора, једна меморија,
Дистрибуирано програмирање- више процесора, више меморија
- Да ли су језици за обележавање текста програмски језици? Образложи.
Нису, јер се не уклапају у саму дефиницију програмских језика, јер се по дефиницији
језиком задаје неко израчунавање, док се овде не врши никакво израчунавање, нити се врши
неки програм.
- Шта представља програмирање ограничења?
Програмирање ограничења је програмска парадигма, подпарадигма декларативне
парадигме, где се проблем задаје у терминима променљивих и ограничења које те
променљиве морају да задовоље.
- Да ли је програмирање ограничења декларативна или императивна парадигма?
Декларативна је, јер се не задаје поступак, већ се постављају услови које променљиве морају да испуњавају.
- У којим доменима се користи програмирање ограничења?
Углавном се користи у решавању комбинаторних и оптимизационих проблема, тј. у
оптимизационим истраживањима
- Наведи 3 програмска језика која имају подршку за програмирање ограничења.
С++, Јава, Пајтон
- Наведи 3 библиотеке за програмирање ограничења за С++, Јава, Пајтон.
- Нека је дата следећа једнакост: ONE+THREE+FOUR=EIGHT. Формулиши домене и
ограничења.
За О, Т, F домен је {1-9}, док је за остала слова домен {0-9}, а услови су:
100O+N10+E+10000T+1000H+100R+10E+E+1000F+100O+10U+R=10000E+1000*
I+100G+10H+T.
- Како је Џон Бакус утицао на развој функционалних језика?
Најзначајнији је због његовог рада везаног за развој Фортрана. Био је добитник
Тјурингове награде поводом чега је одржао говор о предности функционалних језика у
односу на императивне, јер су читљивији, поузданији и вероватније исправни.
- Који су најпознатији функционални програмски језици?
LISP, Haskell, Scala, F#, Elixir
- Који је домен употребе функционалних програмских језика?
Они су језици опште намене и могу се свуда користити. Нпр. за обраду базе података,
биоинформатику, финансијско моделирање, ста
- Која је основна апстракција у функционалној програмској парадигми?
Функцијса
- Да ли математичке функције имају пропратне ефекте? Образложи.
Немају, у математичким функцијама нема параметра који би могао да утиче на
резултат као нпр. глобална променљива, већ за исти улаз увек добијамо и исти излаз
- Шта су то функције вишег реда? Навести неке најбитније.
Функција вишег реда је функција која прима другу функцију као параметар или је
враћа као повратну вредност или оба. Примери: map, fold(reduce), filter
- Шта се подразумева под појмом транспарентности референци и шта је основна
последица?
То значи да вредност израза не зависи од контекста у ком се налази, а основна
последица је непостојање бочних ефеката.
. Ко је творац програмског језика Хаскел?
Међународни комитет/Хаскел Кари
- Које су основне карактеристике програмског језика Хаскел?
Чист функционални језик, лења израчунавања, статички типизиран, строго типизиран
језик, има мочни систем типова..
- Шта је статичко, а шта динамичко типизиран језик? Навести по један пример.
Статички типизиран језик је језик где се типови одређују у фази компилације, док се у
динамички типизираном језику типови одређују при извршавању. Статички типизиран је
Хаскел, а динамички Пајтон
Објасни појам лење евалуације
Лења евалуација подразумева да се не раде непотребна израчунавања, нпр. при
израчунавању израза тачно || некиИзраз, некиИзраз се неће израчунавати јер нам његова
вредност није потребна
. Шта је слабо, а шта строго типизиран језик? Наведи примере
Строго типизиран језик значи да сви типови морају да се поклапају, нема
имплицитних конверзија. Није могуће извршавати математичке операције са подацима
различитих типова. Нпр. не можемо да помножимо 3.5*2. Пример је Хаскел. Слабо
типизиран језик значи да има имплицитних конверзија и да је претходно израчунавање
могуће јер се у том случају прво изврши конверзија броја 2 у 2.0, и затим и резултат буде
реалан број-7.0.Пример је С
- Наведи основне типове података у Хаскелу.
Bool, Char, Int, Integer, Float, String
- Шта су листе у Хаскелу?
Листа је колекција истих типова произвољне дужине (колико то меморија омогућава).
- Шта су торке у Хаскелу?
Торке су колекције фиксираног броја вредности, али различитих типова.
- Наведи 3 функције за рад са листама у Хаскелу.
Map, foldl, foldr, filter
- Шта је то грађанин првог реда у контексту програмских језика?
Градивни елемент у оквиру језика у коме не постоји рестрикција креирања и коришћења.
- Наведи примере грађана првог реда у С-у.
Int, double, float, показивачи…
- Да ли су функције грађани првог реда у С-у? Образложи.
Нису, јер се не могу саме прослеђивати, већ се могу прослеђивати само показивачи на
те функције.
- Наведи примере појмова који нису грађани првог реда у С-у.
Функције, низови..
- Да ли је функција грађанин првог реда у Хаскелу?
Јесте
- Шта су то функције вишег реда?
То су функције које као повратну вредност имају неку функцију или је имају као
аргумент или оба.
Користећи фју map у Хаскелу напиши израз којим се сваки члан листе [1,3,7]
увећава за 1.
map(+)[1,3,7]
Користећи фју map у Хаскелу напиши израз којим се сваки члан х листе [1,3,7]
замењује кубом броја х+1
Map(3+1)[1,3,7],
map(3)(map(+1)[1,3,7])
Koристећи функцију foldl у Хаскелу напиши израз којим се израчунава производ
елемената листе природних бројева [1,2,3,10]
foldl(*)1[1,2,3,10]
- Koристећи функцију foldl у Хаскелу напиши израз којим се израчунава сума
апсолутних вредности елемената листе природних бројева [1,-2,3,-10]
foldl(+)0(map(abs)[1,-2, 3, -10]).
Како се најприродније остварује понављање извршавања наредби у императивним,
а како у функционалним програмским језицима?
У императивним итерацијом, а у функционалним рекурзијом.
- Шта су то чисти функционални језици?
Чисти функционални језици су они који не допуштају никакве пропратне ефекте
(потпуна транспарентност референци).
- Наведи 3 чиста функционална језика.
Хаскел, Миранда, Clean
Да ли је могуће дозволити неке бочне ефекте у контролисаним условима и и даље
задржати потпуну транспарентност референци?
Не, ако хоћемо да имамо у потпуности транспарентност референци не смемо
допустити никакве пропратне ефекте.
Шта нам омогућава својство транспарентности референци што није омогућено у
нпр. императивном програмирању где не постоји то својство?
Необавезан је експлицитни редослед навођења функција, битно је да се дефинише
израз који представља решење проблема, док је код императивних редослед битан
Којим наредбама се најчешће мења стање програма?
Најчешће наредбом доделе (директно са =, а индиректно са ++)
Наведи примере 2 познате функције у којима је неизбежно нарушити
транспарентност референци
Random, scanf
Шта је мана код транспарентности референци?
Не смемо користити пропратне ефекте, што је доста тешко јер постоје алгоритми
којима је суштина да мењају стања, а неке функције постоје само због својих пропратних
ефеката (scanf)
- Шта су погодности код транспарентности референци?
Програми су формално концизни (блиски математичком запису), прикладни за
формалну верификацију (провера исправности програма је скроз математичка), мање су
подложни грешкама, лакше их је оптимизовати и трансформисати
- Навести 3 функционална језика која имају и особине императивних језика.
Scala, Python, Ruby
Када хоћемо да дамо предност брзини извршавања да ли бирамо статички или
динамички типизиране језике и зашто?
Бирамо статички типизиране јер не постоји додатна провера типова током извршавања (типови одређени у фази компилације).
- Када бирамо динамички типизиране језике?
Када желимо да имамо већу флексибилност по цену мало споријег извршавања.
- Да ли се код статички типизираних језика типови морају навести? Образложи.
Није увек неопходно, нпр. Хаскел је статички типизиран језик, али ипак не морамо да
наводимо типове већ их он сам може закључити
- Шта је типски разред. Наведи 3 типа.
Типски разред казује које особине мора да има неки тип да би над њим могла да се
изврши нека операција. Они дефинишу и које функције мора неки тип да имплементира да
би припадао том разреду. Примери: типови са једнакошћу, типови са уређењем, нумерички типови.
- Навести пример типа података код кога не постоје типски разреди.
Комплексни бројеви, буловске вредности
- Када је нека функција полиморфна?
Функција је полиморфна уколико за аргументе може да прима аргументе различитог
типа при позиву.
- Шта је типска променљива и шта нам она омогућава?
Означавају променљиве које се односе на тип. Омогућавају нам да дефинишемо
типове функција које су полиморфне , тј. да функције раде са било којим типом података
који се уклапа у типску променљиву.
- Када се за неки језик каже да је слабо типизиран, а када да је јако типизиран?
Слабо типизиран је када се не поклапају типови, а јако типизиран је када се сви
типови морају поклапати
- Шта је то стриктан израз, а шта нестриктан? Навести по пример.
Стриктан израз је онај који се може израчунати само ако су познати сви параметри.
Нестриктан израз је онај који се може израчунати чак и ако неки параметри нису наведени.
Примери: нестриктан израз- а||b, стриктан израз- а+б
- Када се за неку семантику каже да је стриктна, а када да је нестриктна?
Семантика је стриктна када за сваки израз проверава да ли постоји вредност за све
променљиве било оне потребне за израчунавање израза или не. У супротном је нестриктна.
- Да ли Хаскел има стриктну или нестриктну семантику?
Нестриктну.
- Навести 2 програмска језика са стриктном семантиком.
LISP, Scala
- Који је животни век променљивама у функционалном језику?
Не постоје променљиве, па ни њихов животни век.
- Како је организовано руковање меморијом приликом извршавања програма за
податке који се више не користе у програму?
О деалокацији меморије брине се сакупљач отпадака, објекти у меморији се деле по
старости а очекује се да ће млађи објекти брже бити искоришћени и уклоњени.
- Који су изазови у прављењу компајлера за функционалне језике?
Изазов је направити компајлер који подржава транспарентност референци, бесконачне
структуре података..
- Да ли је ефикасност предност или мана функционалних програмских језика?
Предност, раније је била мана, али доста је узнапредовало, тако да сада Хаскел има
ефикасност као нпр.С.