Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Раздел 3_2.pdf
Скачиваний:
23
Добавлен:
11.02.2016
Размер:
1.22 Mб
Скачать

2. ЯЗЫК ПРОГРАММИРОВАНИЯ ПАСКАЛЬ

2.1. Развитие систем программирования. Алгоритмические языки.

Функционирование любого средства обработки информации, представленной в цифровом виде, базируется на соблюдении трех основных принципов:

принципа программного управления вычислениями;

принципа адресного обращения;

принципа единообразного кодирования любых данных.

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

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

Насколько неудобно программирование в машинных кодах можно убедиться, рассмотрев пример команды, описывающей операцию A+B=C.

Код

011 01101101 10101100

10101101

00001010

команды

 

 

 

 

«сложить»

Адрес А

Адрес B

Адрес C

Адрес команды

Рис. 2.1 Структура команды, отражающей операцию A+B=C

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

Первым шагом в развитии систем автоматизации программирования была разработка группы машинно-ориентированных языков типа «ASSEMBLER». В них сохранилась структура записи машинных команд, но для облегчения программирования, применяется символическая запись команд, при которой адреса и коды операций вначале записывают в общем виде. Если, например, обозначить адреса команд в виде K, K + 1, ...., в качестве символических адресов данных использовать имена этих данных (или сами данные, если это константы), а коды операций представить в форме групп символов, например, со-

28

кращенных названий самих операций, то записанная выше команда может быть представлена в виде:

К СЛ А,В,С

где К — адрес команды; СЛ — код операции сложения;

А, В и С — символические адреса данных.

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

автокодом, или языком Ассемблера.

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

Процедурно-ориентированные языки. Эти языки явились дальнейшим развитием в направлении автоматизации программирования, в результате их разработки появились алгоритмические языки - средства написания программ, практически не зависящих от особенностей используемой для их выполнения ЭВМ.

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

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

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

В отличие от ассемблеров, каждая команда которых, как правило, порождает одну

29

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

ками высокого уровня.

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

Основой любого языка программирования является алфавит. Из символов, входящих в него, составляют слова неделимые объекты программы, используемые для изображения обрабатываемых данных (слова пользователя), а также для управления работой программы (служебные слова). Словарный состав языка и способы составления и записи слов образуют лексику языка.

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

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

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

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

30

граммы разделены во времени, то процесс трансляции называют компиляцией, а соответствующий транслятор — компилятором. Компиляция программ по ряду причин, получила более широкое распространение.

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

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

В состав систем программирования современных ЭВМ входят трансляторы с различных языков программирования, причем для одного и того же языка может быть разработано и может использоваться несколько трансляторов, обладающих различными характеристиками. Рассмотренная технология подготовки программ для ЭВМ принципиально позволяет выполнять одну и ту же программу практически на любой ЭВМ: для этого достаточно, чтобы в системе программирования этой вычислительной машины был соответствующий транслятор. Однако использование разных трансляторов может предъявлять дополнительные требования к языку, ограничивая или расширяя его возможности по отношению к базовой версии. Ограничения на выполнение программы на конкретной вычислительной машине могут быть связаны с объемом оперативной памяти либо с быстродействием этой ЭВМ.

Проблемно-ориентированные языки. При использовании таких языков пользователь не обязан знать методы решения задач на ЭВМ и владеть одним из рассмотренных выше языков программирования, поскольку детальной записи алгоритма задачи не требуется, а необходимо лишь сформулировать задачу и указать исходные данные. Проблем- но-ориентированные языки рассчитаны на узкие области использования и предназначены для решения управленческих, экономических и конструкторских задач. Эта группа языков интенсивно разрабатывается и имеет большую перспективу. Например, при работе в среде пакета AUTOCAD используется подобный язык - ЛИСП.

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

Язык программирования Паскаль (PASCAL).

Язык Паскаль был разработан Никлаусом Виртом в начале 70-х годов как язык обу-

31

чения программированию. В данном пособии рассмотрены основные элементы одной из последних версий языка (Borland PASCAL with objects 7.0 - далее для краткости Паскаль) и их использование для программирования типичных вычислительных ситуаций, рассмотренных ранее в разделе "Алгоритмизация вычислительных процессов".

Программы на Паскале создаются и выполняются в так называемой «интегрированной среде программирования (IDE)», имеющей достаточно широкий набор средств для организации эффективной работы пользователя. Основные средства IDE описаны в разделе 3 данного пособия, а ознакомление с возможностями этой среды и изучение приемов работы с ней осуществляется на практических и лабораторных занятиях.

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

2.2. Основные элементы и конструкции языка

2.2.1. Некоторые основные понятия программирования

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

данные сохраняемая в памяти и обрабатываемая машиной информация (это константы, переменные, массивы и другие структуры, содержащие целые и вещественные числа, символы и строки текста или адреса этих переменных и структур);

