Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
68
Добавлен:
04.01.2020
Размер:
4.22 Mб
Скачать
  1. Язык высокого уровня chill

Работа над языком высокого уровня МККТТ CHILL (CCITT High Level Language) была начата в 1975 году. К концу 1979 года были подготовлены предложения по языку. Язык программирования высокого уровня МККТТ CHILL разработан по рекомендации МККТТ как средство для создания ПО СКПУ. При разработке языка CHILL использовался опыт, приобретенный при создании и использовании таких языков программирования высокого уровня, как Паскаль, Алгол, PL/1.

Полное формальное определение языка CHILL было принято МККТТ в ноябре 1980 года и получило статус Рекомендации МККТТ Z.200.

Язык CHILL рассчитан на следующий круг применений: обработка вызовов; тестирование оборудования и сопровождение программ; операционные системы; поддержка диалогового и пакетного режимов; реализация языка "человек-машина".

При создании CHILL принималось во внимание, что ПО АТС является очень сложным, поэтому язык CHILL должен повышать надежность ПО; способствовать генерации высокоэффективного объектного кода; быть гибким и мощным; поддерживать модульное и структурированное программирование; быть простым в изучении и использовании.

Язык CHILL, записанный в Z.200 или в стандарте CHILL, является машинно-независимым, но допускает включение некоторых средств, зависящих от реализации.

Программа, написанная на языке CHILL, должна содержать три обязательных компонента: описание объектов данных; описание действий, которые должны выполняться над объектами данных; описание структуры программы.

Описание объектов данных, являющихся информационными единицами программы, производится с помощью операторов описания и операторов определения.

Описание действий производится с помощью операторов действий, задающих как конкретные операции, выполняемые над объектами данных, так и порядок выполнения этих операций.

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

Наряду с другими в CHILL определена программная структура PROCESS, которая используется как средство описания параллельных действий во времени. Включение в состав языка программной структуры PROCESS и определяет CHILL как язык реального времени.

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

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

В CHILL определены три стандартных простых дискретных типа значений:

  • INT – тип целых чисел,

  • BOOL – тип логических значений и - CHAR – тип символьных значений.

Значения типа INT (сокращение от INTEGER) являются целыми положительными или отрицательными числами. Диапазон возможных значений зависит от разрядности ЭВМ, например, для 16-разрядной ЭВМ диапазон значений от 32768 до – 32767. Значения типа INT могут быть представлены литералами в различных системах счисления. Например, положительный литерал типа INT в любой системе счисления представляется произвольной последовательностью цифр разрядов, определенных для данной системы счисления. Цифры в последовательности могут разделяться символом подчеркивания «–» для улучшения восприятия записи литерала (пробел использовать нельзя), например, 1_000_000.

Примеры целочисленных литералов в различных системах счисления:

D'351 или 351 – десятичная (Decimal);

В'1100_1011 двоичная (Binary);

О'7245 – восьмеричная (Octal);

H'3A9F – шестнадцатеричная (Hexadecimal).

Для обозначения системы счисления перед числом помещается первая буква латинского слова, определяющего основами системы счисления, отделяемая от литерала апострофом. Если буква отсутствует, то подразумевается десятичный литерал. Закрывающий апостроф ставить не обязательно.

Булевские величины могут принимать только два логических значения: TRUE (истина) или FALSE (ложь). Тип логических значений определяется словом BOOL (сокращение от BOOLEAN).

Булевские значения получаются, например, в результате выполнения операций отношения над целочисленными значениями. В качестве примера рассмотрим конкретное отношение: 5 > 7. В общем случае в процессе выполнения операции отношения «>» производится проверка условия: значение слева от «>» больше значения, расположенного справа?

Результатом будет TRUE, если отношение выполняется, и FALSE, если отношение не выполняется. Для приведенного примера результатом является FALSE.

Значениями символьного типа, который обозначается словом CHAR (сокращенное от CHARACTER), являются элементы конечного и упорядоченного множества символов из алфавита № 5 МККТТ.

В соответствии с диаграммой множество символов включает:

  1. Упорядоченные в алфавитном порядке все прописные латинские буквы от А до Z.

  2. Десятичные цифры от 0 до 9.

  3. Спецсимволы алфавита.

  4. Символ пробела (SP) и символ перевода строки.

Символьный литерал обозначается символом, заключенным в апострофы. Например, ‘7’, ‘В’, ‘F’, ‘=’, ‘+’.

