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

мини|Учебници по програмски јазици
**Програмски јазик** е формален јазик за презентација (нотација) на сметачки програми. Со негова помош, преку разбирлив текст за човекот, се даваат команди и инсктрукции за извршување на интерни задачи, опис на влезни и излезни податоци како и нивна структура во зависност од интерни (во системот) и надворешни (надвор од системот) случувања. Програмските јазици се употребуваат да се создадат програми кои го контролираат однесувањето на машината, точно да изразат алгоритми.

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

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

## Дефиниции
Програмскиот јазик е нотација за пишување на програми, кои се инструкции на една пресметка или алгоритам. Некои, но не сите автори го ограничуваат терминот "програмски јазик" на оние јазици кои можат да ги изразат сите можни алгоритми. Одлики кои се сметаат за важни за она што претставува програмски јазик се:
* *Функција и цел*: компјутерски програмски јазик е јазик кој се користи за пишување компјутерски програми, кои вклучуваат компјутерско вршење некој вид на пресметка или алгоритам и можна контрола на надворешни уреди како на пример печатачи, дискови, роботи, и така натаму. Општо земено, програмскиот јазик може да опише пресметка на некоја апстрактна машина. Општо е прифатено дека комплетната спецификација за програмскиот јазик вклучува опис, по можност идеализиран, на машина или обработувач за тој јазик. Програмските јазици се разликуваат од природните јазици со тоа што природниот јазик се користи само за интеракција меѓу луѓето, додека програмските јазици, им овозможи на луѓето да пренесуваат инструкции на машини.
* *Абстракции*: програмските јазици, обично содржат апстракции за дефинирање и манипулирање со структури на податоци или контрола на протокот на извршување. Практичната потреба програмскиот јазик да поддржува соодветни апстракции се изразува преку принцип на апстракција;  овој принцип е формулиран како препорака до програмерот да се направи правилна употреба на апстракциите.
* *експресивна моќ*: Теоријата на пресметување ги класифицира јазиците според пресметките кои се способни да ги изразат.

Јазиците за означување како XML, HTML или trof кои дефинираат структурирани податоци, не се сметаат за програмски јазици. Програмските јазици можат да ја делат синтаксата со овие јазици за означување ако семантиката за пресметување е дефинирана.

Терминот компјутерски јазик понекогаш се користи наизменично со терминот програмски јазик. Меѓутоа, употребата на двата термини зависи од авторите, вклучувајќи ја гледната точка на секој. Едната употреба  ги опишува програмските јазици како подмножество на компјутерските јазици. Според тоа, јазиците употребени за пресметување кои имаат различна цел од изразување на компјутерски програми се генерички дизајнирани компјутерски јазици. На пример означувачките јазици понекогаш се однесуваат како компјутерски јазици за да се истакне дека тие не се наменети за програмирање. Друга употреба ги опишува програмските јазици како теоретски конструкции за програмирање на апстрактни машини, и компјутерски јазици како подмножеството кое работи на физичките компјутери, кои имаат конечни хардверски ресурси.

## Елементи

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

### Синтакса

Површинската форма на програмскиот  јазик е позната како негова синтакса. Повеќето програмски јазици се чисто текстуални, тие користат низа на текстот вклучувајќи зборови, бројки, интерпункција, слично како што се пишуваат природните јазици. Од друга страна, постојат некои програмски јазици кои се  графички по природа, користат визуелни односи меѓу симболите за да создадат програма.

Синтаксата на јазикот опишува можни комбинации на симболите што формираат синтаксички исправна програма. Значењето зададено со комбинација на симболи е управувано од семантика.

Синтаксата на програмскиот јазик е обично дефинирана со користење на комбинација на регуларни изрази (за лексички структура) и Backus-Naur формулар (за граматичка структура). Подолу е едноставна граматика, заснована на Lisp:


```
expression ::= atom | list
atom ::= number | symbol
number ::= [+-]?['0'-'9']+
symbol ::= ['A'-'Z'a'-'z'].*
list ::= '(' expression* ')'
```


Оваа граматика го одредува следното:
* *израз* е или *atom* или *list*;
* *atom* е или number или *symbol*;
* *number* е непрекината низа на една или повеќе децимални цифри, опционално на кое му претходи плус или минус;
* *symbol* е буква проследено со нула или повеќе какви било знаци (со исклучок на празните места) и
* *list* е поврзан пар загради, со нула или повеќе изрази во него.

Не сите синтаксички точни програми се семантички точни. Многу програми се синтаксички исправни, сепак лошо формирани, по правилата на јазикот, и може да (во зависност од спецификацијата на јазикот и исправноста на имплементација) резултира со грешка во преводот или извршувањето. Во некои случаи, овие програми може да резултираат со недефинирано однесување. Дури и кога програмата е добро дефинирана во еден јазик, таа сепак може да има значење кое не е посакувано од страна на лицето кое ја напишал.