выражение – компонент языка, определяющий способ вычисления некоторых значений. Выражения записываются с помощью знаков операций (арифметических действий: сложение, вычитание, умножение, деление и логических действий: равно, не равно, больше, меньше и т.д.) и специальных символов которые связывают простые объекты языка (данные) в сложные. Выражения используются как составная часть операторов;

оператор – средство языка позволяющее описывать действия над данными, они осуществляют присваивание новых значений данным, организуют ввод-вывод, управляют порядком выполнения самих операторов и т.д. С точки зрения программирования, оператор можно представить как законченное по смыслу предложение;

блок операторов представляет собой последовательность операторов, помещенных в операторные скобки, которая в структуре программы может трактоваться как один оператор;

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

программой называется исчерпывающая совокупность операторов, описывающих решение некоторой задачи;

модуль – библиотека процедур и функций, имеющая собственное имя. Модули не могут выполняться самостоятельно;

вводом называют процесс размещения информации в памяти машины (информация поступает в оперативную память машины с клавиатуры, диска или другого внешнего устройства через порт ввода-вывода);

выводом называют процесс копирования программой данных из памяти (информация считывается из оперативной памяти машины и выводится на экран, записывается на маг-

32

нитный диск или на внешнее устройство через порт ввода-вывода).

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

2.2.2. Алфавит, слова, комментарии

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

Алфавит языка состоит из множества основных символов, включающего в себя:

заглавные латинские буквы от А до Z;

строчные латинские буквы от а до z;

символ подчеркивания _, который в языке относят к буквам, чтобы иметь возможность задавать имена объектов, состоящие более чем из одного слова;

арабские цифры от 0 до 9;

шестнадцатеричные цифры от 0 до 9 и от A до F;

специальные символы + - * / = ^ < > ( ) [ ] { } . , : ; ` # $ @;

символ пробела.

Малые и заглавные буквы в языке не различаются (т.е. воспринимаются компилятором как одни и те же символы).

Некоторые комбинации специальных знаков являются едиными символами и обозначают:

знак присваивания := ;

операции отношения <> <= >= ;

разделитель в обозначении диапазона .. (две точки);

скобки комментариев (* *).

Слова. Из символов входящих в алфавит, строятся слова - минимальные конструкции языка, имеющие самостоятельный смысл. Слова именуют все остальные объекты языка и называются еще идентификаторами (именами объектов).

Вкачестве имени в языке может быть использована произвольная последовательность букв, цифр и символа подчеркивания, начинающаяся с буквы.

ВПаскале определены два вида слов - слова пользователя и служебные слова. Слова пользователя, которые именуют данные - объекты обработки программ, на-

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

Примеры:

АLFA_square_person_record – корректный идентификатор;

Birth+Day - не является идентификатором, т.к. содержит специальный символ

(знак +);

Two Numbs - не является идентификатором, т.к. содержит разделитель (пробел). Транслятор воспринимает идентификаторы без учета регистров, поэтому для него

символы (a..z) будут тождественны символам (A..Z), а имена Exam, exam и EXAM идентифицируют один и тот же объект. Это удобно при задании длинных имен, указы-

33

вающих пользователю смысл соответствующих объектов программы. Так, например, идентификатор VeryLongIdentifier более понятен, чем тот же идентификатор, записанный только заглавными буквами VERYLONGIDENTIFIER. Идентификаторы могут иметь произвольную длину, однако транслятор использует (принимает к рассмотрению) только первые 63 символа имени. Необходимо иметь в виду, что имена объектов в тексте программы (идентификаторы данных), назначаемые пользователем, фактически именуют поля памяти, в которых будут размещены соответствующие данные, что позволяет обрабатывать с помощью одной и той же программы различные наборы данных.

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

absolute

external

near

shl

and

far

nil

shr

array

file

not

string

asm

for

object

then

assembler

forward

of

to

begin

function

or

type

case

goto

overlay

unit

const

if

packed

unti1

constructor

in

private

uses

destructor

inline

procedure

var

div

inherited

program

virtual

do

interrupt

public

while

downto

label

record

with

else

library

repeat

xor

end

mod

resident

 

export

name

set

 

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

Ниже приведен список зарезервированных имен языка, смысл некоторых из них будет определен в дальнейшем описании

Addr

ClrEOL

Eoln

Hi

ArcTan

ClrScr

Erase

Input

Assign

Con

Execute

InsLine

Aux

Concat

Exit

Int

AuxInPtr

ConInPtr

Exp

Integer

AuxOutPtr

ConOutPtr

False

Ioresult

BlockRead

ConstPtr

FilePos

Kbd

BlockWrite

Copy

FillChar

KeyPressed

Boolean

Cos

FillSize

Length

BufLen

CrtExit

Flush

Ln

Byte

CrtInit

Frac

Lnsert

Chain

Delay

GetMem

Lo

Char

Delete

GotoXY

LowVideo

Chr

DelLine

Halt

Lst

Close

Eof

HeapPtr

LstOutPtr

 

 

 

 

 

 

34