Лекция

Тема: «Понятие алгоритма. Алгоритмические языки. Машинные коды»

 

План

1. Понятие об алгоритмических язы­ках

2. Этапы разработки программы

3. Основные понятия программирования

 

1. Понятие об алгоритмических язы­ках

Алгоритмические языки близки к естественному язы­ку. Именно такая цель ставилась при их разработке. Од­нако правила построения конструкций в алгоритмическом языке более «жесткие». Это означает, что алгоритмические языки допускают меньшее разнообразие для описания действий алгоритма, чем естественный язык и привычная математическая символика, и машина однозначно понимает любую конструкцию языка.

Например, для умножения двух переменных а и b общепринятая математическая сим­волика допускает несколько возможных форм записи: 1) ab; 2) axb и т. п. А на алгоритмическом языке, например на языке Бейсик, эту операцию можно записать только единственным образом как А*В. Небольшие ошиб­ки или описки, допускаемые в предложениях естественного языка и не искажающие, на наш взгляд, смысла, совершен­но недопустимы в алгоритмическим языке, где каждый сим­вол и его место в конструкции имеют строго фиксированное значение.

Так как программа на алгоритмическом языке предназ­начена для выполнения на ЭВМ, то в алгоритмическом язы­ке, помимо средств, описывающих действия алгоритма, обязательно должны быть также определены средства, по­зволяющие вводить исходные данные в ЭВМ и выводить результаты выполнения программы.

Алгоритмический язык – формальный язык, используемый для записи, реализации или изучения алгоритмов

Компьютер не понимает естественного языка человека, а понимает только свой язык – машинный код. Что касает­ся языка программирования, то он с помощью фиксирован­ных систем обозначений и правил позволяет описывать ал­горитмы и структуры данных, которые впоследствии будут переведены транслятором в машинный код.

Процессор – это, по сути, очень сложный и продвинутый калькулятор. У него есть множество ячеек памяти (называемых регистрами) с которыми и между которыми проводятся различные математические и байтовые операции. Машинный код как раз и представляет собой описание последовательности выполнения операций и набора участвующих данных. По сути, это единственный язык, который понимает процессор вашего компьютера.

Все языки программирования можно разделить на язы­ки низкого, высокого и сверхвысокого уровней.

Языки низкого уровняэто средство записи инструкций компьютеру простыми приказами-командами на аппаратном уровне. Такой язык зависит от структуры конкретной ЭВМ и иногда называется машинно-ориентированным языком. Этот язык плохо приспособлен для использования челове­ком, ведь запись программы на этом языке представляет со­бой последовательность нулей и единиц, и мало шансов, что сложная задача будет запрограммирована безошибочно. Для упрощения программирования был разработан язык симво­лического кодирования (автокод, или язык ассемблера). Про­грамма, написанная на таком языке, ближе человеку, но все равно требует от программиста широких познаний в этой области.

Следующая группа – языки программирования высокого уровня. Это языки, которые допускают описание задачи в наглядном, легко воспринимаемом виде. Их отличительной особенностью является ориентация не на систему команд той или иной ЭВМ, а на систему инструкций, характерных для записи алгоритмов определенного класса. К языкам програм­мирования высокого класса относятся Бейсик, Фортран, Ал­гол, Паскаль, Си и др.

К языкам программирования сверхвысокого уровня мож­но отнести Алгол-68, в котором сделана попытка формали­зовать описание языка, приведшая к появлению двух типов программ: абстрактной и конкретной. Первый тип программы – абстрактный – создается программистом, конкретный – выводится из первого. Существует предположение, что при таком подходе принципиально невозможно породить син­таксически (а на практике и семантически) неверную конк­ретную программу.

Программа, написанная на любом языке программирования, является исходной программой. Особенность таких про­грамм, как мы помним, заключается в том, что они состоят из инструкций, понятных человеку, но не понятных процес­сору компьютера. Чтобы процессор мог выполнить работу в соответствии с алгоритмом, записанным в исходной про­грамме, эта программа должна быть переведена на машин­ный язык – язык команд процессора. Такой перевод про­граммы называется трансляцией (translation – перевод), а выполняется он специальными программами – трансля­торами. В программе-трансляторе «за­ложены» все правила алгоритмического языка и способы преобразования различных его конструкций на машинный язык. Именно поэтому при составлении программы на ал­горитмическом языке нужно скрупулезно придерживаться правил этого языка, иначе ЭВМ не поймет вашу программу или поймет неправильно.