Користејќи го природниот јазик како пример, можеби нема да биде можно да се додели значење на граматички правилна реченица или реченицата може да биде погрешна:
* "Безбојно зелени идеи спијат бесно." е граматички добро формиран, но нема општо прифатени значења.
* "Џон е мажена диплома." е граматички добро формиран, но изразува значење што не може да биде вистина.
Следниот фрагмент од јазикот C  е синтаксички исправен, но извршува операција што не е дефинирана семантички (затоа што p е нулти покажувач, операциите p-> real и p-> im немаат значење):

```c
complex *p = NULL;
complex abs_p = sqrt(*p >> 4 + p->im);
```

Ако напишаниот исказ во првиот ред беше испуштен, програмата ќе предизвика грешка на компилацијата, променливата "п" нема да биде дефинирана. Но, програмата сè уште ќе биде синтаксички исправна, бидејќи напишаниот исказ обезбеди само семантичка информација.

### Семантика
Терминот семантика се однесува на значењето на јазиците, спротивно на нивната форма (синтакса).
#### Статична семантика
Статичката семантика дефинира ограничувања во поглед на структурата на валидни текстови кои се тешко или невозможно да се изразат во стандардни синтаксички формализми. За компилирани јазици, статичната семантика во суштина вклучува семантички правила кои можат да се проверат со компајлирање. Примерите вклучуваат проверка дека секој идентификатор е признат пред да се користи (во јазиците кои бараат такви декларации).  Многу важни ограничувања од овој тип, како проверка дека идентификатори се користат во соодветен контекст (на пример, не додавање на цел број на името на функцијата), или дека потпрограмски повици имаат соодветен број и вид на аргументи може да се спроведува од страна на нивно дефинирање како правила на логиката наречени type систем. Други форми на статички анализи како анализи на протокот на податоци исто така можат да бидат дел од статични семантика. 
#### Динамична семантика
Откако податоците се специфицирани, на машината треба да ѝ биде дадено да врши операции на податоците. На пример, семантиката може да дефинира стратегија со која изразите се оценуваат до вредности, или начинот на кој контролните структури условно извршувааат пресметки. Динамичниата семантика (исто така познат како извршувачка семантиката) на еден јазик дефинира како и кога различни конструкции на еден јазик треба да произведат однесување на програмата. Постојат многу начини на дефинирање на извршувачката семантика. Природниот јазик најчесто се користи да се определи извршувачката семантика на јазиците кои вообичаено се користат во пракса. Значителен дел од академските истражувања отиде во формалната семантика на програмските јазици, кои дозволуваат извршување семантиката за да биде поблиску специфицирана во формален начин. Резултати од ова поле на истражување видовме ограничена примена на програмскиот јазик дизајн и имплементација надвор од академијата.
### Стандардна библиотека
Повеќето програмски јазици имаат поврзана основна библиотека (понекогаш е позната како "стандардна библиотека", особено ако е вклучена како дел од објавениот стандард на јазикот), која е вообичаено ставена на располагање на сите имплементации на јазикот. Основните библиотеки обично вклучуваат и дефиниции за вообичаено користените алгоритми, структури на податоци, и механизми за влез и излез.

## Дизајн и извршување

Програмските јазици делат својства со природните јазици поврзани со нивната намена како начин на комуникација, има синтаксичка форма одвоена од својата семантика. А значајна разлика е тоа што програмски јазик може да биде целосно опишан и студиран во целост, бидејќи има прецизна и конечна дефениција. Од друга страна, природните јазици имаат променливи значења дадени од страна на нивните корисници во различни заедници.

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

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

Една заеднички тренд во развојот на програмските јазици е да се додаде повеќе способност да се решаваат проблемите со помош на повисоко ниво на апстракција. Најраните програмски јазици беа врзани многу тесно со основните хардверот на компјутерот. Како се развиваат нови програмски јазици, се додаваат одлики кои им дозволуваат на програмерите да изразат идеи кои сè повеќе се оддалечуваат од едноставен превод на основните хардверски инструкции. Бидејќи програмерите се помалку врзани за сложеноста на компјутерот, нивните програми можат да направат повеќе пресметки со помалку напор на програмерот.

Дизајнерите на јазикот и корисниците мора да конструираат голем број на примитиви кои ја управуваат и овозможуваат практиката на програмирање. Најважните од нив се спецификацијата и имплементацијата на јазикот.

### Спецификација

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

Спецификацијата на програмскиот јазик може да има неколку форми, вклучувајќи ги следниве:

