Никада се нисам професионално бавио програмирањем. Али то не значи да немам искуства у тој области људске делатности. У протеклих скоро пола века учествовао сам у реализацији пар озбиљних софтверских пројеката. А током деведесетих година прошлог века предавао сам и предмет Програмски језици на Техничком факултету у Чачку. Спремајући се за предавања упознао сам се са, по мом мишљењу изванредном књигом „Програмски језици и методе програмирања“, коју је написао некадашњи професор Електротехничког факултета у Београду, Јозо Дујмовић.
Стицајем околности у последње време сам поново почео да се бавим програмирањем, што ме наведе на мисао да покушам да јавности представим своје виђење ове делатности. Размишљајући о томе сетих се покојног професора Душана Славића, од кога сам научио елементарне ствари везане за програмирање. те 1974. године учили смо да програмирамо на програмском језику FORTRAN IV. Рачунар на коме су се наши програми извршавали био је IBM 1130, који је поседовао Електротехнички факултет.
Одласком у пензију, поред онога што је обележило моје професионално бављење струком почех да се помало занимам и осталим деловима рачунарства. Између осталог и програмирањем. Захваљујући Интернету могуће је наћи све што је потребно да се, чак и апсолутни почетник може почети бавити програмирањем. Међутим ако се погледају наставни планови и програми факултета у Србији, а поготову начин извођења наставе није тешко закључити да се ту мало шта променило у односу на време када сам ја правио прве кораке у програмирању. Промениле су се само платформе на којима се студенти начелно уче овој вештини. Помислих да је можда тренутак да део свог искуства, али и размишљања везаних за решавање проблема уз помоћ рачунара поделим са окружењем.
У Чачку, 19. фебруара 2022. године
Синиша Ранђић
Неки од почетака
Не бих помињао све проблеме и тешкоће које смо сретали током учења програмирања. Јер би то неминовно водило у домен легенди, а овај текст нема циљ да прича о занимљивостима из струке. Иако и то често има важност у оквиру образовања. Пошто сам студирао електронику, оквир у коме смо учили програмирање био је примерен инжењерској пракси. Једноставно учили смо како можемо да решавамо инжењерске проблеме уз помоћ рачунара. Било је то време кад још увек није било тзв. CAD/CAE (Computer Aided Design/Computer Aided Engineering) програма. у широкој примени. Сходно томе инжењери су морали сами дa развијају програме помоћу којих би могли да решавају одређене инжењерске проблеме. Иако је већ тада постојао велики број програмских језика, FORTRAN IV је био најкоришћенији језик за решавање научно – техничких проблема.
Савременим програмерима помињање FORTRAN IV програмског језика може чак изазвати мрштење. Али програмски језик С, који они доживљавају као исходиште свог заната тек је почињао да се користи. И слободно се може рећи није развијан са идејом да буде програмски језик опште намене, с обзиром да је развијан као програмски језик за развој софтвера у оквиру UNIX оперативног система. AT&T Bell Labs у којима је развијен UNIX и касније специфициран C програмски језик у основи није била рачунарска фирма. Рачунарска платформа на којој је вршен развој поменутих софтверских система били су рачунари из PDP фамилије фирме DEC.
Програмерско образовање
Циљ овог текста није да прикаже историју програмирања, односно развој програмских језика, као средства за програмирање рачунара. Програмирање рачунара треба посматрати са два аспекта. Први аспект се тиче самог програмирања, тј. начина како рачунар „натерати“ да ради оно што ми желимо. Што се другог аспекта тиче он се односи на конкретан разлог због кога се врши програмирање. А то је по правилу нека потреба човека. Са применом рачунара у процесу рада човек је постао корисник рачунара.
Што се тиче потребе коју човек исказује према рачунару, она је по правилу везана за његов конкретан посао. Тј. за рачунарску подршку проблемима и задацима са којима се корисник рачунара среће током рада. Стварна подршка човековом раду се остварује кроз рачунарске програме, а рачунар у ужем смислу представља физичку платформу која обезбеђује реализацију онога што је записано у програму. Током времена коришћење рачунара је бивало све погодније, што је програмирање чинило све потребнијим у раду савременог човека. Могућност прилагођавања резултата рада рачунарских програма човеку и начину његовог размишљања учинило је коришћење рачунара нeупитним.
Мало из историје програмирања
Половином седамдесетих година мини рачунари из фамилије PDP-11 постали су најпродаванији рачунарски системи на свету. Због релативно повољне цене постали су широко популарни у индустрији, а такође и акдемској средини. Захваљујући томе студенти су били у прилици да се током студија упознају и стекну искуство у раду са овим системима, али и UNIX оперативним системом и С програмским језиком. Захваљујући томе постали су најбољи пропагатори поменуте рачунарске фамилије, али и програмског окружења које није оригинално потекло из фирме DEC.
Некако у исто време Николас Вирт (Niclaus Wirth) је специфицирао програмски језик PASCAL. Био је намењен за учење програмирања и као језик за описивање алгоритама. Три програмска језика на које је овде указано су карактеристични са два аспекта. Сваки од њих је обележио одређени временски период у рачунарству. Са програмским језиком FORTRAN IV рачунари су коначно нашли своју примену у научно – техничким прорачунима. Програмски језик С је успоставио копчу између системског и апликативног програмирања коришћењем програмских језика високог нивоа. Коначно PASCAL је на неки начин одомаћио програмске језике који су омогућавали структурно програмирање чиме је превазиђена криза у развоју софтверу на прелазу из шесдесетих у седамдесете године прошлог века. С друге стране поменути програмски језици чинили су најважније платформе за програмерско образовање у последњих пола века. При чему се С још увек не предаје.
Поступак решавања проблема уз помоћ рачунара
Примена рачунара за решавање проблема/задатака у почетку се само надовезала на већ устаљену праксу њиховог „ручног“ решавања. Са развојем тзв. софтверског инжењерства дошло је до промена у начину решавања проблема уз помоћ рачунара. Али може се слободно рећи да је структура решавања готово oстала непромењена. Сходно томе поступак решавања проблема/задатака уз коришћење рачунара може да се шематски представи као на слици 1.
У оквиру фазе Дефинисање проблема даје се опис проблема који треба решити. У склопу тога дефинишу се улазни и излазни параметри проблема/задатка који се решава. Затим се прелази на фазу Израда алгоритма решења, тачније дефинисање поступка који треба спровести да би се дошло до решења проблема/задатка. Овај појам у данашње време има једноставно значење – поступак решавања проблема. Међутим, да би проблем био успешно решен, алгоритам, као један од елемената за решавање, мора да буде што јасније дефинисан. У литератури се може наћи читав низ дефиниција. Једна он најчешћих гласи – „Алгоритам је скуп строго дефинисаних корака, који воде решавању проблема“. Често уз ову дефиницију иде и ограничење у смислу коначности броја корака, које алгоритам треба да садржи. Међутим, постоје ставови, код којих би се алгоритам могао реализовати и кроз неограничени број корака.
Мало о алгоритмима
У општем случају појам алгоритам треба сматрати као упутство за решавање неког задатка или проблема. Међутим, алгоритам се данас по правилу везује за рачунарство. Сходно томе у савременој литератури, алгоритми се најчешће разматрају у контексту решавања проблема уз помоћ рачунара [1], [2], [3]. С обзиром на значај алгоритама у решавању проблема, њихово представљање је од битне важности. У пракси постоји више начина за приказивање алгоритама. Најпознатији су:
- Природни језик – процедура извршавања алгоритма се описује коришћењем неког од језика, којим се људи међусобно споразумевају. јасно је да ће овакав опис алгоритма бити разумљив само људима који говоре тај језик.
- Графички – овај начин представљања алгоритама назива се још и дијаграм тока. При опису се користе графички симболи којима се указује на операцију коју треба извршити. Симболи су повезани стрелицама, којима се дефинише ток извршавања алгоритма.
- Псеудокод – ради се о вештачком језику, специјално дефинисаном за ову намену. Као пример таквог језика може да послужи Pascal, који је Николас Вирт управо специфицирао, као језик за опис алгоритама. Тек касније је прихваћен као стандардни програмски језик [4].
- Програмски језик – са практичног аспекта опис алгоритма, коришћењем програмског језика представља рачунарски програм. На тај начин кроз програм имамо спој два елемента који се користе за рачунарску подршку решавању проблема. Алгоритмом се дефинише поступак решавања проблема. А програмски језик је средство којим се то саопштава рачунару.
Развој алгортитама при решавању различитих проблема/задатак је незаобилазна активност у склопу програмирања. Међутим, током развоја софтверског инжењерства укључујући и развој програмских језика дошло је до прилагођавања процеса развоја алгоритама рачунарској подршци решавању проблема.
Како се данас решавају проблеми
Поступак решавања проблема (слика 1) подељен је на два дела. На почетку коришћења рачунара за решавање проблема може се рећи да је та подела још увек била у важности. Међутим, са развојем алата за програмирање, пре свега програмских језика дошло је до стварања чвршће везе међу корацима у решавању проблема. Пре свега дефинисање проблема и израда алгоритма решења све више су морали да прате стање алата за програмирање и да им се прилагођавају. Ово је кулминирало развојем тзв. CASE (Computer Aided Software Engineering) Tools.
Развој алата за програмирање од програмских језика до CASE алата је пример како се развијао оквир у коме је настајала рачунарска подршка решавању проблема. Исходиште рачунарске подршке су били програми којима се омогућавало брже решавање проблема. Следећи корак је био развој и коришћење алата за пројектовање уз помоћ рачунара у различитим областима људске делатности. Овај текст нема намену да се бави различитим програмским системима које човек данас користи. Прича о њима наћиће своје место у другим секцијама овог WEB Портала.
Директна повезаност између процеса дефинисања проблема и израде алгоритма и коришћења рачунара, као платформе за решавање проблема види се кроз начин описа алгоритма. При томе се мисли на коришћење псеудокода односно програмских језика за опис алгоритам. Када се пређе у домен програмирања са слике 1 се види да следе два корака: избор програмског језика који ће се користити за програмирање и сам процес програмирања.
Избор програмског језика
Пре него се каже која реч на ову тему послужићу се искуством са манифестације Microsoft Developers Day одржане давне 1998. године у хотелу Hayat у Београду. Том приликом је Microsoft овдашњој софтверској јавности представио Visual Studio 6.0. Директор Microsofta за југоисточну Европу у једном тренутку упитао је присутну публику – „Који од алата у оквиру Visual Studio 6.0 би користили за развој својих апликација“? Из сале су се углавном чули одговори –„Visual C“. Пошто је направио драмску паузу директор је одговорио – „Па можете да користите који хоћете алат. Али ако желите да добијете ефикасну апликацију користиће те Visual C. А ако желите високу продуктивност у програмирању користиће те Visual Basic“. Као наставник програмирања, када смо стизали до избора програмског језика постављао сам студентима питање – „Који би програмски језик користили“? Сачекао бих њихове одговоре и користећи драмску паузу сам бих лаконски дао одговор – „Који знате“.
Ако се пође од постављених питања лако се долази до закључка да се иза њих стоје јасни изазови када је програмирање у питању. У првом случају генерално одговор је дефинисан алатима који су чинили корпус алата Visual Studio 6.0. Да би се боље сагледао проблем избора програмског језика послужиће шематски приказ процеса развоја прогрма, који је дат на слици 2.
"Пишемо" програм
Први корак у развоју програма представља Писање изворног кода програма или како се обично каже текста програма. Током ове операције алгоритам, односно кораци у решавању проблема који су њиме дефинисани описују се средствима конкретног програмског језика. Да би могао да се направи опис коришћењем програмског језика [5], [6] он мора да поседује одговарајућа својства, која се, као и код природног језика називају синтакса и семантика. Укратко под синтаксом програмског језика се подразумева начин коришћења израза за описивање алгоритамских корака. Истовремено под семантиком се подразумева значење тих израза у контексту операција које се специфицирају у оквиру програма. То значи да избор програмског језика, који ће бити коришћен за развој програма подразумева да постоје особе (програмери) који познају синтаксу и сематику датог програмског језика. За писање текста програма користе се одговарајући рачунарски програми који се називају едитори (уређивачи) текста. Као резултат се добија одговарајућа текстуална датотека.
Избор програмског језика у принципу је везан за конкретну примену. Тачније за проблем/задатак који се решава уз помоћ рачунара. Специфичности које одређују приступ рачунарском решавању проблема односе се на податке који се при томе обрађују односно операције које се при томе извршавају. Сходно томе мора да се води рачуна у којој мери потенцијално коришћени програмски језик директно подржава врсте података које треба обрађивати, односно операције које се извршавају над датим подацима.
Машинско програмирање
Најнижи ниво програмирања рачунара представља тзв. машинско програмирање, које се среће у два облика. Тзв. право машинско програмирање, код кога се рачунарске инструкције специфицирају директно у бинарном коду. И симболичко машинско програмирање, код кога се делови рачунарске инструкције специфицирају у симболичком облику. У овом случају среће се појам симболичког машинског језика [7] и потреба да се одговарајући програми преведу у бинарни код. Преводилац програма написаног у симболичком машинском језику у машински програм познат је под називом асемблер (assembler) [8]. За машинско програмирање неопходно је познавање инструкцијске архитектуре рачунара (ISA, Instruction Set Architecture) [9], [10].
Инструкцијска архитектура рачунара представља суштинску границу између хардвера и софтвера (слика 3). Практично она дефинише шта рачунар ради.
Поред архитектуре рачунара за рачунарски хардвер је важан и појам организације рачунара. Тачније начин како ради рачунар. Са аспекта програмирања ова карактеристика рачунара у принципу може да се занемари. Са нивоа програмирања инструкцијску архитектуру рачунара мора да познају пројектанти језичких преводилаца. Да би програм, написан на било ком програмском језику могао да се непосредно изврши мора се „превести“ у машински језик. А он је директна инкарнација архитектуре рачунара. Сходно томе често се као дефиниција архитектуре рачунара користи став – „Архитектура рачунара је начин на који пројектант језичког преводиоца види хардвер рачунара“ [11]. Са ширег аспекта ова дефиниција се може проширити на потребна знања пројектаната системског софтвера. Дакле поред пројектаната језичких преводилаца и на пројектанте оперативних система.
Приказу елемента инструкцијске архитектуре биће посвећена посебна секција Портала (Архитектура рачунара). Пошто је циљ овог текста да укаже на приступе стицања знања везаних за програмирање рачунара у наставку ће се дати кратак приказ тока развоја програма.
Литература
- Knuth, D., „The Art of Computer Programming: Vol 1: Fundamental Algorithms“, 3rd Edition, Addison – Wesley Professional, 1997
- Cormen, T. H., Leiserson, C. E., Rivest, R. L., Stein, C., „Introduction to Algorithms“, 3rd Edition, MIT Press, 2009
- Sedgewick, R., Wayne, K., „Algorithms“, 4th Edition, Addison – Weseley Professional, 2011
- Wirth, N., „Algorithms+Data Structures=Programs“, 1st Edition, Prentice – Hall, Series in Automatic Computation, 1976
- Louden, K. C., Lambert, K. A., „Programming Languages: Principles and Practices“, 3rd Edition, Cengage Learning, 2011
- Harper, R., „Practical Foundatios for Programming Languages“, 2nd Edition, Cambridge University Press, 2016
- Hyde, R., „The Art of Assembly Language“, 2nd Edition, No Starch Press, 2010
- Calingaert, P., „Assemblers, Compilers and Program Translation“, 1st Edition, Computer Science Press, 1979
- Patersson, D., Hennessy, J. L., „Computer Organization and Design RISC-V Edition: The Hardware Software Interface“, 2nd Edition, Morgan Kaufmann, 2020
- Harris, S. L., Harris, D., „Digital Design and Computer Architecture, RISC-V Edition“, 1st Edition, Morgan Kaufmann, 2021
- Amdahl, G. M., Blaauw, G. A., Brooks, F. P., „Architecture of the IBM System/360“, IBM Journal of Research and Development, Volume 8, Issue 2, April 1964