Необходимо обратить внимание на упорядоченность символьных элементов, которая проявляется в том, что каждому символьному элементу ставится в соответствие номер этого элемента в числовом ряду. Следствием упорядоченности множества символов является то, что к ним применимы операции отношения, например ‘A’>’F’. Результат проверки данного условия будет FALSE, поскольку в упорядоченном множестве букв латинского алфавита номер, соответствующий букве F, больше номера, соответствующего букве А.

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

Любое имя должно начинаться с буквы, за которой может следовать любая последовательность букв, цифр или символов подчеркивания «_». В состав имени нельзя включать пробел. С целью облегчения чтения программы имя должно нести смысловую нагрузку по отношению к именованному объекту.

В качестве имен нельзя использовать ключевые слова языка CHILL, к которым, например, относятся слова: ARRAY (массив), STRACT (структура), MODULE (модуль), REGION (зона), GOTO (перейти к), IF (если), DO (выполнить), BEGIN (начало), END (конец), WHILE (пока) и т.д. Ключевые слова составляют лексику языка CHILL. Программист не может использовать эти слова, ни в каком другом смысле, кроме того, который указан в определении языка CHILL.

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

Программу на языке CHILL можно рассматривать как последовательность инструкций, которая выполняется ЭВМ. Эти инструкции записываются на основе синтаксиса языка CHILL.

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

Комментарий – это произвольная запись, которая вводится самим программистом при написании программы с целью сделать программу более удобочитаемой. Комментарий помещается внутрь символов «/*» и «*/», например, /* КОММЕНТАРИЙ*/. Комментарий можно помещать между любыми двумя лексическими единицами в любом месте программы. Он может занимать несколько строчек (для этого используется перевод строки) и содержать произвольное число пробелов. При трансляции программы комментарий игнорируется.

Данные, на которые распространяется действие программы, разделяются по типам. Существует три простейших стандартных типа INT, BOOL, CHAR. Любой тип данных определяет множество значений, которые может принимать некоторая переменная. Под понятием «переменная» подразумевается некоторая область памяти, в которой может запоминаться значение. Таким образом, объект данных может проявляться в программе либо как значение (литерал), либо как область памяти (переменная), в которую помещено значение.

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

Из вышесказанного следует, что все области памяти в программе должны быть предварительно описаны. Описание областей памяти закрепляет за ними конкретные имена и типы. В простейшем виде описание состоит из слова DCL (сокращение от DECLARE), за которым следует одно или более новых имен областей памяти, разделенных запятыми, а затем указывается тип вводимых областей. Описание завершается символом «;».

Например,

  1. DCL I, НОМЕР INT;

  2. DCL ВЫЗОВ BOOL;

  3. DCL ЗНАК CHAR;

В строке 1 описаны две области памяти I и НОМЕР целочисленного типа. В строках 2 и 3 описаны булевская область памяти ВЫЗОВ и область памяти ЗНАК символьного типа.

Оператор присваивания является наиболее используемым при написании программ. С помощью этого оператора вновь вычисленное значение запоминается в области памяти. Знаком операции присваивания является «:=». Присваивание является двухместной операцией.

Слева от знака «: = » располагается область памяти, представленная именем, справа – значение, которое должно быть ей присвоено. В общем случае присваиваемое значение может быть задано выражением, вычисляющим значение требуемого типа. Действие оператора присваивания заканчивается знаком «;».

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

  1. X:=10; /* ОБЛАСТИ ПАМЯТИ X ПРИСВАИВАЕТСЯ

КОНКРЕТНЫЙ ЛИТЕРАЛ */

  1. Y:=X; /* ОБЛАСТИ ПАМЯТИ Y ПРИСВАИВАЕТСЯ

ЗНАЧЕНИЕ, ХРАНЯЩЕЕСЯ В X */

  1. J:=J+1;

  2. НОМ:= ВВОД_НОМ ( );

Смысл операций в строках 1 и 2 раскрыт в комментариях. В строке 3 области памяти J присваивается значение, которое является результатом вычисления арифметического выражения. Конкретно в строке 3 к содержимому области памяти с именем J прибавляется единица. В дальнейшей программе именно это новое значение будет фигурировать под именем J. В строке 4 области памяти НОМ присваивается значение, полученное в результате выполнения процедуры ВВОД_НОМ ( ). Здесь и в ряде примеров, приводимых ниже, используются значения, полученные в результате выполнения процедур. Значения могут быть получены с помощью процедур.

При использовании оператора присваивания необходимо помнить, что тип, заданный оператором описания для области памяти слева от «: =», должен совпадать с типом присваиваемого значения.

