Програмски језик

Програмски језик је формални језик који се може користити за контролу понашања машине, нарочито рачунара.[2]

Изворни код једноставног рачунарског програма написан програмским језиком C, чији је излаз порука „Hello, world!” након што се програм компилира и изврши.[1]

Најранија позната програмибилна машина која је претходила изуму дигиталног рачунара био је аутоматски флаутиста, направа коју су у 9. веку описала браћа Муса из Багдада, током Исламске златне ере.[3] Почетком 1800-их, „програми” су кориштени за управљање радом машина као што су Жакаров разбој, музичка кутија или свирач клавира.[4]

Програмски језици се користе да олакшају комуникацију са рачунаром приликом организовања и манипулације информација, али и да прецизно изразе алгоритме. Неки аутори ограничавају израз „програмски језик“ само на језике којима се могу изразити сви могући алгоритми, а понекад се користи израз „рачунарски језик“, који се односи на више ограничене вештачке језике. Створено је више хиљада програмских језика, и нови се стварају сваке године. Многи програмски језици језици захтевају да се прорачун специфицира у императивној форми[5][6] (нпр., као секвенца операција које се морају извршити), док други језици користе друге форме програмских спецификација, као што је декларативна форма[7][8] (нпр. жељени резултат се специфицира, а не како да се оствари).

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

Дефиниције уреди

Програмски језик је било који од вештачких језика којим је могуће дати детаљне инструкције рачунару, што су спецификације за израчунавање или алгоритам.[2] Те инструкције се могу извршавати директно када су уграђене у рачунар у посебном облику који је одредио произвођач, тзв. машински језик, после једноставног процеса замене изражене у одговарајућем асемблерском језику, или после превођења из неког језика вишег нивоа. Машински и асемблерски језици су језици ниског нивоа, који захтевају од програмера да се посвети управљању свим аспектима везаним за чување података и операције над њима. На другом крају налазе се језици високог нивоа, који су ближи природном језику и ослобађају програмера бриге о тим стварима, такође су читљивији и далеко лакши за писање програма.

Програмски језици се, према начину описивања рада програма, деле на функцијске (Лисп, Scheme), процедуралне (C, Паскал, Бејзик), секвенцијалне и објектно-оријентисане (Јава, Ада), структуралне (SQL) и многе друге. Програмски језици по овој подели могу бити и мешовити, тј. да дозвољавају различите парадигме у оквиру истог програма, те нпр. C++} дозвољава и објектно-оријентисани и процедурални приступ, штавише процедурални приступ је неопходан при дефиницији почетне тачке програма у функцији main.

Неки, мада не сви, аутори ограничавају термин „програмски језик” на оне језике који могу да изразе све могуће алгоритме.[2][9] Својства која се обично сматрају важним за конституцију програмског језика обухватају:

Функција и циљ
Рачунарски програмски језик је језик који се користи за писање рачунарских програма, чиме су обухваћени рачунар који изводи неку врсту рачунања[10] или алгоритам и могуће контролу спољашњих уређаја као што су штампачи, дискови за чување података, роботи,[11] и тако даље. На пример, PostScript програме фреквентно праве други програми ради контроле рачунарског притера или дисплеја. Генералније, програмски језик може да опише рачунање на некој, можда апстрактној, машини. Генерално је прихваћено да комплетна спецификација за програмски језик обухвата опис, често идеализовани, машине или процесора за тај језик.[12] У већини практичних сценарија, програмски језик је везан за рачунар; консеквентно, програмски језици се обично дефинишу и проучавају на тај начин.[13] Програмски језици се разликују од природних језика по томе што се природни језици једино користе за комуникацију међу људима, док програмски језици исто тако омогућавају људима да комуницирају инструкције машинама.
Апстракције
Програмски језици обично садрже апстракције за дефинисање и манипулисање структурама података или контролисање извршног протока. Практична неопходност да програмски језик подржава адекватне апстракције је изражена принципом апстракције,[14] који се понекад формулише као препорука програмеру да на одговарајући начин користи такве апстракције.[15]
Изражајна моћ
Теорија израчунљивости класификује језике по прорачунима које су способни да изразе. У свим језицима који су потпуни у Тјуринговом смислу може се имплементирати исти сет алгоритама. ANSI/ISO SQL-92 и Charity су примери језика који нису Тјурингов потпуни, мада се често називају програмским језицима.[16][17]

