Лекция 3 Програмни езици 1 Развитие на програмните езици



Дата24.07.2016
Размер226.34 Kb.
Лекция 3

Програмни езици

1 Развитие на програмните езици

Програмното осигуряване в голяма степен отразява специфичните особености на архитектурата на компютърните системи. Поради тази причина, усъвършенстването на хардуерната част на КС е съпроводено и с много бързо развитие на програмното осигуряване.

Хардуерните елементи на КС работят с инструкции записани в двоичен код. Това означава, че програмите които се изпълняват, трябва да съдържат само двоични инструкции (машинен код на програмите). Програмирането с машинни (двоични) команди е изключително трудоемка дейност. Това се смята за програмиране с програмни езици от първо поколение.

В началото на развитие на компютърните технологии, програмирането се е извършвало в машинен код. Първите опити за създаване на език за програмиране, различен от машинния датират от 1949 година. Тогава е разработена система за кодиране на програми наречена Short Code.

Още в началото на развитие на електронните изчислителни машини започват опитите да се облекчи програмирането, като се замени използването на двоични цифри за запис на командите и операндите към тях. За тази цел се въвежда мнемонически запис на различните команди, вместо техният шестнадесетичен код. Например, вместо цифровият код на командата за зареждане на регистър (запис на данни в регистъра), програмистът може да запише LD (от Load - натовари), вместо копиране на стойността на даден регистър в паметта – ST (от Store - запази), а вместо добавяне на стойност към съдържанието на даден регистър – Add (од Add – добави). За записване на адресите в паметта, където се намират данните подлежащи на обработка се въвеждат правила с които на дадена област от паметта може да се присвои някакво описателно име (променлива, идентификатор). Първоначално, програмистите съставяли програмите с мнемонически означения на хартия и после ги превеждали на машинен език. Скоро станало ясно, че това може да извършва самата машина посредством специална програма.

През 1950 година Майкъл Уилкс от Кембриджският университет разработва така наречената Assembly System (транслираща система за език Асемблер), предназначена за компютър EDSAC. Целта на тази система е била да обединява (събира, асемблира) в една програма, отделни програмни части написани в двоичен код и съхранявани в специална библиотека за подпрограми. Тази система се явява начало на развитието на така наречените асемблерски езици за програмиране. Тези езици се използват и до днес.

В асемблерските езици, командите се записват с мнемонически кодове (кодови съкращения), които специална транслираща програма преобразува в машинни команди (двоичен код). При тези езици, за първи път величините се представят чрез буквени означения (идентификатори), както в математиката.

За времето си, разработването на асемблерските езици се е смятало за огромен скок в развитието на софтуерните технологии. За много програмисти от това време, тези езици представлявали ново ниво, което дава много по-големи възможности от машинните езици.

Машинният език и Асемблер са машинно зависими езици. Тяхната структура и налични команди зависят от конкретната компютърна система. Въпреки че се използват мнемонически означения на командите, структурата на записването им е близка до структурата на машинните команди. Те се отнасят към програмните езици от второ поколение.

При разработването на алгоритми за решаване на задачи, обикновено се използват прийоми и структури от по-високо логическо ниво, отколкото машинните инструкции на компютърните системи. Следвайки този подход специалистите занимаващи се разработване на програмно осигуряване стигат до извода, много по подходящо ще бъде програмите да се записват в термините на това по-високо логическо ниво, а специални програми да преобразуват тези записи в инструкции от по-ниско ниво (машинни инструкции). През втората половина на 50-те години на 20-ти век се появяват първите програмни езици от високо ниво (трето поколение). При тях се разработва специален набор от езикови конструкции и правила за запис на инструкции от алгоритъма на дадена задача. Тъй като те се разработват като средство за описание на алгоритми, тези езици се наричат още алгоритмични или програмни езици. Те се отличават от машинно зависимите езици, по по-високото структурно ниво на инструкциите и машинната независимост. Специални програми (компилатори, транслатори или интерпретатори) се използват за преобразуване на текста на програмите записани с алгоритмичните езици в двоичен код.