Существует три вида трансляторов: интерпретаторы, ком­пиляторы и ассемблеры.

Интерпретатор – транслятор, переводящий текст про­граммы поэтапно (покомандно) и сразу же (то есть парал­лельно) выполняющий оттранслированную команду исход­ной программы.

Компилятор транслирует текст программы в модуль на машинном языке, затем программа переписывается в опера­тивную память и лишь после этого исполняется процессо­ром компьютера. Именно с использованием трансляторов такого типа осуществляется перевод программы на многих языках программирования в машинный код. Поэтому рас­смотрим схему его работы.

Описание: \\server\w$\xampp\htdocs\program\lekcii\1\lekc02_2.jpg

Цифрой 1 на схеме обозначен блок синтаксического кон­троля текста программы, цифрой 2 –генератор машинного кода.

 

Если генератор машинного кода компилятора перевел исходный текст программы в необходимую форму, значит, в тексте программы нет синтаксических ошибок, но это не говорит об отсутствии ошибок в алгоритме. Убедиться в пра­вильности работы программы можно только при ее тести­ровании, то есть при обработке результатов, получаемых в процессе работы программы.

Последний вид трансляторов ­– ассемблеры. Они предназ­начены для перевода программы, написанной на языке ас­семблера (автокода), в программу на машинном языке.

Все трансляторы, независимо от их вида, решают следу­ющие основные задачи:

·         ·        выполняют анализ и проверяют синтаксис транслируе­мой программы;

·         ·        генерируют машинный код программы;

·         ·        распределяют память для выходной программы.

 

2. Этапы разработки программы

Решение любой задачи с помощью компьютера – это совме­стная деятельность человека и ЭВМ. Чтобы человек и ком­пьютер понимали друг друга, они должны «разговаривать» на одном языке – языке программирования.

Программирование – это процесс создания (разработки) программы, который может быть представлен как последо­вательность нескольких этапов.

1. Постановка задачи. На этом этапе подробно описывается исходная информация, и формируются требования к ре­зультату, а также описывается поведение программы в особых случаях.

2. Математическое или информационное моделирование. Этот этап создает математическую модель решаемой за­дачи, которая может быть реализована на компьютере. Данный этап очень тесно связан с первым, и выделять его имеет смысл только в том случае, когда нет единого ме­тода решения.

3. Разработка или выбор алгоритма. Здесь необходимо опре­делить последовательность действий, которые надо вы­полнить для получения результата.

4.      Программирование. Программой называют последовательность действий, направленных на выполнение их некоторым исполнителем (например, компьютером).

5.   Ввод программы и исходных данных в ЭВМ.

6.   Тестирование и отладка программы. На этом этапе происходит исполнение алгоритма с помощью ЭВМ, поиск и исправление ошибок. Отладка программы заключает­ся в тестировании программы на контрольных примерах.

7. Исполнение отлаженной программы и анализ результа­тов. На этом этапе программист задает исходные данные и анализирует результаты, полученные в ходе выполне­ния программы.

 

3. Основные понятия программирования

Введем основные понятия программирования:

Исполнитель – это человек или автомат (в частности, им может быть процессор ЭВМ), умеющий выполнять некоторый, вполне определенный конечный набор действий. Приказ на выполнение действия из указанного набора, вы­раженный каким-либо заранее оговоренным способом, называется предписанием, а вся совокупность допустимых приказов – системой предписаний исполнителя.

Давая задание исполнителю на выполнение некоторой работы, мы обычно выдаем ему не одно предписание, а некоторую конечную последовательность предписаний, задавая также порядок, в котором эти предписания должны быть выполнены. Такая последовательность предписаний с указанием порядка их выполнения называется программой.

Всякое действие производится над некоторыми объек­тами, и о его результатах можно полностью судить по изменению состояния этих объектов. Один из видов объектов – переменная. Понятие переменной является одним из центральных понятий программирования. Поясним это понятие на примере.

Пример. Требуется найти произведение любых двух натуральных чисел п, т. Результат обозначить через к. Составим задание для исполнителя, который не умеет выполнять умножение, а умеет лишь складывать. В этом случае решение задачи не может быть выполнено в одно действие, а требует разложения на ряд последовательных действий, т. е. составления программы.