Језици за обележавање као што су XML, HTML, или troff, и који дефинишу структуиране податке, обично се не сматрају програмским језицима.[18][19] Програмски језици могу, међутим, да имају заједничку синтаксу са језицима за обележавање, ако је рачунарска семантика дефининсана. XSLT, на пример, је Тјурингов комплетан XML дијалекат.[20][21][22] Штавише, LaTeX, који се углавном користи за структуирање докумената, исто тако садржи пун Тјурингов комплетан подскуп.[23][24]

Термин рачунарски језик се понекад користи синонимно са програмским језиком.[25] Међутим, употреба ова два термина варира међу ауторима, а постоје разлике и у погледу њиховог тачног опсега. Један облик употребе описује програмске језике као подскуп рачунарских језика.[26]:163–170 У том смислу, језици који се користе у рачунарству са различитим циљевима него што су изражавања рачунарских програма генерално су наменски дизајнирани рачунарски језици. На пример, језици за обележавање се понекад називају рачунарским језицима да би се нагласило да они нису намењени да се користе за програмирање.[27]

Једно алтернативно гледиште на употребу језика сматра програмске језике теоретским констрактима за програмирање апстрактних машина, а рачунарске језике њиховим подскупом који се извршава на физичким рачунарима, који имају коначне хардверске ресурсе.[28] Џон Рејнолдс наглашава да су језици са формалном спецификацијом у истој мери програмски језици колико су и језици намењени извршавању. Он исто тако сматра да су текстуални, па и чак графички уноси, који утичу на понашање рачунара програмски језици, упркос чињенице да они обично нису Тјуриншки комплетни, и напомиње да је игнорисање концепата програмских језика разлог постојања многих недостатака у улазним форматима.[29]

Машински и асемблерски језици уреди

Машински језик се састоји од нумеричког кода за операције који одређени рачунар може директно извршити.[30] Тај код је алфанумеричка серија 0 и 1, или бинарни код (бајт), који се често претвара у хексадецимални код (на бази броја 16), ради лакше читљивости и модификације. Инструкције машинских језика обично користе један број бајтова за представљање операција, сабирање на примјер, а други за представљање операнда (бројева са којима се врши операција) и/или локације за слиједећу инструкцију. Машински језик је тежак за читање и писање, пошто не личи на конвенционално математичко представљање нити на природни језик, а његов код варира од рачунара до рачунара.

Асемблерски језик је један ниво изнад машинског језика. Користи кратки мнемонички код за инструкције и омогућава програмеру да уноси имена за блокове меморије која садржи податке. Дизајниран је да омогући лако превођење у машински језик. Иако се блокови података у асемблерском језику позивају преко имена, a не преко адресе у меморији, ипак не постоји могућност софистикованог организовања сложених информација. Као и машински језик, асемблерски језик захтијева од програмера детаљно познавање рачунарске архитектуре. Користан је када су ти детаљи важни, односно приликом програмирања рачунара за интеракцију са улазним и излазним уређајима, као што су штампачи, скенери, уређаји за чување података и информација (оптички и чврсти дискови), итд.

Алгоритамски језици уреди

Алгоритамски језици су дизајнирани да изразе математичка и симболичка израчунавања. Њима се могу изразити алгебарске операције на сличан начин као у математици и омогућавају коришћење потпрограма у којима се пакују најчешће коришћене операције, које је могуће поново искористити.

Фортран уреди

