Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Чаплыгин А.Н. Учимся програмировать вместе с Пи...doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
3 Мб
Скачать
☆

Глава 1. Базовые понятия

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

§1.1. Алгоритмы и программы

Понятие алгоритма является одним их центральных понятий всей компьютерной дисциплины. Слово «алгоритм», в сущности, является синонимом слов «способ» или «рецепт». Можно говорить, в этом смысле, об алгоритме нахождения корней уравнения по его коэффициентам, или об алгоритме разложения натурального числа на простые множители. Если в основе алгоритмов лежат простые вычисления, то такие алгоритмы называют численными. Впрочем, довольно часто рассматриваются и нечисленные алгоритмы. Например, в роли исходных данных и результатов могут выступать последовательности символов: тексты, формулы и т.д. В роли операций - не привычные операции сложения, умножения и подобные им, а операции сцепления строк или операции замены одних символов на другие по некоторой таблице соответствий. Примером может служить кодирование текста азбукой Морзе. Существуют алгоритмы построения сложных графических объектов и их преобразования. Для того, чтобы научить компьютер что-то делать, нужно предварительно составить алгоритм.

Алгоритм - это описанный со всеми подробностями способ получения результатов, удовлетворяющих поставленным условиям, по исходным данным.

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

§1.2. Языки программирования и уровни абстракции

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

Прочесть и разобраться, как работает программа, написанная в двоичных кодах, было очень сложно, не говоря уже о том, чтобы найти и исправить в ней ошибку. Поэтому для упрощения своей работы программисты придумали мнемокоды (от греч. Mnemonikos <— mnemon - запомнить) или мнемоники - буквенные обозначения машинных двоичных команд, которые проще запомнить, чем последовательности нулей и единиц. Для упрощения работы с ячейками памяти стали использовать понятие переменной.

Переменная - в программировании это буквенное обозначение области памяти, в которой хранится некоторое значение.

14

Ревизия: 170

Базовые понятия

Для перевода мнемокодов в машинные инструкции и имен переменных в адреса ячеек памяти использовалась специальная программа - транслятор. Языки мнемо-кодов получили название ассемблеров.

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

  • Ввод данных с клавиатуры, из файла или с какого-либо устройства;

  • Вывод данных на экран, в файл, на принтер или другое устройство;

  • Выполнение некоторых операций над числами, строками или другими объектами;

  • Выбор ветви выполнения программы на основе принятого решения (например, по результатам сравнения двух значений);

  • Повторение группы операций чаще всего с изменением одного или нескольких параметров.

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

Проиллюстрируем это двумя простыми примерами. Первая программа, имитирует низкоуровневый язык, а вторая - высокоуровневый:

1.Занести в регистр edx адрес первого числа

Занести в регистр-счетчик 10

Занести в регистр еах 0

Метка 1р:

Сравнить значение регистра еах со значением, хранящимся по адресу

взятому из регистра edx

Если оно меньше или равно, то перейти к метке l_next

Занести в регистр еах значение из ячейки, адрес которой хранится

в edx

Метка l_next:

Прибавить к значению регистра edx 4

Если в регистре-счетчике не 0, то уменьшить значение в регистре-счетчике на 1 и перейти к метке 1р

Записать в переменную Мах значение из регистра еах 2.Занести в переменную Мах 0

Повторять пока переменная i изменяется от 1 до 10 с шагом +1:

Если i-e число больше Мах, то занести его в переменную Мах

Вывести значение переменной Мах.

15

Ревизия: 170

Базовые понятия

Обе программы находят максимальное из десяти заданных натуральных чисел. Названия операций изменены на русскоязычные аналоги (такой способ записи иногда называют псевдокодом), но смысл действий сохранен, так что понять их различие несложно.

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

Обратите внимание на то, что в первой программе результат не выводится. Способ вывода в низкоуровневой программе будет разным в зависимости от платформы, на которой будет выполняться данная программа. Более того, на процессоре Intel 80286 эта программа работать тоже не сможет, т.к. регистры edx и еах появились только в Intel 80386.

Классическими структурными языками являются С1 и Pascal. Они позволяют описывать вычислительные процессы на более высоком уровне абстракции, чем ассемблеры, но, тем не менее, им присущ ряд недостатков. В частности, программисту, пишущему на этих языках, все же приходится явно указывать тип переменных, с которыми будут работать его программы, для того, чтобы транслятор знал, сколько памяти выделять под их хранение. Кроме того, в переменных предназначенных для хранения целых чисел невозможно сохранить, например, строку.

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