Вход за познати


Съдържание
Коментари
// COURSE_3.TXT 06.11.2009 р.ж.

ПРОГРАМИ И ДАННИ
Примерът по-долу е чисто илюстративен и се отклонява
нарочно от реалната работа с цел по-лесно обяснение.
Примерната програма няма да работи заради това отклонение.
Обаче съвсем скоро (в статия 5) ние ще го променим и
ще можем да включим работеща машина.

Поглед
Интуитивно ние вече имаме идея как работят програмите. Процесорът ги изпълнява като поредица команди -
тъй както те са записани в паметта. Конструкцията, описана в статия 2, ни дава малко свобода с която можем да построим
език. Да си спомним за променливите. Единадесет команди и два типа променливи могат да формират прост език:
Командите са:
постави събери извади превърни сравни преход подпреход обратно условно вход изход

Двата типа променливи са: стрингове (255 байта) и целочислени (4 байта) - виж по-долу Даннови типове.
Както видяхме в статия 2, има начин да именуваме адресите, при което едно командно изречение би изглеждало така:
постави град, 'КАРЛОВО'
Преводът на човешки език би звучал така : започвайки от адреса в променливата "град", постави буквите между
двата ограничителя.
В командното изречение думата постави се нарича команда,
думата град се нарича първи операнд,
а 'КАРЛОВО' се нарича втори операнд.
По правило първият операнд е приемник, а вторият - източник на данни. Тоест резултатът остава в първия операнд.
Сега да напишем една примерна програма която пресмята населението в един град
според преброяване към 1 януари и сведения за раждаемост и смъртност.
Програмният текст съдържа само оскъдни забележки, които се предхождат от
означението "//". Това означение показва, че следва коментар;
Коментарът е за нас, не за компютъра. По-подробни поясненията има след края на програмния текст.

Език и компилатор
Разстоянието между човешки разказ и процесорна програма е голямо. За да се срещнат, всеки трябва да извърви
своята половинка от него. Човекът трябва да спази синтаксиса, видим по-горе. Останалото го прави специална
програма, наречена компилатор. Компилаторът трябва да се възприема като инструмент неотменно приложен към
компютърната машина, макар да няма пряко отношение към програмните процеси. Компилаторът прочита пограмния
текст и съставя участък памет, съдържащ процесорни команди и представляващ истинското тяло на програмата.
Езикът, на който е написана горната програма се нарича Асемблер. Асемблерът е език от първо ниво - най-проста
версия на компютърен език, при която има пряко съответствие между човешки думи, имена на променливи и машинни
кодови числа. Асемблерът превръща една човешка команда в една машинна команда и едно име на променлива
в един адрес от паметта. По този начин компилаторът произвежда машинното тяло на програмата и може да ни го
покаже в числен вид.

Граматика Етикети и Константи
Програмните текстове спазват точно реда и синтаксиса, видими в горния пример. Програмният текст непременно трябва
да започва с думата "ПРОГРАМА", да има участък "КОНСТАНТИ", участък "ПРОМЕНЛИВИ" и участък "КОД".
Тези думи не са част от кода, те съставят само тънък преходен езиков слой между текста и компилатора.
В участъка променливи трябва да са описани всички имена и начални съдържания на променливи - операнди, използувани
в кода. Една линия описва една променлива като "име съдържание". В имената не се допускат интервали и запетайки.
Стринговите съдържания се заграждат с единични кавички - апострофи. В кодовата част всяка линия трябва да започва
с командна дума и след нея трябва да има нула, един или два операнда. Когато операндите са два, между тях се пише
запетая. Константите и етикетите не са част от кода. Те са нужни само на компилатора, за да замести техните
декларирани стойности в кода. Етикетите започват със символа "@" и представляват текстови заместители на адреси,
в които се прицелват командите "преход", "подпреход", "условно".

