Почетак

Рачунарство и рачунарске науке су веома широке академске дисциплине. Области архитектуре рачунара, вештачке интелигенције, рачунарске графике, рачунарских мрежа, научних израчунавања и прорачуна, роботике, сигурности, као и десетине настајућих подобласти, се сваке године проширују новим техникама и открићима. Убрзан развој рачунарства и рачунарских наука утицао је на практично све аспекте људског живота. Трговина, телекомуникације, наука, уметност, разонода, политика, између осталих, су изнова оживели као рачунски домени.

Висок степен продуктивности рачунарства и рачунарских наука омогућен је тиме што су ове дисциплине изграђене на елегантном и моћном скупу темељних идеја. Сва израчунавања започињу представљањем информација, спецификацијом логике за њихову обраду, али и пројектовањем апстракција које руководе и управљају свом сложеношћу те логике. Савладавање ових основа захтеваће детаљно и тачно разумевање како рачунари тумаче рачунарске програме и спроводе рачунске поступке.

Ове основне идеје дуго се предају и изучавају користећи класичан уџбеник Структура и интерпретација рачунарских програма — СИРП (енг. Structure and Interpretation of Computer Programs — SICP) аутора Харолда Абелсона и Џералда Џеј Сасмана са Џули Сасман. Овај уџбеник се у великој мери наслања и преузима много из поменуте књиге коју су њени аутори љубазно лиценцирали дозволивши прераду и поновну употребу под Кријејтив комонс лиценцом. Такође, значајни делови преузети су и из разних бесплатних и слободних интернет материјала, пре свега из текста Компоновање програма (енг. Composing Programs) аутора Џона ДеНира који у суштини представља СИРП прилагођен програмском језику Пајтон, а који је доступан под истом лиценцом.

Целокупан овај текст објављен је под идентичном лиценцом, односно Кријејтив комонс Ауторство-делити под истим условима 4.0 међународна лиценца (енг. Creative Commons Attribution-ShareAlike 4.0 International License).

Програмирање у Пајтону

Да би се дефинисали рачунски поступци и процеси неопходан је програмски језик, по могућности разумљив многим људима и великом броју рачунара. У овој књизи, првенствено ће бити рађено са Пајтон програмским језиком.

Пајтон је широко коришћени програмски језик који је регрутовао ентузијасте из многих професија: веб програмере, инжењере видео игара, инжењере и научнике, академску заједницу, па чак и пројектанте нових програмских језика. Учењем Пајтона, придружујете се вишемилионској заједници програмера. Заједнице програмера су изузетно важне институције: чланови помажу једни другима у решавању проблема, деле своје пројекте и искуства и заједнички развијају софтвер и алате. Посвећени чланови често постају славни и нашироко поштовани за свој допринос.

Сам програмски језик Пајтон производ је велике заједнице добровољаца која се поноси разноликошћу својих сарадника. Језик је осмислио и направио Гвидо ван Росум крајем осамдесетих година прошлог века. Прво поглавље његовог Пајтон водича објашњава зашто је Пајтон толико популаран и поред многих других програмских језика доступних данас.

Пајтон се истиче као језик за обуку и подучавање јер су током своје историје Пајтонови развојни инжењери истицали читљивост изворног кода као једну од главних одлика, ојачану водећим принципима лепоте, једноставности и читљивости под називом Зен Пајтона. Пајтон је посебно прикладан за овај уџбеник, јер његов широк скуп функција подржава низ различитих стилова програмирања који ће бити истражени. Иако не постоји јединствени начин програмирања у Пајтону, постоји низ усвојених конвенција унутар заједнице програмера које олакшавају тумачење, разумевање и надоградњу постојећих програма. Пајтонова комбинација изузетне флексибилности и приступачности омогућава студентима да истраже многе парадигме програмирања, а затим да своја новостечена знања примене на хиљадама текућих пројеката.

Овај уџбеник задржава добро познат СИРП дух увођењем одлика програмског језика Пајтон корак по корак заједно са техникама апстракције и ригорозним моделом израчунавања. Поред тога, ове белешке пружају практичан увод у основе програмирања у Пајтону, укључујући такође и нека напредна језичка својства уз илустративне примере. Овладавање вештинама и побољшање способности програмирања у Пајтону требало би да дође природно како се напредује кроз текст.

Најбољи начин за учење програмирања у Пајтону јесте свакако директна интеракција са интерпретатором. Овај одељак врло укратко и поједностављено описује како инсталирати Пајтон 3, покренути интерактивни интерпретатор и (за)почети са програмирањем.

Пајтон инсталација

