Как выполняется программа на компьютере
Компьютерная программа — это последовательность инструкций, которые компьютер (вычислительная машина) будет исполнять. Иногда под программой понимают исходный код этой программы. Когда пользователь компьютера «запускает программу», он создаёт т.н. процесс, который соответствует этой программе. Процесс — выполнение инструкций программы. Кроме того, каждый процесс может иметь один или несколько потоков выполнения (англ. thread). Этот курс не подразумевает использования нескольких потоков, поэтому понятие процесс и поток будут взаимозаменяемыми.
Логично, что процесс должен начинать выполнение с какой-либо команды. Место программы, откуда начинается выполнение программы, называется точкой входа в программу. В C++ точка входа в программу может быть только одна и записывается в следующем виде:
Фигурные скобки, <>, в С++ используются для группировки. В данном случае они указывают на начало и конец функции main, которая обязательно должна присутствовать
в программе, и с которой начинается работа программы. Точка с запятой (;) ставится после каждого оператора языка, например, после оператора «return», возвращающего значение 0 и, таким образом, завершающий программу. Целое значение, с которым завершается программа, называется кодом ошибки. Если код ошибки — 0, то такая программа завершилась успешно.
Разберём следующий код:
Внутри блока объявляются 3 переменные: addOne, addTwo и sum. Так как объявление переменной sum стоит после оператора return, то программа завершится ещё до того, как сможет узнать про существование переменной sum. Таким образом, sum не будет ни создана, ни инициализирована.
Операторы ветвления (выбора)
Часто необходимо выполнить (или не выполнить) последовательность команд в зависимости от осуществления какого-либо условия. К примеру, модуль любого числа равен самому числу, если оно не меньше 0, и самому числу, взятому с обратным знаком, в противном случае:
Перепишем это условие на языке C++
Ветвь else является необязательной. В этом случае оператор if ограничивает блок кода, который может быть выполнен только при наступлении определённого условия. Операторы if могут быть вложенными. Это позволяет использовать 2 и более ограничений. Листинг 4 реализует вычисление результата для следующей функции:
В этом примере во внешнем блоке if (value >= 1) в части else располагается внутренний блок if (value . Внешний блок выбирает все значения не меньшие 1, тогда как внутренний делит оставшееся множество (т.е. все значения меньшие 1) на два: на множество значений, меньшие –1 и множество не меньшее –1 и меньшее 1.
На заметку
В языке программирования Python комбинация else if была заменена на сокращённый вариант elif. Также в Python отказались от оператора выбора switch, т.к. с помощью оператора if-elif-else легко реализуется его функциональность.
Кроме оператора if существует оператор выбора switch:
В круглых скобках после switch записывается любая переменная целого типа (или типа, который может быть представлен, как целочисленный). В фигурных скобках перечисляются значения, с которыми будет происходит сравнение переменной. Выполнение начнётся с той ветви, в которой произошло совпадение (в примере это ‘–’). Оператор break устанавливается для того, чтобы поток программы закончил выполнение ветвей и продолжил работу за закрывающейся фигурной скобкой. Поэтому в приведённом примере забытый оператор break приведёт к ошибке, т.к. после того, как будет вычислена разность поток программы перейдёт на следующую ветвь и выполнит умножение.
Необязательная ветвь default выполнится в том случае, если значение переменной не совпала не с одним из перечисленных в case-ветвях.
На заметку
Часто программисты используют перечисления для использования с оператором switch. Это достаточно правильное и умное использование оператора switch. Более того, достаточно умные компиляторы способны во время компиляции проверить, все ли значения перечисления были учтены, и сообщить об этом программисту.
Циклы
Циклы позволяют выполнять один и тот же блок кода, пока выполняется определённое условие. В языке C++ существует 3 цикла: while, for и do-while. Первые два являются циклами с предусловием, последний — с постусловием. Когда некоторое логическое условие цикла истинно, то начинает выполняться тело цикла. Программисту необходимо следить, чтобы цикл мог когда-нибудь закончиться, т.е. рано или поздно
логическое условие должно стать ложным, иначе программа «зациклится».
Цикл while трактуется так: «пока логическое условие верно, выполнять блок кода». В коде синтаксически записывается следующим образом:
Если символ справа логического неравенства есть в искомой строке найден, то выполнение цикла прекратиться и переменная pos будет иметь значение позиции, в которой находится этот символ. Если же такого символа не будет вовсе, тогда программа завершится с ошибкой.
Синтаксис оператора цикла for следующий:
Оператор цикла for в данном случае имеет следующее значение: «присвоить переменной i значение 0; пока i меньше 3-х копировать i-й элемент массива и увеличить i на 1». Все три части оператора (присвоение переменной значения, проверка логического условия и изменение переменной) могут быть опущены по желанию программиста, т.е. заменены на пустой оператор.
Запись for (int i = 0; i и
Условие цикла do-while проверяется после того, как блок кода будет выполнен, другими словами, определённый кусок кода будет выполнен хотя бы один раз, тогда как в циклах с предусловием он может не выполниться вовсе. Синтаксически цикл записывается так:
Отметим, что при приведённой записи код будет выполняться бесконечно, так как логическое условие состоит только из значения true. Чтобы выйти из цикла можно внутри блока воспользоваться уже знакомым оператором break, позволяющий прервать выполнение цикла с любого места. Кроме оператора break существует оператор continue, который завершает текущую итерацию и переходит к выполнению следующей итерации
цикла.
Область видимости переменной
Объявление переменной вводит имя в область видимости (scope); это значит, что имя можно использовать лишь в ограниченной части программы. Для имени, объявленного в конкретном блоке кода (его называют локальным), область видимости простирается от точки объявления до конца содержащего это объявление блока.
Переменная называется глобальной, если она объявлена вне функции main и других блоков кода. Чтобы отличить глобальную переменную от локальной можно использовать два двоеточия перед её именем. Лучше вовсе избегать использования глобальных переменных во избежания перекрытия имён и случайного изменения в коде значения глобальной переменной, вместо локальной.
Любая обработка информации на компьютере осуществляется по программе. Выполнением программы занимается процессор (см. “Процессор”), при этом сама программа хранится, как правило, в ОЗУ (см. “Память оперативная”) и считывается оттуда в процессор по мере необходимости. Вопрос о том, каким образом программа попадает в оперативную память, рассматривается отдельно в статье “Загрузка ПО”.
Каждая программа состоит из отдельных двоичных команд (см. “Машинная команда”), так что выполнение программы есть не что иное, как поочередное выполнение этих команд. Рассмотрим последовательность действий ЭВМ при выполнении каждой из команд программы.
Важной составной частью любой фоннеймановской машины является счетчик адреса команд. Этот специальный внутренний регистр в устройстве управления процессора постоянно указывает на ячейку памяти, в которой хранится следующая команда программы.
Пусть в рассматриваемый момент времени текущее значение счетчика команд уже определено. Тогда дальнейшие действия процессора определяются следующим алгоритмом.
1. Согласно содержимому счетчика адреса команд считывается очередная команда программы. Ее код обычно заносится на хранение в специальный регистр УУ, который носит название регистра команд.
2. Счетчик команд автоматически изменяется так, чтобы в нем содержался адрес следующей команды. В простейшем случае для этой цели достаточно к текущему значению счетчика прибавить некоторую константу, определяющуюся длиной команды.
3. Считанная в регистр команд операция расшифровывается, извлекаются необходимые данные, выполняются требуемые действия и, если это предусмотрено операцией, производится запись результата в ОЗУ.
Далее все действия повторяются заново. Поскольку на втором этапе счетчик адреса команд был изменен, то в ходе нового цикла будет выполняться другая команда.
Рассмотренный основной алгоритм работы ЭВМ (его также часто называют программным принципом работы ЭВМ) позволяет шаг за шагом выполнить хранящуюся в ОЗУ линейную программу. Если же требуется изменить порядок вычислений для реализации развилки или цикла, достаточно на этапе 3 в счетчик команд занести новый адрес (именно так происходит условный или безусловный переход).
Как отчетливо видно из приведенной выше блок-схемы, основной алгоритм не является “самостартующим”: ему требуется определить первоначальное содержимое счетчика, т.е. фактически адрес самой первой команды. В старых машинах это делал оператор ЭВМ. В современных компьютерах при включении питания или при нажатии на кнопку сброса (reset) в счетчик аппаратно заносится стартовый адрес находящейся в ПЗУ программы инициализации всех устройств и начальной загрузки ЭВМ (см. “Загрузка ПО”).
В любом случае, как только первоначальный адрес задан, все дальнейшие действия процессора предопределены выполняемой программой. Мы видим теперь, что вся деятельность ЭВМ есть непрерывное выполнение тех или иных программ, причем программы эти могут, в свою очередь, загружать новые программы и т.д.
В современных компьютерах для ускорения основного цикла выполнения команды используется метод конвейеризации, позволяющий реализовать перечисленные выше этапы алгоритма параллельно. Используются также и другие способы, которые направлены на ускорения выполнения команд программы.
Уместно подчеркнуть, что программный способ управления компьютером делает его необычайно гибким и позволяет на одном и том же оборудовании решать самые разнообразные задачи (включая даже такие, которые в момент изготовления машины еще не были известны!).
Методические рекомендации
Курс информатики основной школы
Школьникам следует дать представление об ЭВМ как об автомате, выполняющем программу в соответствии с относительно несложным алгоритмом. Авторы самого первого школьного учебника информатики 10 подчеркивали методическую важность этого понятия. “Основной алгоритм работы процессора является важнейшим материалом данного параграфа. Следуя командам этого алгоритма, процессор осуществляет автоматическое исполнение программы, находящейся в памяти ЭВМ. В принципе этот алгоритм чрезвычайно прост. Но его общеобразовательное значение очень велико: разобравшись в основном алгоритме процессора, учащиеся узнают, как происходит автоматическое исполнение программы, хранящейся в памяти компьютера, т.е. как осуществляет ЭВМ автоматическую обработку информации. Учитель должен добиваться от школьников понимания сути предлагаемого материала, а не его механического выучивания”.
Очень важно обратить внимание учеников на следующее обстоятельство: если посмотреть на основной алгоритм без учета деталей исполнения команды, то становится очевидным, что он годится практически для любого исполнителя, скажем, Кенгуренка. Так что ЭВМ — это самый настоящий исполнитель алгоритмов. Особенность данного исполнителя заключается в том, что команды, которые ЭВМ способна выполнять, являются максимально универсальными, в то время как Кенгуренок и остальные учебные исполнители способны работать только с узкоспециализированными командами. Важно понимать, что на базе относительно небольшого набора универсальных команд компьютера может быть смоделирован любой специализированный исполнитель: этим мы постоянно пользуемся на практике, когда работаем с программной поддержкой учебных исполнителей. Таким образом, компьютер — это универсальный исполнитель алгоритмов.
Курс информатики в старших классах
Стандарт не содержит прямого указания на необходимость повторения и углубления материала о программном принципе работы ЭВМ. Тем не менее, учитывая его важность, можно рекомендовать это сделать в рамках изучения темы “Аппаратное и программное обеспечение компьютера” (см. “Аппаратное и программное обеспечение”). Поскольку речь в ней обязательно пойдет о соотношении компонентов hard и soft, повторение принципов аппаратной основы выполнения программы видится вполне уместным. Более того, на новом уровне можно провести дискуссию о том, как в рамках основного алгоритма можно реализовать не только линейные задачи, но также разветвляющиеся или циклические. При наличии достаточного времени можно обсудить систему команд компьютера (см. “Машинная команда”).
Интересным мировоззренческим вопросом является исполнение команды “Останов”. Стоит объяснить ученикам, что в самых первых ЭВМ такая команда действительно завершала вычисления, после чего машина прекращала работу и ждала действий человека-оператора. Но позднее, когда задачи в машинах стали выполняться под руководством управляющих программ, окончание очередной задачи приводило к передаче управления программам-администраторам более высокого уровня; первоначально их называли мониторами, или супервизорами, сейчас этим занимается хорошо известная любому грамотному пользователю операционная система (см. “Операционная система”).
10 Изучение основ информатики и вычислительной техники: Методическое пособие для учителей и преподавателей средних учебных заведений. В 2 ч. Ч. 2 / А.П. Ершов, В.М. Монахов, М.В. Витиньш и др. М.: Просвещение, 1986, 207 с. (см. § 2 “Основной алгоритм работы процессора”).
Процессор компьютера непосредственно служит для восприятия языка машинных команд. Поэтому можно сказать, что компьютер - исполнитель алгоритмов, переведенных на машинный язык. Компьютерная программа — последовательность инструкций, предназначенная для исполнения устройством управления вычислительной машины. Чаще всего образ программы хранится в виде исполняемого модуля (отдельного файла или группы файлов). Процесс создания компьютерных программ носит название программирование, а людей, занимающихся этим видом деятельности, называют программистами.
Выполнение программ на компьютере
Программирование на языке машинных команд - дело сложное, объясняется высокой трудоемкостью программирования непосредственно в машинных кодах. Программист должен знать числовые коды всех машинных команд и сам распределять память под команды программы и данные.
Первым значительным шагом представляется переход к языку Ассемблера. Программисту не надо было больше вникать в хитроумные способы кодирования команд на аппаратном уровне. Числовые коды операций заменились мнемоническими (словесными) обозначениями. Однако разные компьютеры с различными типами компьютеров требуют свой язык Ассемблера. Поэтому его называют машинно-зависимым или языком низкого уровня. Следует отметить, что простейшая операция взятия логарифма на языке Ассемблера составляет несколько сотен строк кода, в то время как на языке высокого уровня - всего одну строчку.
На смену языкам Ассемблера были разработаны языки программирования высокого уровня (ЯПВУ). Они машинно-независимы.
Язык высокого уровня - язык программирования, средства которого обеспечивают описание задачи в наглядном, легко воспринимаемом виде, удобном для программиста. Он не зависит от внутренних машинных кодов ЭВМ любого типа, поэтому программы, написанные на языках высокого уровня, требуют перевода в машинные коды программами транслятора.
Трансляция программы — преобразование программы, представленной на одном из языков программирования, в программу на другом языке и, в определённом смысле, равносильную первой.
Язык, на котором представлена входная программа, называется исходным языком, а сама программа — исходным кодом (модулем). Выходной язык называется целевым языком или объектным кодом (модулем).
Трансляторы делятся на компиляторы и интерпретаторы.
Если цель трансляции - преобразование всего исходного текста программы на внутренний язык компьютера (т.е. получение некоторого нового кода), то такая трансляция называется также компиляцией.
При компиляции в память компьютера загружается программа-компилятор. Она воспринимает текст программы, написанной на языке высокого уровня, как исходную информацию, которая называется исходным модулем. После обработки исходный модуль, написанный на алгоритмическом языке, преобразуется в программу, состоящую из машинных команд. Это объектный модуль.
На следующем этапе компиляции выполняется специальная программа - редактор связей. Она подсоединяет к объектному модулю необходимые для его работы программные модули: все функции, процедуры, на которые он ссылается. Они выбираются из библиотеки подпрограмм соответствующей системы программирования и вставляются в объектный модуль. Этот процесс называется компоновкой(линкованием), и как его результат создается исполняемая программа. Ее также называют загрузочным модулем. Программа имеет расширение "ехе", загружается в память и выполняется.
Итак, при компиляции исполнение программы включает в себя три этапа: компиляция, компоновка и выполнение. Загрузочную программу можно записать на жесткий диск компьютера и использовать многократно для решения задачи, при этом трансляция программы уже не требуется.
Интерпретаторанализирует и тут же выполняет (собственно интерпретация) программу покомандно (или построчно), по мере поступления её исходного кода на вход интерпретатора. Интерпретатор в последовательности выполнения алгоритма считывает очередной оператор программы, переводит его в команды и тут же выполняет эти команды, после чего переходит к переводу и выполнению следующего оператора. При этом результаты предыдущих переводов в оперативной памяти не сохраняются, т.е. при повторном выполнении одной и той же команды она снова будет транслировать.
При интерпретации, поскольку трансляция и выполнение совмещены, обработка программы на компьютере проходит в один этап. Однако откомпилированная программа выполняется быстрее, чем интерпретируемая.
Интерпретаторы возможностью создания загрузочных программ не обладают. В режиме интерпретации удобно отлаживать программу, а рабочие расчеты лучше осуществлять в режиме компиляции.
Для того чтобы программа могла быть выполненной, она должна быть помещена в оперативную память компьютера. Туда же должны быть помещены и исходные данные. Как правило, программа вводится в оперативную память с жесткого диска. Исходные данные вводятся с клавиатуры либо также с жесткого диска, куда они должны быть заранее помещены с помощью другой программы. Результаты своей работы программа помещает в определенную область оперативной памяти, откуда они могут быть выведены на какое-либо внешнее устройство, которым может быть жесткий диск, экран дисплея, печатающее устройство (рис.16).
Рис. 16. Распределение памяти при выполнении программы.
Процесс выполнения программы на ЭВМ разбивается на ряд этапов (рис. 17).
Рис.17. Процесс выполнения программы на ЭВМ.
Программа пишется программистом на одном из языков программирования. Процессор ЭВМ может реально выполнять только команды машинного языка. Преобразование исходного текста программы в машинные коды выполняется специальной программой – транслятором. Рассмотренный выше ассемблер является одной из разновидностей транслятора.
Трансляторы бывают двух видов: компиляторы и интерпретаторы.
Компилятор преобразует исходную программу на любом языке высокого уровня в некоторую стандартную форму на машинном языке, называемую объектным модулем.
Интерпретатор преобразует отдельные предложения исходного языка в машинный код и немедленно их исполняет. Интерпретатор не создает объектный модуль.
Преобразование текста на исходном языке, выполняемое транслятором, называется трансляцией. В процессе трансляции проверяется синтаксическая правильность предложений исходной программы и генерируется список обнаруженных ошибок. Объектный модуль формируется лишь при отсутствии синтаксических ошибок.
Некоторые части программы программист не пишет, а ссылается на них из своей программы, например, на программы управления вводом-выводом и пр. Они хранятся на внешнем запоминающем устройстве в библиотеке объектных модулей. Объектный модуль, сформированный компилятором, не может быть выполнен без объединения с этими модулями.
Все объектные модули генерируются в некотором стандартном виде. Поэтому различные части программы можно писать и транслировать независимо, помещая получаемые объектные модули в библиотеку объектных модулей. Это позволит разделить работу по написанию большой программы между несколькими программистами, каждый из которых может писать и отлаживать свою часть программы независимо. Даже если программист пишет программу самостоятельно, имеет смысл разбивать ее на ряд независимых частей, что позволяет вносить изменения в каждую из них, не затрагивая остальных частей.
Компилятор не может указать конкретный адрес оперативной памяти, начиная с которого будет располагаться формируемый объектный модуль, поскольку:
- размер получаемого объектного модуля не может быть заранее известен, поэтому существует опасность наложения в памяти различных модулей или появления неиспользуемых участков памяти;
- к моменту исполнения программы неизвестно, какие еще программы будут находиться в оперативной памяти.
Для решения этой проблемы транслятор формирует так называемые перемещаемые объектные модули. Начальный адрес перемещаемого объектного модуля в оперативной памяти компьютера определяется непосредственно при загрузке программы.
Программа, которая связывает независимо оттранслированные объектные модули в единую программу, называется редактором связей. Редактор связей имеет на входе объектные модули и генерирует на выходе загрузочный модуль, помещаемый на внешнее запоминающее устройство. Загрузочный модуль помещается в оперативную память специальной программой, называемой загрузчиком. Загрузчик определяет адрес загрузки программы в оперативную память исходя из сложившейся ситуации, помещает ее в оперативную память и передает управление на ее первую команду. Одна и та же программа при различных запусках может располагаться в различных местах оперативной памяти.
Программа состоит из набора команд, которые выполняются процессором автоматически друг за другом в определенной последовательности.
Выборка программы из памяти осуществляется с помощью счетчика команд. Этот регистр процессора последовательно увеличивает хранимый в нем адрес очередной команды на длину команды.
А так как команды программы расположены в памяти друг за другом, то тем самым организуется выборка цепочки команд из последовательно расположенных ячеек памяти.
Если же нужно после выполнения команды перейти не к следующей, а к какой-то другой, используются команды условного или безусловного переходов, которые заносят в счетчик команд номер ячейки памяти, содержащей следующую команду. Выборка команд из памяти прекращается после достижения и выполнения команды “стоп”.
Таким образом, процессор исполняет программу автоматически, без вмешательства человека.
Классификация ПО.
Программы, работающие на компьютере, можно разделить на три категории:
- прикладные программы, непосредственно обеспечивающие выполнение необходимых пользователям работ: редактирование текстов, рисование картинок, обработка информационных массивов и т. д.;
- системные программы, выполняющие различные вспомогательные функции, например создание копии используемой информации, выдачу справочной информации окомпьютера, проверку работоспособности устройств компьютера и т. д.;
- Вспомогательное ПО (инструментальные системы и утилиты).
Понятно, что грани между указанными тремя классами программ весьма условны, например, в состав программы системного характера может входить редактор текстов, т. е. программа прикладного характера.
Прикладное ПО. Для IBMPC разработаны и используются сотни тысяч различных прикладных программ для различных применений. Наиболее широко применяются программы:
подготовки текстов (документов) на компьютере – редакторы текстов;
подготовки документов типографского качества – издательские системы;
обработки табличных данных – табличные процессоры;
обработки массивов информации – системы управления базами данных.
Прикладная программа – это любая конкретная программа, способствующая решению какой-либо задачи в пределах данной проблемной области.
Например, там, где на компьютер возложена задача контроля за финансовой деятельностью какой-либо фирмы, прикладной будет программа подготовки платежных ведомостей.
Прикладные программы могут носить и общий характер, например, обеспечивать составление и печатание документов и т.п.
Прикладные программы могут использоваться либо автономно, то есть решать поставленную задачу без помощи других программ, либо в составе программных комплексов или пакетов.
Системы обработки текстов. Текстовый редактор: назначение, основные возможности.
Для обработки текстовой информации используется приложения общего назначения - текстовые редакторы. Эти программы позволяют создавать, редактировать, форматировать, сохранять и распечатывать документы. Текстовые редакторы делятся в зависимости от своих функциональных возможностей.
Более совершенные текстовые редакторы - текстовые процессоры (например, "Word") позволяют управлять не только содержанием, но и оформлением текста. Эти приложения имеют широкий спектр возможностей по созданию документов (вставка списков и таблиц, средства проверки орфографии, сохранение исправлений и др.).
Наиболее мощными возможностями обладают настольные издательские системы. Эти программы предназначены для допечатной подготовки полиграфических изданий. К этой категории относятся такие программы, как AdobePageMaker, QuarkXPress, AdobeInDesign. В отличие от текстовых процессоров, настольные издательские системы соблюдают полиграфические требования и стандарты. Они также обладают расширенными возможностями сложного оформления комбинированных документов.
Для подготовки к публикации в Интернете Web-страниц и Web-сайтов используются Web-редакторы (например, MacromediaHomeSite).
Читайте также: