Садржај
3 Променљиве, подаци, типови
3.5 Текстуални подаци (стрингови, ниске)
4 Гранања
4.7 Гранања - разни задаци
5 Петље
5.1 Врсте петљи
5.2 Наредбе break и continue
6 Статички методи
6.4 Корист од метода
7 Низови
7.2 Низови - вежбање
8 Матрице
9 Кориснички дефинисани типови
10 Фајлови

О језичким правилима

У приручнику Увод у програмирање у програмском језику C# погледајте поглавље 1.5 (стране 12-14).


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

Укратко о формализму природних језика

Лексика: Реченице се граде од речи. Скуп речи које (у неком тренутку) чине један језик назива се лексиком тог језика. При састављању реченица треба најпре водити рачуна о њиховој лексичкој исправности. Ако се у реченици појави реч која није део језика, таква реченица је лексички неисправна.

Синтакса: Речи датог језика се не могу низати на произвољан начин. Постоје правила која одређују како се саставља реченица. Правилима за састављање исправних језичких конструкција (реченица) бави се део граматике који се назива синтаксом датог језика.

Семантика: Реченица која је састављена у складу са синтаксним правилима и даље не мора да буде смислена. Смислом, односно значењем реченица и њихових делова се бави семантика језика. Семантика исправним језичким конструкцијама придружује значење (ако оне имају значење).

Погледајмо примере:

Исправност реченица говорног језика

Реченица

Лексички исправна?

Синтаксно исправна?

Има значење?

Објашњење

скрљ 7 мало пута нклнклс

не

У овом низу знакова појављују се ’речи’ које не припадају српском језику, то јест нису део лексике српског језика и зато је цео запис лексички неисправан.

Piccola fiamma non fa gran luce.

не

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

Доброме два нежно круг.

да

не

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

Безбојне зелене идеје бесно спавају.

да

да

не

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

Велике зелене лопте високо одскачу.

да

да

да

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

Формализам програмских језика

Програмски језици такође имају своју лексику, синтаксу и семантику.

Лексику програмског језика чине:

  • кључне речи, као што су using, class, double, for, if (сваки програмски језик има свој списак кључних речи). То су речи са специјалним значењем, које се користе на тачно одређен начин, дефинисан синтаксом језика.

  • идентификатори, то јест имена константи, променљивих, функција, класа итд. Свако такво име треба пре употребе да буде прописно уведено (дефинисано), било у нашем програму, било у неком већ написаном модулу који смо придружили нашем програму.

  • специјални знакови, као што су + - * / % < > & | ! . ( ) { } и други. За сваки програмски језик може да се наведе тачан списак свих специјалних знакова који се појављују у његовој лексици, што ми овде нећемо чинити.

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

Поново ћемо се послужити примерима и у случају програмских језика. Ови примери су такви да важе за скоро сваки програмски језик, а свакако важе за C#. Ипак, треба имати на уму да језичка конструкција која је лексички, синтаксно или сематнички исправна у једном програмском језику, не мора бити једнако исправна и у другом.

Исправност конструкција програмског језика

Конструкција

Лексички исправна?

Синтаксно исправна?

Има значење?

Објашњење

a = 5 €

не

Ова констукција није чак ни лексички исправна јер се у њој појављује знак €, који није део лексике језика C#.

+ * 3 5 = a

да

не

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

a = 5 / 0;

да

да

не

Ова конструкција је и синтаксно исправна, јер је написана у складу са правилима писања на језику C#. Међутим, она је семантички неисправна, јер дељење нулом није дозвољено, па би при извршавању ове наредбе рачунар пријавио грешку и прекинуо извршавање програма.

a = 5 + b;

да

да

да

Ова конструкција је синтаксно исправна и њено значење је ’сабери 5 i b и резултат стави у a’.

То што одређени запис има смисао на неком програмском језику, не значи да је тај запис и семантички исправан. Семантичка исправност сваке језичке конструкције зависи од тога шта је програмер њом хтео да постигне. Ако неки запис има другачије значење од оног које смо намеравали да употребимо, тај запис треба (бар у рачунарству) сматрати семантички неисправним. Наредбу програма или цео програм сматрамо семантички исправним ако је значење те наредбе или програма управо оно које смо желели.

Синтаксне грешке

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

Када при писању неког програма прекршимо правила записивања језичких конструкција, кажемо да смо направили синтаксну грешку. Такве грешке су формалне природе и рачунар може да их открије тако што проверава која правила су употребљена при писању појединих делова нашег програма. За овакве, синтаксне („правописне”) грешке, добијаћемо поруке које указују на место и врсту грешке, након чега те грешке лакше исправљамо.

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

Семантичке грешке

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

У говорном језику реченица може да буде синтаксно исправна и да има одређено значење, али различито од оног које нам је било на уму. На пример, ако кажемо или напишемо: „Када полази авион из Атине?“ уместо „Када долази авион из Атине?“, нико не може (само на основу те реченице) да буде сигуран да у реченици постоји грешка, јер је питање разумљиво и има смисао. У оваквој ситуацији ћемо највероватније добити информацију која је за нас погрешна (није она коју желимо да добијемо) и због тога ће неко можда пропустити лет авионом или ће непотребно чекати на аеродрому.

Слична је ситуација и у програмским језицима. Можемо, на пример, да напишемо наредбу којом се два броја сабирају, а требало је да се множе. Овакве грешке се зову грешке у значењу, или семантичке грешке, а познатије су под популарним именом багови (бубе). Када направимо семантичку грешку у програму, не можемо очекивати да је открије машина и да нам на њу укаже, јер рачунару је „све јасно“ и он може да направи извршиви програм и да га покрене. На жалост, може се десити да програм са баговима за неке улазне податке даје исправан резултат, а за неке неисправан. На пример, ако је требало помножити два броја, а ми смо их грешком сабрали, програм ће давати исправан резултат ако су улазни подаци бројеви 2 и 2. Понекад неспоразум између нас и рачунара може бити толико велики да резултата уопште и не буде - програм приликом извршавања „пукне”.

Због свега реченог, семантичке грешке (грешке у значењу) се много теже откривају и исправљају.

(Created using Swinx, RunestoneComponents and PetljaDoc)
© 2022 Petlja
A- A+