Машинната независимост на езиците от високо ниво се осигурява от програмата, която преобразува текста на програмата от високо ниво в двоични команди (компилатор, интерпретатор). Тъй, като машинните инструкции на различните компютърни системи са различни, то и компилаторите трябва да съответстват на даденият тип машина. Затова, в миналото имащи различни компилатори за един и същ език, които се наричаха диалекти на езика.

През 1954 година започва работата по създаването на езика FORTRAN (FORmula TRANslation). През 1957 година той е завършен и по идея този език е реализиран като средство за създаване на програми за решаване на научно-технически задачи. Има различни версии: FORTRAN II (1958), FORTRAN III (1961), FORTRAN IV (1962), FORTRAN 77 (1966). FORTRAN получава много голямо разпространение и се използва и до днес.

Езикът Алгол се явява европейски вариант на алгоритмичен език от високо ниво. Той се разработва по поръчка на международен комитет, който се формира през 1958 година в Цюрих. През 1960 година този комитет се събира за втори път, който дава наименованието на този език Алгол 60.

Езикът Алгол внася съществено нови идеи в езиците за програмиране. В него се залага така наречената блокова структура в програмите. Той има голямо значение за разработваните след това програмни езици. За него професорът по информатика Тони Хоар казва, че това е език, който толкова е изпреварил времето си, че се явява подобрение не само на своите предшественици, но и на почти всички свои наследници. Алгол не е получил голямо разпространение, но той има сериозно теоретично значение. Една голяма група програмни езици се се обединяват в група с наименование алголоподобни езици.

Езикът FORTRAN получи широко разпространение, но той не може да удовлетвори многостранните интереси в областта на програмирането. За приложения в областта на деловата сфера (икономика, финанси) е разработен специален програмен език Кобол. Той е поръчан от Министерството на Отбраната на САЩ. Кобол е универсален език за обработка на информация в големи бази от данни (икономически и статистически изчисления).

Стремежът за създаване на универсален програмен език се въплъщава в разработката на езика PL\1. Това е универсален програмен език, който обединява идеи от FORTRAN, Алгол и Кобол. Въпреки безспорните си достойнства той не можа да намери голямо приложение, но също изигра важна роле в по-нататъшното развитие на програмните езици.

През 1967 е създаден програмният език Бейсик, който е близък по идеи с езика FORTRAN, но с по-опростена структура. Той е замислен като език за лесно програмиране, дори и от хора, които нямат специални знания по програмиране. С него се работи преди всичко в диалогов режим. Програмите написани в Бейсик се изпълняват посредством интерпретатор – програма, която последователно преобразува командите в машинен код и ги изпълнява. Бейсик става основа за развитието на персоналните компютри в началната им фаза на развитие. Тогава този език се използваше като операционна система за компютъра.

Интересно е да се отбележи, че версията М-Бейсик е разработена от Уилям Гейтс и Пол Алън и с него е поставено началото на най-мощната в момента софтуерна компания Microsoft.

В краят на 60 – те години на миналия век, вече съществували доста програмни езици, които имали очевидни недостатъци. По тази причина били сформирани две изследователски групи, които трябвало да разработят език без недостатъци (универсален програмен език). Този език е трябвало да включва всички положителни идеи от Фортран, Алгол, Кобол, Бейсик и др. Като резултат били разработени езиците PL/1 и Алгол-68 (1967 и 1969 год. съответно). Групата разработваща PL/1 била финансирана от IBM. Нейните усилия не пропаднали, и сега много програмисти ползват този език. Но въпреки всичко той не можа да измести основните езици, Фортран, Кобол, Бейсик.

Алгол-68 бил разработен от група европейски компютърни специалисти. Някои го оценяват много високо, предимно сред академическите среди. Но той се оказа много език, изискващ много машинни ресурси. Освен това изучаването му е доста трудоемка работа.

Един от проектите, които били отклонени от групата разработваща Алгол-68, бил проекта на специалиста от Института по информатика в Цюрих, Никлаус Вирт. Разработването на програмни езици било хоби на Вирт и той не прекратил разработването на език, който да замени, ползващият се със сериозна репутация език Алгол-60. През 1971 година той публикува описанието на своя език и го нарича на името на изобретателя на първото изчислително устройство – Паскал. През 1973 е разработен първият транслатор за този език, а малко по-късно е разработена програмната среда Turbo, получила много голяма популярност сред програмистите в целият свят.