Први важнији алгоритамски језик у историји програмирања је Фортран (скраћеница од енглеског „formula translation“). Дизајнирао га је тим програмера америчке компаније IBM, 1957. године, на чијем је челу био Џон Бакус. Дизајниран је са идејом да служи потребама научника и научних израчунавања са реалним бројевима (бројевима са покретним зарезом) као и скуповима реалних бројева организованих у један или више низова.

Алгол уреди

Алгол (скраћеница од енглеског израза algorithmic language - „алгоритамски језик“) је дизајнирао комитет америчких и европских научника рачунарства за сврху објављивање алгоритама, али и за рачунарска израчунавања, између 1958. и 1960. године. Алгол посједује рекурзивне потпрограме, односно процедуре које могу саме себе позивати приликом рјешавања задатог проблема, редукујући га на мањи проблем било које врсте. Новост у Алголу је блоковна структура, гдје је програм компонован од блокова и може да садржи и податке и инструкције које имају исту структуру као и сам програм. Блоковна структура је врло брзо постала стандард за конструисање масивних програма од малих компоненти.

Лисп уреди

Лисп (скраћеница од енглеског list processing) је развио и имплементирао Џон Макарти око 1960. године, базирајући га на математичкој теорији рекурзивних функција. Програм развијен у Lisp-у је функција примијењена на податке, а не секвенца процедуралних корака, као што је случај у Фортрану и Алголу.

C уреди

Програмски језик C су развили Денис Ричи и Брајан Керниган 1972. године, у АТ&Т корпорацији за програмирање оперативних система.

 
Развој програмских језика

Види још уреди

