Програмски језици
Програмски језик
Језик представља скуп правила за комуникацију. Помоћу језика представљају се и преносе информације. Природни језик се користи за комуникацију између људи у говорној или писаној форми.
Програмски језик служи за комуникацију са рачунаром, тј. за развој софтвера (програмирање). Програмер уноси текст на програмском језику (програмски кôд) у рачунар, са циљем да рачунар изврши инструкције задате у том тексту.
Програмски језик може се дефинисати као скуп речи и правила за писање рачунарских програма који описују послове које треба да обави рачунар.
Пре него што почнеш са писањем програма...
Књижевна и друга ауторска дела написана природним језицима објављују се у штампаном или електронском формату. Нека од њих се преводе на друге језике, али увек остају аутентична тј. верна оригиналу. С друге стране, програмски кôд је динамичан – оригинална верзија програма ће се након објављивања засигурно мењати ради исправки грешака (багова) или унапређења функционалности.
У моменту писања кода, програмеру је његов програмски кôд сасвим јасан. Међутим, ако програм није написан читљиво и разумљиво, његови сарадници ће имати потешкоћа да га протумаче. Чак се ни сâм програмер, након одређеног времена и рада на другим пројектима, неће лако снаћи у свом нејасном коду.
Зато је важно да програме увек пишеш јасно и читљиво!
Поделе програмских језика
До данас је креирано више хиљада програмских језика, али нису сви једнако важни и заступљени. Поред важности и заступљености, програмски језици могу се поделити на много начина и у много категорија у зависности од критеријума на основу којих се врши подела.
Подела према степену блискости са архитектуром процесора
Из предмета Рачунарство и информатика научио си да је централна процесорска јединица (енгл. Central Processing Unit - CPU), скраћено процесор, електронска компонента која извршава инструкције програма и обрађује податке. Процесори се, према типу инструкција које извршавају, могу грубо поделити на две врсте:
- RISC (енгл. Reduced Instruction Set Computer) процесори користе мањи скуп једноставних инструкција, где се свака инструкција извршава веома брзо, често у једном циклусу процесора, што поједностављује дизајн процесора и повећава ефикасност; и
- CISC (енгл. Complex Instruction Set Computer) процесори подржавају сложеније инструкције, где једна инструкција може да обави сложен задатак који би на RISC архитектури захтевао више инструкција.
На пример, у твом мобилном телефону или таблету вероватно се налази ARM процесор заснован на RISC архитектури. Донедавно, у лаптоп и десктоп рачунарима доминирали су x86/x64 процесори засновани на CISC архитектури компанија Intel и AMD. Међутим, новији декстоп и лаптоп рачунари компаније Apple користе Apple Silicon процесоре (M1, M2 и M3) који су такође засновани на ARM (RISC) архитектури, показујући да границе између ових технологија постају све флексибилније.
Према степену блискости са архитектуром процесора, програмски језици деле се на језике ниског нивоа (машински и асемблерски) и језике високог нивоа (C, C++, C#, Java...). Језици ниског нивоа подразумевају блискост са одређеном процесорском архитектуром, док се језици високог нивоа, захваљујући компајлерима, могу користити на рачунарима са различитим архитектурама процесора.
То значи да ће асемблерски програм написан за процесор у CISC технологији бити неупотребљив за процесор у RISC технологији и обрнуто. Врло је вероватно и да ће асемблерски програм написан за процесор у одређеној технологији одређене генерације бити неупотребљив за процесор исте технологије много новије или много старије генерације. С друге стране, програм написан у програмском језику високог нивоа може да буде функционалан за процесор било које технологије и било које генерације.
Машински програм извршава се директно у процесору и овакви програми су потпуно неразумљиви човеку. Асемблерски програми састоје се из мнемоничких наредби које готово директно одговарају појединачним инструкцијама машинског језика. Наредбе програмских језика високог нивоа су блиске енглеском језику и структуриране су тако да одговарају начину размишљања програмера.
Следе примери програма у програмским језицима високог нивоа (C, C++, C#) и ниског нивоа (асемблерски програм и део машинског кôда). По извршавању, сви програми на стандардни излаз, односно у конзолу исписују текст Hello, World!
.
00: 4d 5a 90 00 03 00 00 00 04 00 00 00 ff ff 00 00
01: b8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00
02: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
03: 00 00 00 00 00 00 00 00 00 00 00 00 f8 00 00 00
04: 0e 1f ba 0e 00 b4 09 cd 21 b8 01 4c cd 21 54 68
05: 69 73 20 70 72 6f 67 72 61 6d 20 63 61 6e 6e 6f
06: 74 20 62 65 20 72 75 6e 20 69 6e 20 44 4f 53 20
07: 6d 6f 64 65 2e 0d 0d 0a 24 00 00 00 00 00 00 00
08: af c0 6f c1 eb a1 01 92 eb a1 01 92 eb a1 01 92
09: 54 dd 00 93 e8 a1 01 92 54 dd 04 93 f3 a1 01 92
0A: 54 dd 05 93 e0 a1 01 92 54 dd 02 93 e8 a1 01 92
0B: ff ca 00 93 ef a1 01 92 eb a1 00 92 ac a1 01 92
0C: 32 dc 05 93 ea a1 01 92 32 dc fe 92 ea a1 01 92
0D: 32 dc 03 93 ea a1 01 92 52 69 63 68 eb a1 01 92
0E: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0F: 00 00 00 00 00 00 00 00 50 45 00 00 64 86 0a 00
10: c3 e8 42 64 00 00 00 00 00 00 00 00 f0 00 22 00
...
Чак и ако не знаш ништа о програмирању и програмским језицима, а знаш енглески језик, можеш отприлике да претпоставиш шта наредбе у језицима високог нивоа значе. Такође, ове програме можеш компајлирати за различите рачунарске системе, са различитим процесорима и различитим оперативним системима.
Дати асемблерски програм ће бити функционалан само ако се користи Microsoft асемблер на 64-битној верзији оперативног система Windows на рачунарима са Intel или AMD 64-битним процесорима у CISC технологији. Уколико се користи неки други асемблер на другом оперативном систему, или се користи рачунар са другом архитектуром процесора, дати програм неће бити функционалан. С друге стране, дати изворни кôд програма написаног у C-у је преносив. То значи да се исти кôд може успешно компајлирати помоћу одговарајућег C компајлера за готово сваки оперативни систем и процесорску архитектуру.
У одређеној литератури прочитаћеш да је ово подела програмских језика према генерацијама. Тако, машински језик се сматра програмским језиком прве генерације, асемблерски језик програмским језиком друге генерације, а програмски језици високог нивоа (Fortran, Pascal, C и др.) програмским језицима треће генерације. Генерацијска класификација језика на високом нивоу, од треће генерације на даље, никада није била у потпуности прецизирана, а касније је и напуштена.
Подела на компајлере и интерпретере
Програмски језици се могу поделити на компајлерске и интерпретерске, у зависности од начина на који се њихов кôд извршава.
- Компајлерски језици користе компајлер, који преводи изворни кôд у извршни. Након компајлирања, извршна датотека се може независно извршавати без додатног софтвера. Програмски језици засновани на компајлерима су C, C++, C#, Java и др.
- Интерпретерски језици користе интерпретер, који извршава програм линију по линију, уместо да га преведе у извршну датотеку. Овакви програми не могу радити без интерпретера. Програмски језици засновани на интерпретерима су Python, Ruby, Perl и др.
Подела према начину програмирања
Према начину програмирања, програмски језици могу се сврстати у основне програмске парадигме. Програмска парадигма може да означава: програмски стил, начин/стил програмирања и класификацију међусобно сличних програмских језика.
Програмске парадигме изучавају се како би се боље упознала својства програмских језика који им припадају. Програмске парадигме могу се поделити на:
- императивне парадигме и
- декларативне парадигме.
Императивне парадигме подразумевају програмске језике у којима се користе искази/наредбе који мењају стање програма. Основне императивне парадигме су:
- процедуралне парадигме (програмски језици C, Pascal, Fortran) и
- објектно-оријентисане парадигме (програмски језици C++, C^#, Java).
Декларативне парадигме подразумевају програмске језике у којима се више изражава логика него искази/наредбе. Основне декларативне парадигме су:
- функционалне парадигме (програмски језици Haskell, F#) и
- логичке парадигме (програмски језици Prolog и његови деривати).
У савременим програмским језицима увек је помешано више програмских парадигми (енгл. multi-paradigm). На пример, програмски језик C++ јесте објектно-оријентисан, али се може сврстати и у групу процедуралних и у групу функционалних језика. Данас постоји око сто категорија и поткатегорија програмских парадигми.
Шта нису програмски језици
Језици за описивање/структурирање текста нису програмски језици јер се помоћу њих не пишу програми које треба да изврши рачунар. Примери оваквих језика су: HTML, CSS, XML, SGML, JSON и др.