Као што је то случај и са свим другим истакнутим програмима, и Пајтон има много верзија. Овај уџбеник ће користити најновију стабилну верзију Пајтона 3. Нису ретки рачунари на којима већ постоје инсталиране старије верзије Пајтона, као што је Пајтон 2.7, али се оне не подударају са описима и примерима изнетим у наставку овог текста. Практично било који комерцијално доступан рачунар је више него довољан, али би на њему требало инсталирати Пајтон 3, који је наравно у потпуности бесплатан.

Пајтон 3 је могуће преузети са званичне интернет странице за преузимање Пајтон програмског језика. Само је потребно следити упутства и довршити исталацију. Такође, скоро сви савремени оперативни системи већ укључују Пајтон као готов инсталациони пакет те се на њима он може инсталирати и директно преко система за управљање пакетима.

Интерактивне сеансе

У интерактивним Пајтон сеансама сам Пајтон изворни код се куца након упита, >>>. Пајтон интерпретатор чита и извршава оно што се укуца испуњавајући на тај начин разне наредбе.

Да би се започела интерактивна сеанса треба покренути Пајтон једноставним куцањем python3 у конзоли, односно терминалу или отварањем Пајтон 3 апликације, све у зависности од оперативног система.

Када се прикаже Пајтонов упит, >>>, то је знак да је интерактивна сеанса успешно започета. Ове белешке приказују примере интеракција преко упита праћеним неким уносима.

>>> 2 + 3
5

Интерактивне контроле

Свака сеанса чува историју уноса. Уносима у историји се приступа притиском на <Ctrl>+p (претходни) и <Ctrl>+n (наредни). Стрелице горе и доле такође пролазе кроз историју на неким оперативним системима. Излазак из сеансе могућ је преко <Ctrl>+d и том приликом се брише историја уноса.

Први пример

Живот је несхватљиво чудо, јер се непрестано троши и осипа, а ипак траје и стоји чврсто »као на Дрини ћуприја«.

—Иво Андрић

Како би се Пајтону пружио одговарајући увод, излагање ће бити започето примером који користи неколико језичких одлика. У следећем одељку ће се кренути од нуле и програмски језик Пајтон ће се надограђивати део по део. Овај одељак се може посматрати као кратак преглед онога што долази.

Пајтон поседује уграђену подршку за широк спектар уобичајених програмерских активности, попут обраде текста, графичког приказа и комуникације путем интернета. Следећа линија Пајтон кода

>>> from urllib.request import urlopen

представља import наредбу која учитава функционалност за приступ интернет подацима. Конкретно, претходна наредба чини доступном функцију под називом urlopen која може приступити одређеном садржају на некој интернет адреси.

Наредбе и изрази

Пајтон код се састоји од израза и наредби. Уопштено говорећи, рачунарски програми садрже упутстава за:

  1. израчунавање неких вредности, или

  2. извршавање неких радњи.

Наредбе обично описују радње. Када Пајтонов интерпретатор изврши наредбу, спроводи и одговарајућу радњу. С друге стране, изрази обично описују израчунавања. Када Пајтонов интерпретатор вреднује израз, он заправо израчунава вредност тог израза. Ово поглавље уводи неколико врста наредби и израза.

Наредба доделе

>>> наДриниЋуприја = urlopen('http://raw.githubusercontent.com/milovanovic/ivoandric/master/Drina.txt')

повезује име наДриниЋуприја на вредност израза који следи након =. Тај израз примењује urlopen функцију на интернет адресу која садржи комплетан текст романа На Дрини ћуприја српског књижевника и нобеловца Иве Андрића.

Функције

Функције обухватају логику која манипулише подацима. На пример, urlopen је функција. Интернет адреса је један податак, а сам текст романа је неки други податак. Процес којим први води до другог може бити сложен, али тај процес се може применити користећи само једноставан израз јер је та сложеност обухваћена и уметнута унутар функције. Функције су примарна тема овог поглавља.

Друга наредба доделе

>>> речи = set(наДриниЋуприја.read().decode().split())

повезује име речи са скупом свих јединствених речи и облика истих које се појављују у роману На Дрини ћуприја, свих пар десетина хиљада њих. Свака од уланчаних наредби за читање (read), декодирање (decode) и раздвајање (split) оперишу над рачунским међурезултатом, односно читају се подаци из отворене интернет адресе, затим се ти подаци декодују у текст и на крају се тај текст дели у речи. Све те речи се смештају у set, то јест скуп.

Објекти