Преходи и подпрограми
Когато процесорът срещне командата "преход", той нарушава реда на изпълнение на командите и преди да пристъпи
към следващата команда, пропуска толкова клетки памет, колкото е посочено в първия операнд. Следващата команда
вече не е по-долната линия, а тази която се намира на адреса получен след пропускането. Ръчното пресмятане на
броя пропуснати клетки е трудно, но компилаторът прави това автоматично, според етикета, който следва.
Командата "подпреход" прави същото, но преди това запомня адреса на следващата командна линия. Когато
процесорът срещне команда "обратно", си спомня този адрес и се връща, за да продължи оттам изпълнението.
Участъкът от етикета, посочен в подпрехода до командата "обратно" се нарича подпрограма.
Командата "условно" действува както "преход", но само ако флаговият регистър (виж по-долу) удовлетворява
условието от втори операнд.

Флагов (битов) регистър
В процесора има един 32-битов регистър, наречен ФЛАГОВ, който съдържа резултат от сравнения и други битови отговори.
Когато срещне команда "сравни", процесорът съпоставя следващите два операнда и ако те имат еднакво съдържание,
записва числото 2 в регистър ФЛАГОВЕ. В следващата команда "условно" същият този регистър се съпоставя с числото 2
и така се задействува условен преход към адреса посочен в етикет "@думата_е_въведена". Това съпоставяне се извършва
по време на изпълнението на самата команда "подпреход". (виж по-горе Преходи)

Вход и Изход
Командата "вход" прави заемка от преходен слой, който превежда външни събития към наша променлива. Този преходен
слой е предмет на специално обсъждане, ще отложим обсъждането за по-нататък, а засега ще се придържаме към конзолата
(виж по-долу). Командата "изход" също превежда наша променлива към изходен слой, засега приравнен към конзолата.
Конзола - като компютърен термин - означава най-проста версия на входен и изходен преходен език. В конзолата входа
работи като всеки символ въведен от клавиатурата се превежда към наша дума. По конструкция клавишът "Enter" излъчва
символ номер 13 и програмата го третира като край на въвеждането. Конзолният изход рисува последователно символите
от нашата променлива върху платно.
Конзолата е удобна за обяснения или проби, но в реална обстановка - не. Последователните действия, макар и лесно
обясними, страдат от лоша обратимост, което прави конзолния метод непригоден за истинско ползване. Конзолите работят
в редки случаи за инструментални цели, свързани със самия компютър. Съвременният потребителски софтуер, тоест този
който наистина е ценен, използува множество разнородни и паралелни входни/изходни канали за свобода и оперативност.
За тях ще стане дума по-късно.

Даннови типове
Цели числа - Четири байта се равняват на 32 бита. Една 32-битова поредица има над четири милиарда възможни комбинации,
така в един четирибайтов комплект се съдържа число от нула до четири милиарда. Но за да има малко симетрия, половината
от комбинациите се обявяват за положителни а другата половина- за отрицателни с което комплекта описва цели числа
от минус два милиарда до плюс два милиарда.
Стрингове - Стрингът представлява един водещ байт за дължина и след него още толкова, колкото е посочено във водещия
байт. Празният стринг представлява само един байт с нулево съдържание. Когато компилаторът срещне
команда "постави град,'КАРЛОВО'" той ще настани стринга 'КАРЛОВО' вътре в самия код на програмата върху
осем (1+7) байта. Oбаче стринговата променлива "град" заема в паметта 255 байта, тоест максималната си дължина.

Микроверсии
Компилаторът превръща една командна дума в едно командно число. Но това командно число варира в зависимост от
следващите операнди. Командата "събери брой,родени" прибавя към първото число второто, обаче командата
"събери отговор,град" добавя към първия стринг втория. Това са два различни командни кода. Кой от двата да бъде
избран, решава компилатора, след като разпознае от какъв тип са двата следващи операнда. Следователно една командна
дума от асемблера може да съответствува на едно, две, понякога и повече командни числа. Те представляват микроверсии
на командата, записана в програмния текст.


Това беше пример за език от първо ниво, достатъчен за една примерна програма.






roncho.net