В CHILL предусмотрена возможность производить присваивания начальных значений областям памяти одновременно с их описанием.

Например:

  1. DСL НОМ_ЛИН INT : = 0;

  2. DСL X,Y,Z BOOL: = TRUE;

В строке 5 области памяти, описываемой именем НОМ_ЛИН имеющей тип INT, присвоено нулевое начальное значение. В строке 6 каждой из областей памяти X, Y, Z булевского типа присвоено начальное значение TRUE.

Совмещение описания областей памяти с одновременной инициализацией используется также для создания специфической области памяти, из которой допускается только считывание значений. Попытка записи в нее блокируется, при этом выдается сообщение об ошибке. Создание области памяти с режимом «только для чтения» обеспечивается словом READ, которое следует поместить непосредственно перед указанием типа.

Например, DCL ЧИСЛО_ЛИНИЙ READ INT : = 100 000;

Описанную таким образом область памяти, предназначенную только для чтения, рекомендуется использовать в тех случаях, когда вычисленное один раз значение заданного типа, запоминаемое в области памяти, не должно меняться. Режим «только для чтения» может быть реализован не только для трех рассмотренных простейших типов INT, BOOL, CHAR, но и для других, определяемых в CHILL типов.

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

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

В CHILL предусмотрены следующие стандартные операции: арифметические операции; операции отношения; булевские (или логические) операции;

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

Из приведенного следует, что наивысшим приоритетом из числа приведенных обладают одноместные операции арифметического и логического отрицания (– (минус) и NOT), но еще более высоким приоритетом обладает скобочная конструкция, поэтому во всех сомнительных случаях или для того, чтобы нарушить правила приоритета, следует использовать скобки, пример I* (X + J), операция «+» заключена в скобки, позволяет выполнить сложение X и J раньше, чем операцию умножения, имеющую более высокий приоритет.

В CHILL также определены следующие стандартные функции (встроенные подпрограммы); ABC (X) – вычисляет абсолютное значение; PRED (X) – результатом является предшествующее X значение упорядоченного ряда, если оно существует, например результатом PRED (С) с учетом строки 4 является значение 'Е'; SUCC (X) – результатом является следующее за X значение упорядоченного ряда, если оно существует, например результатом SUCC (С) является значение 'G'; NUM (X) – результатом является порядковый номер (X) в упорядоченном ряде.

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

Очевидно, что в результате выполнения функций PRED и SUCC получается значение, принадлежащее к тому же типу, что и аргумент, в то время как результатом выполнения функции NUM являются целочисленные значения.

Следует также отметить, что функция PRED (X) невыполнима, если аргументом является наименьшее значение упорядоченного ряда, а функция SUCC (X) невыполнима, если аргументом является наибольшее значение упорядоченного ряда.

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

Определение константы содержит слово SYN, за которым следует имя, вводимое программистом для обозначения константы. Далее обозначается тип, если в этом есть необходимость, затем символ определения «=», за которым следует литерал. В общем случае за «=» может следовать выражение операнды которого являются литералами других констант. Окончание определения фиксируется символом «;».

Например:

  1. SYN МАКС INT-IBB, ПЕРВЫЙ=1, ПОСЛЕДНИЙ=10; В строке 1 определены три различных константы.

  2. SYN ДЛИНА_ОЧЕРЕДИ_ЗАЯВОК=ПОСЛЕДНИЙ – ПЕРВЫЙ;

В строке 2 определена константа с помощью выражения. После определения константы как имени везде в дальнейшей программе вместо константы используется соответствующее имя.

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

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

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

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

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

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

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

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

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

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

Интерфейсная часть содержит перечень глобальных имен (описанных вне модуля), обозримых внутри модуля, и перечень локальных имен (внутримодульных), обозримых вне модуля. Глобальные имена, обозримые внутри модуля, задаются оператором включения SEIZE. Локальные имена, обозримые вне модуля, задаются оператором разрешения GRANT.

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

Другой программной конструкцией языка CHILL является блок. В общем случае блок состоит из списка операторов определений и описаний и списка операторов действия. Все это заключено в операторные скобки BEGIN и END. Блок может иметь конкретное имя перед BEGIN и после END.

При входе в блок создаются все описанные внутри блока объекты данных, т.е. за этими объектами закрепляются области в памяти ЭВМ. После выполнения операторов, входящих в тело блока, происходит выход из блока, при этом память ЭВМ освобождается.

Внутри блока могут быть использованы объекты данных, описанные во внешней по отношению к блоку программной конструкции.

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

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

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

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

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

Соседние файлы в папке ЯМСЭ