* Експлицитна дефиниција на синтакса, статична семантика, и извршувачка семантика на јазикот. Додека синтаксата е најчесто специфицирана употребувајќи формална граматика, семантичките дефиниции можат да бидат напишани во природен јазик или формална семантика.
* На однесување на преведувачот за јазикот. Синтаксата и семантиката мора да имплицираат од овој опис, кој може да биде напишан на природен или формален јазик.
* Упат или имплементација на моделот, понекогаш напишана во јазикот што се специфицира.

### Имплементација

**Имплементацијата** на програмскиот јазик обезбедува начин да се изврши таа програма на една или повеќе конфигурации на хардвер и софтвер. Има два пристапи за имплементација на програмски јазик: компилација и интерпретација. Општо е можно да се имплементира јазик со користење било која техника.

Излезот на компајлер може да биде извршен од страна на хардвер или програма наречена интерпретер. Во некои имплементации кои го прават користењето на интерпретерот пристапно не постои граница помеѓу компајлирањето и интерпретацијата.

## Употреба

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

Кога се користи природен јазик за да се комуницира со други луѓе, говорителите може да се двосмислени и да направат мали грешки, и сè уште очекуваат нивната намера да се разбере. Сепак, условно кажано, компјутерите "го прават токму она што им е кажано да се направи ", и не можат да "разберат" кој код програмерот имал намера да го напише. Комбинацијата на дефиниција на јазикот, програма, и влезови на програмата во целост мора да го наведе надворешното однесување што се јавува кога програмата се извршува, во доменот на контролата на таа програма.

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

Програми за компјутер можат да бидат извршени во batch процес без човечка интеракција, или корисникот може да внесува команди во една интерактивна сесија на интерпретер. Во овој случај "команди" се само програми, чие извршување е заеднички поврзано.  Кога некој јазик се користи за да даде заповеди на софтверска апликација (како shell) се нарекува скриптен јазик.

### Мерење на употребата на јазикот

Тешко е да се утврди кои програмски јазици се најмногу користени, и она што значи употреба варира во зависност од контекст. Еден јазик може да го окупира поголемиот број часови на програмерот, друг да има повеќе линии на код, а трет да го користи повеќе време на обработувачот. Некои јазици се многу популарни особено за видови на апликации. На пример, COBOL е сè уште силен во корпоративниот центар на податоци, често на големи мејнфрејми; FORTRAN во научни и инженерски апликации; C во вградени апликации и оперативни системи, и други јазици, редовно користени за да се напишат многу различни видови на апликации.

Различни методи за мерење на популарноста на јазиците:

* пребројување на бројот на работни огласи во кои се споменува јазикот
* бројот на продадени книги во кои се учи или се опишува јазикот
* проценка на бројот на постојните линии на код напишан во јазикот – што може да ги потцени јазиците кои не се јавуваат често во јавните пребарувања 
* пребројувањата на упатите на јазикот (односно на името на јазикот), откриени со помош на пребарувач.

## Таксономија

Не постои сеопфатна класификациона шема за програмските јазици. Даден програмски јазик нема секогаш единствен јазик предок. Јазиците најчесто се јавуваат со комбинирање на елементи на неколку претходни јазици со нови идеи во оптек во тоа време. Идеи кои потекнуваат од еден јазик сосема ќе опшират семејство на поврзани јазици, а потоа да скокаат преку семејни празнини па одеднаш да се појават во сосема различно семејство.

Задачата е дополнително комплицирана од фактот дека јазиците можат да се класифицираат по повеќе оски. На пример, Java е и објектно-ориентиран јазик (поради тоа што ја охрабрува објектно-ориентираната организација) и истовремен јазик (поради тоа што содржи вградени конструкции за водење на повеќе врски во паралела). Python е објектно-ориентиран скриптен јазик.

Во поширока потези, програмски јазици се делат во парадигми на програмирање и класификација со наменет домен на употреба. Традиционално, програмските јазици се сметаат како опишување "пресметка" во однос на императивни реченици, односно издавање на команди. Тие обично се нарекуваат императивни програмски јазици. А голем дел од истражувањата во програмските јазици е наменета за замаглување на дистинкцијата помеѓу програма како сет на инструкции и програма како тврдење за саканиот одговор, што е главната одлика на декларативно програмирање. Повеќе рафинирано парадигми вклучуваат процедурално програмирање, објектно-ориентирано програмирање, функционално програмирање, и логичкото програмирање; некои јазици се хибриди од парадигми или мулти-парадигматична. Асемблерскиот јазик е директен модел на основнита архитектура на машината. Намерно, програмските јазици може да се сметаат за општа намена, јазици за програмирање, скриптирање на јазици, домен-специфични јазици, или истовремена / дистрибуирани јазици (или комбинација од овие). Некои јазици за општа намена се дизајнирани главно со образовни цели.

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


Категорија:Програмирање
Категорија:Информатика