Скуп, односно set је врста објекта који подржава операције над скуповима попут израчунавања пресека скупова и провере чланства. Објекат неприметно спаја заједно податке и логику која њима манипулише, на начин који је погодан за управљање сложеношћу оба. Објекти су примарна тема наредног поглавља. Коначно, израз

>>> sorted({реч for реч in речи if len(реч) > 3 and реч[::-1] in речи})
['ипак', 'капак', 'капи', 'кулук', 'мелем', 'мојом', 'ромор', 'терет']

је сложени израз који из скупа прави сортиран низ свих речи, не краћих од четворословних, у роману На Дрини ћуприја које су истовремено исправне речи написане обрнуто. Тајанствени запис реч[::-1] набраја једно по једно слово у речи, али -1 налаже да се то ради у обрнутом редоследу, односно уназад. Када се израз унесе у интерактивну сеансу, Пајтон исписује његову вредност у следећем реду.

Интерпретатори

Вредновање сложених израза захтева прецизан поступак који тумачи изворни код на предвидљив начин. Програм који примењује такав поступак, вреднујући сложене изразе, назива се интерпретатор. Пројектовање и имплементација интерпретатора примарна је тема трећег поглавља.

У поређењу са другим рачунарским програмима, интерпретатори програмских језика су јединствени по својој општости. Пајтон није пројектован имајући у виду Иву Андрића. Међутим, његова велика флексибилност омогућила је да се обради велика количина текста само помоћу неколико наредби и израза.

На крају ће бити откривено да су сви ови основни концепти уско повезани: функције су објекти, објекти су функције, а интерпретатори су инстанце оба. Међутим, развијање јасног разумевања сваког од ових концепата и њихове улоге у организацији изворног кода пресудно је за овладавање вештином програмирања.

Грешке

Чекајући на наредбу Пајтон подстиче експериментисање са језиком, иако корисник можда још увек не познаје у потпуности речник и структуру језика. Ипак, треба бити спреман на грешке. Иако су рачунари изузетно брзи и флексибилни, истовремено су и крајње крути. Природа рачунара може бити описана као

Основна једначина рачунара је:

рачунар = моћан + глуп

Рачунари су врло моћни у брзом прегледу великих количина података. Рачунари дословно могу да изврше милијарде операција у секунди. Међутим, појединачне „операције” које рачунари могу да изврше су изузетно једноставне и механичке, нимало налик људским мислима или увиду. Типичне „операције” укључују поређење бројева или сабирање два броја.

Дакле, иако су рачунари брзи у ономе што раде, операције које могу да изведу изузетно су круте, једноставне и механичке. Другим речима, рачунари нису ни налик нечему као ХАЛ 9000 из култне књиге или познатог филма.

Кључна порука је та да се рачунар не понаша као људски мозак. Рачунар је механички алат који може да уради невероватне ствари, али захтева од човека да му каже шта да ради.

Крутост рачунара постаје очигледна одмах, већ приликом првог експериментисања и испробавања Пајтоновог интерпретатора: чак и најмање промене у куцању и форматирању изазивају неочекиване резултате и грешке.

Тумачење грешака и дијагностиковање, односно утврђивање узрока неочекиваних грешака назива се дебаговање. Неке водиље и смернице дебаговања и отклањања грешака су:

  1. Поступно тестирање: Сваки добро написан програм састоји се од малих модуларних компоненти које се могу тестирати појединачно. Све што се напише треба испробати што је пре могуће како би се што раније уочили и отклонили проблеми и стекло поверење у компоненте.

  2. Изолација грешака: Грешка у излазу наредбе обично се може приписати одређеној модуларној компоненти. Приликом утврђивања проблема, треба пратити грешку све до најмањег дела изворног кода пре самог покушаја да се та грешка отклони.

  3. Провера претпоставки: Интерпретатори извршавају наредебе и одговарају на упите буквално – ни више ни мање од тога. Излаз је неочекиван када се понашање неког изворног кода не подудара са оним што програмер сматра (или претпоставља) да би то понашање требало да буде. Неопходно је бити свестан својих претпоставки, а затим усредсредити напоре приликом дебаговања на проверу да ли те претпоставке заиста важе.

  4. Консултације са другима: Нисте сами! Уколико је порука о грешци неразумљива, увек је могуће питати колегу, наставника или потражити помоћ на интернету. Ако је грешка изолована, али није најјасније како је исправити, може се замолити још неко да је погледа. Много драгоценог програмерског знања бива подељено у процесу заједничког решавања проблема.

Поступно тестирање, модуларно пројектовање, прецизне претпоставке и тимски рад су теме које се провлаче кроз читав овај рукопис. Надајмо се да ће се исте теме провлачити и кроз читаве ваше инжењерске каријере.