И така през 1971 година е разработен езикът Pascal. Той получава голямо разпространение. Близък е по структура до езика Алгол, но има много нови идеи от структурното програмиране. Използва се за разработване предимно на научно-технически приложения, но има и големи възможности за бизнес приложения.

Главната новост на този език е, че удовлетворява изискванията на обикновените потребители и специалистите по изчислителна техника. Това е първият език, който може лесно да се научи и е логически правилно построен. Граматическите правила на Pascal могат да бъдат написани на 4 – 5 страници.

С ( С++) е програмен език създаден през 1972 година. Това е универсален език с големи възможности. Близък е по структура до Pascal, но е с по-големи възможности за разработване на системно програмно осигуряване. Големи части от операционната система Windows са написани на езика С и С++.

Програмният език АДА е създаден през 1979 година. Той е универсален език за програмиране с развити възможности за структуриране на данни. За него е характерна модулната организация в процеса на програмиране и намира широко приложение при програмиране на вградени микрокомпютърни устройства в различни машини и оборудване.


2 Интегрирана програмна среда

Програмните средства, които осигуряват написването, редактирането, изчистването от грешки, преобразуването в двоичен код и стартирането на една програма, написана с помощта на определен програмен език се нарича интегрирана програмна среда. Най-общо, интегрираната програмна среда съдържа следните основни елементи: текстов редактор, компилатор, свързващ редактор, дебъгер, система библиотечни функции, помощна система.


2.1. Текстов редактор.

Това е програма която подържа написването и редактирането на текста на програмите и съхраняването им в подходящ вид върху постоянен външен носител (диск). Текста на програмата може да се напише на какъв да е редактор, например Notepad, но редакторът на интегрираната програмна среда предоставя някои улеснения: записва файла с подходящо разширение (‘.pas’- за Pascal,’.cpp’- за С++,’.bas’- за Basic и др.), отбелязва ключовите думи в даденият език, предоставя помощна информация за програмният език и др. На фиг. 3.1 е показан общият вид на прозореца на програмната среда TURBO Pascal, основната част на която е текстовия редактор, а другите елементи на средата се активират с основното меню намиращо се в горната част на прозореца.





Фиг. 3.1 Програмна среда Turbo Pascal
2.2. Компилатор (транслатор).

Компилаторът е програмна система, която преобразува текста на програмата в машинни (двоични) команди. Процесорът на КС може да изпълнява само двоични команди. Затова, програмите написани на даден програмен език трябва да се преобразуват в двоични команди. Процесът на превеждане на програмата на друг език (в случая в машинен език) се нарича транслация (компилация). Оригиналният вид на програмата се нарича изходен код (source), а преобразуваната версия – обектен код (object code). Процесът на транслация се състои от три етапа – логически анализ, синтактически разбор и генериране на обектен код.

Логическият анализ е процес на формиране на отделните символни групи от текста на изходната програма. Например, когато се срещне група символи ‘if’ тя трябва да се интерпретират от транслатора като савкупност, която е ключова дума в програмният език и има точно определена функция при записа на някои оператори. Или ако се срещнат символите ‘154’, те трябва да се интерпретират не като отделни цифри 1, 5 и 4, а като единно числово значение – числото 154. Тази дейност изглежда доста елементарна, но за компютърната система, това е важна и отговорна дейност, защото машината не притежава интелегентност и за нея всички символи са само номера от таблицата за ASCII код.

Целта на логическият анализ е, чрез последователно прочитане на символите от изходната програма, да се образуват самостоятелни логически единици. Тези самостоятелни текстови единици се класифицират, като се определя вида им – числа, думи, аритметически операции и т.н. Генерираните текстови единици се предоставят на синтактическият анализатор за по-нататъшна обработка.

При синтактическият разбор се игнорират всички коментари и се анализира програмата в термините на логически единици формирани от логическият анализатор. Задачата на синтактическият анализатор е да обедини логическите единици в оператори и да идентифицира граматическата структура на програмните елементи и разпознае ролята на всеки компонент. За опростяване на синтактическият разбор, ранните езици за програмиране изискваха всеки оператор от програмата да се разполага в определено място на бланката за изходния текст. Тези езици се наричат езици с фиксиран формат. Сега се използват предимно езици със свободен формат.