Референце уреди

  1. ^ Surana P (2006). „Meta-Compilation of Language Abstractions.” (PDF). Архивирано из оригинала (PDF) 17. 2. 2015. г. Приступљено 17. 3. 2008. 
  2. ^ а б в Aaby 2004, стр. 1
  3. ^ Koetsier 2001, стр. 589–603. sfn грешка: више циљева (2×): CITEREFKoetsier2001 (help)
  4. ^ Ettinger, James (2004) Jacquard's Web, Oxford University Press
  5. ^ Michael Stevens (2011). „Programming paradigms and an overview of C - COMP3610 - Principles of Programming Languages: Object-Oriented programming”. Australian National University. стр. 5. Архивирано из оригинала 21. 05. 2012. г. Приступљено 22. 5. 2012. „Object oriented programming extends the concept of modularity by introducing objects 
  6. ^ Eckel 2006, стр. 24.
  7. ^ Lloyd, J.W., Practical Advantages of Declarative Programming 
  8. ^ Chakravarty, Manuel M. T. (1997). On the Massively Parallel Execution of Declarative Programs (Doctoral dissertation). Technische Universität Berlin. Приступљено 26. 2. 2015. „In this context, the criterion for calling a programming language declarative is the existence of a clear, mathematically established correspondence between the language and mathematical logic such that a declarative semantics for the language can be based on the model or the proof theory (or both) of the logic. 
  9. ^ In mathematical terms, this means the programming language is Turing-complete MacLennan, Bruce J. (1987). Principles of Programming Languages. Oxford University Press. стр. 1. ISBN 978-0-19-511306-8. 
  10. ^ ACM SIGPLAN (2003). „Bylaws of the Special Interest Group on Programming Languages of the Association for Computing Machinery”. Архивирано из оригинала 22. 06. 2006. г. Приступљено 19. 6. 2006. , The scope of SIGPLAN is the theory, design, implementation, description, and application of computer programming languages - languages that permit the specification of a variety of different computations, thereby providing the user with significant control (immediate or delayed) over the computer's operation.
  11. ^ Dean, Tom (2002). „Programming Robots”. Building Intelligent Robots. Brown University Department of Computer Science. Архивирано из оригинала 29. 10. 2006. г. Приступљено 23. 9. 2006. 
  12. ^ R. Narasimahan, Programming Languages and Computers: A Unified Metatheory. pp. 189--247 in Franz Alt, Morris Rubinoff (eds.) Advances in computers, Volume 8. Advances in Computers. Academic Press. 1994. стр. 193. ISBN 978-0-12-012108-3.  : "a complete specification of a programming language must, by definition, include a specification of a processor--idealized, if you will--for that language." [the source cites many references to support this statement]
  13. ^ Ben Ari, Mordechai (1996). Understanding Programming Languages. John Wiley and Sons. „Programs and languages can be defined as purely formal mathematical objects. However, more people are interested in programs than in other mathematical objects such as groups, precisely because it is possible to use the program—the sequence of symbols—to control the execution of a computer. While we highly recommend the study of the theory of programming, this text will generally limit itself to the study of programs as they are executed on a computer. 
  14. ^ Schmidt 1994, стр. 32.
  15. ^ Pierce 2002, стр. 339. sfn грешка: више циљева (2×): CITEREFPierce2002 (help)
  16. ^ Digital Equipment Corporation. „Information Technology - Database Language SQL (Proposed revised text of DIS 9075)”. ISO/IEC 9075:1992, Database Language SQL. Архивирано из оригинала 21. 06. 2006. г. Приступљено 29. 6. 2006. 
  17. ^ The Charity Development Group (децембар 1996). „The CHARITY Home Page”. Архивирано из оригинала 18. 07. 2006. г. Приступљено 29. 6. 2006. , Charity is a categorical programming language..., All Charity computations terminate.
  18. ^ XML in 10 points Архивирано 2009-09-06 на сајту Wayback Machine W3C, 1999, XML is not a programming language.
  19. ^ Powell 2003, стр. 25.
  20. ^ „What kind of language is XSLT?”. IBM.com. Архивирано из оригинала 11. 5. 2011. г. Приступљено 3. 12. 2010. 
  21. ^ „XSLT is a Programming Language”. Msdn.microsoft.com. 27. 10. 2016. Архивирано из оригинала 3. 2. 2011. г. Приступљено 3. 12. 2010. 
  22. ^ Scott 2006, стр. 802.
  23. ^ Oetiker, Tobias; Partl, Hubert; Hyna, Irene; Schlegl, Elisabeth (2016). „The Not So Short Introduction to LATEX 2ε” (PDF). tobi.oetiker.ch. стр. 1—157. Архивирано из оригинала (Version 5.06) 14. 03. 2017. г. Приступљено 16. 4. 2017. 
  24. ^ Syropoulos, Tsolomitis & Sofroniou 2003, стр. 213.
  25. ^ Robert A. Edmunds, The Prentice-Hall standard glossary of computer terminology, Prentice-Hall. 1985. стр. 91.
  26. ^ Pascal Lando, Anne Lapujade, Gilles Kassel, and Frédéric Fürst, Towards a General Ontology of Computer Programs Архивирано 2015-07-07 на сајту Wayback Machine, ICSOFT 2007 Архивирано 2010-04-27 на сајту Wayback Machine
  27. ^ Bajpai, S. K. (2007). Introduction to Computers and C Programming. New Age International. стр. 346. ISBN 978-81-224-1379-3. 
  28. ^ R. Narasimahan. Programming Languages and Computers: A Unified Metatheory. pp. 189-247 in Franz Alt, Morris Rubinoff (eds.) Advances in computers, Volume 8. Advances in Computers. Academic Press. 1994. стр. 215. ISBN 978-0-12-012108-3. : "[...] the model [...] for computer languages differs from that [...] for programming languages in only two respects. In a computer language, there are only finitely many names--or registers--which can assume only finitely many values--or states--and these states are not further distinguished in terms of any other attributes. [author's footnote:] This may sound like a truism but its implications are far reaching. For example, it would imply that any model for programming languages, by fixing certain of its parameters or features, should be reducible in a natural way to a model for computer languages."
  29. ^ John C. Reynolds, Some thoughts on teaching programming and programming languages, SIGPLAN Notices, Volume 43, Issue 11, November. (2008). pp. 109.
  30. ^ Koetsier 2001, стр. 589–603 harvnb грешка: више циљева (2×): CITEREFKoetsier2001 (help)

Литература уреди

Спољашње везе уреди