Так как программа должна «работать» для любой пары натуральных чисел, то сами конкретные числа в программе не фигурируют. Вместо чисел употребляются имена, обоз­начающие изменяемые объекты, которые называются пере­менными. Перед началом вычислений этим переменным должны быть присвоены значения. Присваивание – одно из важнейших действий, выполняемых вычислительной машиной.

Переменную можно представить себе как ящик, обозна­ченный именем, идентифицирующим эту переменную. При­своение переменной с именем n значения 5 можно предста­вить себе так: положить в ящик, обозначенный n, 5 шаров. (Ящик является аналогом ячейки памяти ЭВМ.)

Значение одной переменной можно переслать в другую переменную. При этой операции значение пересылаемой переменной не изменяется. Например, переслать значение n в переменную i, или присвоить переменной i значение n, означает задать i такое же значение, которое имеет перемен­ная n, т. е. скопировать значение n. Если было, допустим, n=5, то присвоение i значения n (записывается i=n) означает, что нужно как бы посмот­реть, какое число находится в ячейке памяти n, и такое же число «положить» в ячейку памяти i. Теперь будет i=5, но при этом n сохранило значение (n=5).

Часто в программировании используется такая операция присваивания, когда слева и справа используется одна и та же переменная, например, i=i+1. Такая запись означает, что сначала должна быть выполнена операция сложения (i+1), а затем полученная сумма присвоена переменной i в качестве ее нового значения. При этом старое значение i пропадает (стирается). После выполнения этой операции i будет иметь значение на 1 больше, чем перед ее выполне­нием.

Вернемся к нашей задаче. Чтобы получить произведе­ние n на m, используя операцию сложения, нужно просум­мировать m слагаемых, равных n, т. е. вычислить

k = n+n+ ...+n    m раз

Но эта формула – не программа, хотя бы потому, что здесь есть неопределенность (например, многоточие).

Решение этой задачи можно представить как последова­тельность выполнения следующих простых шагов: Положить k=0. Далее выполнить операцию k=k+n m раз. При этом после каждого выполнения указанной опе­рации значение к увеличивается на n. В итоге в к будет по­лучен результат решения задачи.

Чтобы выполнить операцию требуемое число раз, нужно считать, сколько раз эта операция уже выполнена. Исполь­зуем для этого вспомогательную переменную i. Назовем ее счетчиком. Перед первым прибавлением к к значения n положим i= 1 и после очередного изменения к значение счет­чика i будем менять на 1.

Тогда программа может быть записана так:

1) задать конкретные значения n, m

2) k=0

3) i=1

4) k=k+n

5) i=i+l

6) если i<=m идти к 4. (Повторить выполнение операций, начиная с п. 4.)

7) закончить вычисления

Пояснения   к   программе.

Программа написана на обычном языке человеческого общения с использованием общепринятой математической символики (это так называемый «естественный» язык).

Операторы 1, 2, 3 задают начальные значения переменных к и i. Оператор 4 при каждом своем выполнении уве­личивает значение к на n. Оператор 5 увеличивает значение счетчика на 1 после того, как выполнено очередное сложение. Оператор 6 проверяет условие i<=m, и если оно выполняется, т. е. не все m сложений еще выполнены, то происходит возврат к оператору 4 и повторное выполнение программы, начиная с оператора 4. Как только в процессе выполнения программы условие i<=m не будет выполнено, процесс вычислений заканчивается. Это произойдет, когда будет i>m, т. е. все нужные сложения выполнены.

Приведенная программа задает порядок действий, ко­торые могут быть выполнены, когда n и m получат конкрет­ные значения.

 

Вопросы для самоконтроля

1. Что такое алгоритмический язык? Особенности алгоритмических языков?

2. Что такое машинный код?

3. Дайте характеристику языкам низкого уровня. Приведите примеры.

4. Дайте характеристику языкам высокого уровня. Приведите примеры.

5. Дайте характеристику языкам сверхвысокого уровня. Приведите примеры.

6. Что такое исходная программа, трансляция программы, трансляторы?

7. Что такое компилятор? Интерпретатор? Ассемблер?

8. Что такое программирование? Назовите этапы разработки программы?

9. Что такое исполнитель, программа;