Процесът на синтактическият анализ се основава на савкупност от правила, определящи синтаксиса на програмният език. Един от начините за представяне на синтактическите правила се състои в използването на така наречените синтактични диаграми. Отделните редове на програмата се сравняват за съответствие с някаква савкупност от синтактически диаграми. Съставя така нареченото дърво на синтактическия анализ за изходната програма – граматическа структура на програмата.

При синтактическият анализ на операторите за декларации, съдържащата се в тях информация се записва в специална таблица на символите. Тази таблица определя какви променливи са описани в програмата и какви типове данни или структури са свързани с тях.

Компилаторът прави проверка за правилността на текста на програмите и формира подходящи съобщения за допуснатите грешки пр записа на отделните оператори в програмите. Компилаторът открива и съобщава само за така наречените синтактически грешки. Това са грешки от формално естество – неправилно записани оператори, пропуснати части от команди, използване на недекларирани променливи и др.

След коригиране на всички синтактически грешки, компилаторът преобразува текста на програмата в савокупност от двоични команди, които записва в междинен файл (obj - обектен файл). Този процес включва различни аспекти, един от които е повишаването на ефективността на генерираният код. Например, нека трябва да се транслира последователност от следните два оператора

x = y + z ;

w = x + z ;.

Тези оператори могат да се транслират поотделно. Това обаче ще бъде неефективно. Генераторът на двоичният код трябва да отчете, че когато се изпълни първият оператор, променливите x и z вече се намират в регистрите с общо предназначение на микропроцесора и не е необходимо отново да се зареждат в тях от паметта. Използването на такива подходи при генерацията на двоичния код се нарича оптимизация на кода.


2.3. Свързващ редактор.

Обектният файл, който създава компилаторът макар и записан в двоичен код все още не е готов за изпълнение от микропроцесора. Една от причините за това е, че програмните езици позволяват програмите да се изготвят от отделни модули, компилирани в различно време. Затова обектният код получен при транслацията често представлява само някаква съставна част от цялостната програма, която трябва да се свърже с другите части за да се получи едни цяло. Даже програмата да се състои само от един модул, обектният код от транслацията не е готов за изпълнение, тъй като към него не са включени стандартните библиотечни функции, които осигурява програмната среда.

Свързващият редактор е програмна система, която свързва файловете създадени от компилатора в единнен изпълним файл (приложение). Той добавя всички необходими библиотечни подпрограми към създадените от компилатора обектни файла и ги свързва, като създава изпълним файл (разширение ‘.exe’) или библиотечен файл (разширение ‘.dll’). Свързващият редактор проверява правилността на всички връзки между отделните обектни модули и генерира съобщения, ако има грешки.
2.4. Дебъгер.

Дебъгерът е програмна система, която подпомага програмистите за отстраняване на грешки от логическо естество, допуснати в програмите. Тези грешки не са програмни, а грешки или пропуски в алгоритъма на задачата. Тези грешки могат да доведат до опит за изпълнение на недопустими операции от микропроцесора (аритметично деление на нула, препълване на полето за дадена променлива, адресиране извън адресното пространство на паметта и др.). Тогава се генерира съобщение за вида на грешката и адрес в паметта, където се намира двоичната команда предизвикала грешката. В други случаи, грешката няма да предизвика спиране на изпълнението на програмата, но получаваните резултати няма да са верни заради грешният алгоритъм. Тези грешки са по-опасни и в редица случаи се не се откриват или се откриват след като програмата вече е била използвана.

Исторически за тези грешки е останало наименованието ‘бъг’ – ове (‘bug’ – буболечка) и поради тази причина самата програма се нарича дебъгер (премахване на ‘бъг’ – ове.

Основният проблем, при отстраняването на логическите грешки е че генерираните съобщения се отнасят до адреси в паметта, където се намират машинните команди, а програмистът разработва логиката на програмата на основата на първичният текст написан на определен програмен език. За да се установи съответствие между машинните команди и текста на програмата, програмната система дебъгер, изготвя специален файл – карта на паметта на програмата (‘.map’ – файл). В тази карта се записва относителният адрес на машинната команда в паметта, с която започва всеки ред от текста на програмата. При наличието на тази карта на паметта, всеки адрес съпровождащ дадено съобщение за грешка, може да бъде отнесен към определен ред в изходният текст на програмата.

Дебъгерът предоставя, някои специални средства за проверка и отстраняване на логически грешки. Така например, могат да се маркират определени оператори в текста на програмата (точки на прекъсване), в които да се спира изпълнението на програмата и да се проверяват стойностите на някои променливи с цел да се проследи развитието на даден процес на обработка на информацията. Освен това, програмата може да бъде стартирана в така нареченият режим ‘трасиране’. При него програмата се изпълнява стъпка по стъпка (оператор след оператор) и може да се следи изменението на стойностите на някои величини.
2.5. Подсистема с библиотечни функции.

Това е система. Която осигурява използването на множество стандартни функции, които облекчават програмирането на дадения алгоритмичен език. Тези библиотечни функции се групират в различни раздели – функции за входно-изходни операции, математически функции, функции за работа със текстови низове и т.н. Колкото повече са библиотечните функциивключени в дадена програмна среда, толкова по-големи възможности предоставя тя на програмистите.


2.6. Подсистема с помощна информация.

Тази система осигурява обяснителни текстове за голяма част от операциите и правилата използвани в даденият програмен език.


3 Алгоритми

3.1 Понятие за алгоритъм

Алгоритъмът представлява завършена система от формални правила които точно и еднозначно определят последователността от недвусмислени и изпълними етапи, определящи краен процес за решаване на дадена задача.

В определението на това понятие се съдържат и основните изисквания към алгоритмите. На първо място отделните етапи трябва да са изпълними и то от обекта, който ще ги изпълнява (не изобщо изпълними). Понякога вместо изпълним се използва изразът ефективен. Това означава, че когато се казва ефективен алгоритъм се има пред вид и изпълним.

Следващо изискване е алгоритъмът да е недвусмислен. Това означава, че по време на изпълнение на алгоритъма, при всяко състояние на процеса информацията трябва да е достатъчна, че еднозначно и напълно да се определят действията, които трябва да се изпълнят на всеки от етапите. Това означава, че на всеки етап на алгоритъма не са необходими каквито и да са ‘творчески способности’, а само използването на наличният набор от инструкции на обекта изпълняващ задачата.

Изискването за краен процес, означава, че изпълнението на алгоритъма непременно трябва да го доведе до завършване. Това изискване се налага, поради съществуването на голяма група процеси, които по дефиниция са безкрайни. Такива процеси, се разглеждат в теорията на изчисленията и много често те се апроксимират с крайни процеси.

Класически учебен пример за алгоритъм е алгоритъмът на Евклид. Той се отнася до определянето на най-големият общ делител на две естествени числа. Ако двете числа са равни, то най-големият общ делител съвпада със самите числа. Ако те са различни, най-големият общ делител на двете числа е делител и на разликата между тях. При това, ако се разгледат разликата и по-малкото от двете числа, то техният най-голям общ делител е същият както на изходните числа. Този факт позволява да се дефинира последователност от действия, които довеждат до намиране на най-големият общ делител на числата.

Нека означим изходните числа с x и y. Ако те са равни, търсеното решение е едно от двете числа. Ако са различни, да означим разликата между тях с g, а по-малкото от двете числа с h. Тогава можем да заменим изходната двойка числа x и y с новата двойка g и h и да решаваме задачата по-същият начин както в началото. Този процес може да се продължи дотогава, докато се получи двойка числа, които са равни помежду си и това е решението на задачата. Последователността от действия за решаване на задачата могат да се запишат като отделни стъпки:


  1. Начало на задачата;

  2. Задаване стойности на числата x и y;

  3. Проверка: ако x > y, то премини към т. 6;

  4. Проверка: ако y > x, то премини към т. 7;

  5. Изпълнено е: x = y; най-голям общ делител е z = x ; край;

  6. x = xy ; премини към 3 ;

  7. y = y x ; премини към 3 ;

Този алгоритъм можем да проверим с конкретен числен пример. Нека началните стойности на числата x и y са съответно 49 и 21. След задаването на тези стойности, трябва последователно да се изпълнят предписанията от горната поредица след т.3 надолу. Проверката в т. 3 показва, че условието x > y е изпълнено и изпълнението трябва да се прехвърли към т. 6. Операцията x = xy, описана в тази инструкция е често използвана конструкция в програмните езици за компютърните системи. Тя трябва да се разбира, като операция за изваждане на стойността на y от стойността на x и запис на полученият резултат на мястото на x. В конкретният случай, след изпълнението на тази операция, стойността на x ще бъде 49-21=28. С новите стойности x = 28 и y = 21 изпълнението на алгоритъма се прехвърля отново в т. 3. Следващите стойности на величините x и y в процеса на изпълнение на алгоритъма се променят както следва:

x y

  1. 21

  1. 21

  1. 14

  1. 7

Най-големият общ делител се получава, когато стойностите на x и y станат равни помежду си. В случая стойността е 7.
3.2 Описание на алгоритмите

В представеният пример, алгоритъмът беше описан с помощта на естественият разговорен език (словесно-описателен метод). В повечето случаи, този начин на представяне на алгоритмите не е подходящ, особено за алгоритми с голям брой последователни стъпки (инструкции). Тогава се губи прегледността на алгоритъма и се затруднява проследяването на отделните връзки и логически разклонения в него. По-голяма прегледност се получава, когато се използват графични означения за отделните типове инструкции. Графичното представяне на алгоритъмът се нарича блок-схема.

Използват се няколко стандартни геометрични фигури за представяне на различните типове действия от алгоритъма. Последователността в която следва да се изпълняват отделните операции или блокове се указва със стрелки.

Всяка блок-схема има начален блок с който се указва къде се намира началото на алгоритъма (откъде започва изпълнението на задачата). Аналогично, трябва да има блок за край на алгоритъма. Най-често тези блокове се означава графически със следната фигура:



Операциите за въвеждане и извеждане на информация, се представят графически с успоредник, в който се описват величините, които получават стойности или тези които се извеждат към някое от входно-изходните устройства:



Разклоненията в алгоритмите, се определят от резултата при проверка на някакво логическо условие. При изпълнение на условието (резултат ‘да’) се избора една последователност от команди, а при неизпълнение на условието (резултат ‘не’) се избира друга последователност. Графическият символ, за представяне на оператор за разклонение на алгоритъма има вида:



Операциите свързани с обработка на информацията (действия с величините) се изобразяват посредством правоъгълници, в които се описват действията с величините:




Като използваме въведените графически форми за представяне на отделните действия от алгоритмите, разгледаният по горе алгоритъм на Евклид можем да изобразим, както това е показано на фиг 3.9


3.3 Итерационни структури

Итерационните структури са фрагменти от алгоритмите за решаване на задачи, в които се организира циклично повторение на определен набор от инструкции, които постепенно приближават процеса до желаният резултат. Този метод се използва за организация на циклични програми с неизвестен предварително брой на повторенията. Обикновено при тези процеси, резултатът от предидущото действие се използва като входна информация за следващото действие (цикъл). Контролът на реализираният брой повторения се осъществява на основата на някакво условие, определящо приближаването на изчислителният процес до желаният резултат. Често като условие за контрол на итерационните цикли се използва достигането на предварително зададена точност на изчисляваните величини.

Типичен пример на итерационна структура беше представена при разглеждането на алгоритъма на Евклид. В него, инструкциите от 3 до 7 се повтарят дотогава, докато се получи равенство на числата x и y. Това повторение на инструкциите се управлява от двете условия в стъпки 3 и 4 на алгоритъма.

Многократното изпълнение на последователност от инструкции представлява важна алгоритмическа концепция. Един от методите за организация на повторение на изпълнението на поредица от команди (който се явява итерационна структура) се нарича цикъл. Характерно за циклите е, че в конструкцията им се предвиждат специални инструкции, осигуряващи управлението на цикъла набор от операции които се изпълняват многократно. Управляващите инструкциите задават началото и краят на цикъла и задават структурата и типа на цикъла, а многократно изпълняваните инструкции образуват тялото на цикъла. Инструкцията за начало на цикъла, обикновено се нарича заглавен оператор.

Управлението на цикличните структури обикновено съдържа три операции: инициализация, проверка на условие за край на цикъла и модификация. При инициализацията се установява началното състояние, от което започва изпълнението на цикъла. Самият процес на инициализация представлява задаване на начални стойности на някои величини, които в процеса на изпълнение на цикъла се променят. Операциите за инициализация могат да бъдат вградени в управляващите оператори на цикъла или да бъдат извършени преди началото на цикъла.

Операцията за проверка на условието за край на цикъла е много важна, тъй като тя определя броят на повторенията на инструкциите от тялото на цикъла. Когато такова условие не се проверява или е зададено некоректно, цикълът може да се превърне в безкраен. Модификацията е операция чрез която се променя състоянието на определени обекти (стойности на величини), така че ситуацията да се приближава към изпълнението на условието за край на цикъла.

Представеният по горе алгоритъм (Евклид), е типична циклична структура, тъй като е се извършва многократно повторение на определен набор от инструкции. Като инициализираща операция, може да се разглежда задаването (въвеждането) на стойности на величините x и y. Тези стойности определят началното състояние на циклическият процес. Като условие за проверка за край на процеса се използват инструкциите 3 и 4. Когато условието в някоя от тях е изпълнено, то е индикация че процеса трябва да продължи. Само когато и двете условия не са изпълнени (т.е изпълнено е условието x = yусловието за край на цикъла) процеса се прекратява. Модифициращи операции се явяват 6 и 7, тъй като чрез тях се променят стойностите на x и y и процеса се приближава до условието x = y. Алгоритъмът на Евклид е специфичен с това, че в тялото на цикъла няма изпълними операции. Изпълнението на цикъла се извършва посредством модифициращите операции 6 и 7 и в известен смисъл, те могат да се разглеждат и като тяло на цикъла.

Използването на циклически структури придава на алгоритмите гъвкавост и прегледност. Съществуват няколко начина на организиране на циклически структури. Първият начин се нарича цикъл с предусловие. При него, първо се проверява условието за продължение на цикъла и ако то е изпълнено се изпълняват операциите от тялото на цикъла (фиг. 3.9). Характерното за този цикъл, е че операциите от тялото на цикъла се изпълняват след проверка на условието за продължение на цикъла и ако то не е изпълнено още в началото, е възможно тялото на цикъла да не се изпълни нито един път.

Другият тип организация на цикъл се нарича цикъл с постусловие. При него първо се изпълняват операциите от тялото на цикъла и след това се проверява условието за продължаване на цикъла (Фиг.3.11). Ако то е изпълнено, управлението се връща за повторно изпълнение, а в противен случай се излиза от цикъла.

В практиката съществуват различни типове задачи, които изискват използването на итерационни структури. Един от възможните случаи за необходимост от многократно повторение на определен набор от инструкции е последователна обработка за няколко еднотипни обекта. В този случай, повторението на инструкциите се определя от броят на обектите в дадената поредица, а условито за завършване на цикъла се формира при обработката на последният от обектите. При организацията на циклични процеси за този тип задачи, обикновено броят на повторенията е известен предварително.

В други случаи, повторението на инструкциите се извършва върху едни и същи обекти, но при променени условия (променени стойности на величини). В този случай, условието за завършване на циклическият процес, се задава от някакво специфично състояние на величините участващи в циклическият процес. Пример за използването на такъв цикъл е алгоритъмът на Евклид.


4 Основни концепции на традиционното програмиране.

Както при използването на обикновеният разговорен език, програмистите създават свой стил и традиции при използването на алгоритмичните езици. По тази причина, няма единни становища за прдимствата и недостатъците на съществуващите езици. Не случайно, един от първите езици от високо ниво, FORTRAN, все още се използва, въпреки че бяха създадени множество езици със редица нови идеи. Много програмисти са създали свой стил на програмиране с FORTRAN и тях не ги затруднява решаването на каквато и да е задача. В този смисъл, почти с всеки алгоритмичен език могат да се съставят програми за решаване на по-голямата част от задачите, които възникват в практиката. Все пак, отделните програмни езици имат специфична насоченост и това до голяма степен определя тяхното използване в практиката.

Всеки програмен език може да се разглежда като савкупност от три основни компонента:


  • азбука на програмният език – съдържа набор от букви, цифри и специални символи, допустими за описание на отделните команди и оператори. Освен това, в програмният език се включва определена система от специални думи, които се наричат ключови или запазени думи.

  • Синтаксис – система от правила, които определят допустимите отношения между обектите на езика, на които се подчиняват всички оператори (команди).

  • Семантика – система от правила, позволяващи точно и еднозначно да тълкуване на обектите от езика.

Основна структурна единица на програмите създавани с различните програмни езици е операторът. Обикновено операторите в програмните езици се разделят на три категории: оператори за декларации; изпълними оператори и коментарии.Операторите за декларации се използват за въвеждане на терминологията, която се използва по нататък в програмата. Например, с тях се обявяват имената и типът на всички данни, които ще се използват в програмата или се указват режими на работа на програмните части и т.н.

Изпълнимите оператори описват отделните стъпки при обработка на информацията от програмата. Те представляват описанието на алгоритъма за решаване на задачата. Коментарите представляват поясняващи текстове, записани в програмата, чрез които се подобрява читаемостта на програмата. Те се игнорират от програмата, която преобразува текста в двоични команди и служат единствено за пояснение към програмният текст.




4.1 Променливи и константи.

Както беше отбелязано, важна стъпка в процеса на усъвършенстване на компютърното програмиране се явява въвеждането на буквени означения (наименования), вместо цифрови адреси за величини, чиито стойности са разположени в паметта на компютъра. Тези наименования се наричат идентификатори, а величините, които означаваме с идентификатори наричаме променливи. Това означава, че при изменение на съдържанието на паметта в даден участък, се изменя стойността на величината свързана с определен идентификатор и обратно, за да изменим съдържанието на даден участък от паметта, трябва да изменим стойността на величината с даден идентификатор. Тъй като в програмните езици от високо ниво, почти не се използват конкретни адреси в паметта за записване на информация, всички данни се именоват. Поради тази причина, променливите играят важна роля в процеса на програмиране.

Освен величини, които променят стойностите си по време на изпълнение на програмите, в практиката на програмирането се използват и величини, чиято стойност остава постоянна. Те могат да се използват или направо като числови стойности или чрез задаване на име на величината и отбелязване, че в процеса на работа нейната стойност не трябва да се променя. Тези величини се наричат константи.
4.2. Операции, операнди и оператори.

Операторите са основни логически елементи на компютърните програми. Те се състоят от аритметични или логически изрази, специални синтактични конструкции и спецификации за извикване на подпрограми или функции. Изразите представляват правила за пресмятане на стойности. Те се образуват с помощта на аритметичните и логически операции допустими за даден алгоритмичен език. В тях се използват величини, които се наричат операнди. Операнди могат да бъдат променливи (x, y, im) или константи (10, 3.14159). Най-простият израз се състои само от един операнд - променлива или константа. За задаване на приоритет при изпълнение на операциите се използват скоби. Ето няколко примера на аритметични и логически изрази:



(a+x)*xr/3.14159 ; -w/(ax+r) ; bool and (a>5)

Един от най-важните и използвани оператори в програмните езици е операторът за присвояване. В лявата част на този оператор се намира променлива, която при изпълнението на оператора получава стойност, а в дясната част - израз, чиято стойност се присвоява на променливата. В различните програмни езици се използват различни начини на записване на този оператор. В език Pascal операторът за присвояване има вида:



var := expr ; , където var е променлива, а expr е израз. В език С++ в оператора за присвояване се използва знака ‘=’: var = expr ;
Типове данни

Типовете на различните данни се определя от множеството стойности G, които могат да приемат константите и променливите от този тип и операциите които могат да се извършват с тях. Алгоритмичните езици разполагат с определен набор от типове данни, които се наричат основни (вградени) типове данни. Те са определени (дефинирани) в основното обезпечение на езика и обикновено за тях са има назначени специални ключови думи. Програмните езици позволяват дефинирането и на допълнителни типове данни, за които се специфицира множеството от стойности, които могат да приемат величините и операциите които могат да се извършват с тях.


База данных защищена авторским правом ©obuch.info 2016
отнасят до администрацията

    Начална страница