УДК 519.688
ПРОЦЕДУРНОЕ ПРОГРАММИРОВАНИЕ, ОПЕРАТОРЫ ВЕТВЛЕНИЯ И ЦИКЛОВ В СИСТЕМЕ КОМПЬЮТЕРНОЙ АЛГЕБРЫ
© Е. В. Дубовицкий
Ключевые слова: процедурное программирование, оператор ветвления, операторы циклов, система компьютерной алгебры, система компьютерной алгебры МаШраг. Обсуждаются алгоритмы для создания системы процедурного программирования на основе системы компьютерной алгебры. Эти алгоритмы обеспечивают создание процедур и функций, а так же создание операторов ветвления и цикла. Описанный подход был применён в системе компьютерной алгебры Ма1;Ь.раг.
1 Введение
На данный момент существует достаточно много систем компьютерной математики, позволяющих производить численные и аналитические вычисления. Они широко используются в образовании, научных расчётах, при решении различных инженерных задач. Среди таких систем выделяется отдельный класс, ориентированный на символьные аналитические вычисления — это системы компьютерной алгебры. В данный класс входят такие системы как Mathematica, MAPLE, CoCoA, Maxima и другие.
Любое программное обеспечение для использования в алгебраических вычислениях должно включать в себя метод представления сложных математических объектов, язык, позволяющий манипулировать с ними, и библиотеку функций для выполнения необходимых алгебраических операций.
С развитием подобных систем встает вопрос об использовании в них не только поименованных операторов, которые являются некоторым представлением математической формулировки задачи, но и такие языковые конструкции как:
• операторы ветвления if-then-else;
• операторы циклов while и for;
• процедуры и функции.
Данные конструкции расширяют возможности языка, давая пользователю инструменты для управления последовательностью действий в системе компьютерной алгебры.
Исходя из свойства структурного программирования, перечисленные выше операторы позволят использовать в системе любой алгоритм действий, заданый пользователем.
2 Постановка задачи
Для добавления к системе компьютерной алгебры операторов управления необходимо решить следующие задачи.
1. Задать булеву алгебру.
2. Задать синтаксис операторов.
3. Разработать схему компиляции исходного кода программы в промежуточное представление. Имея некоторый способ хранения нечисловых данных внутри системы, достаточно выделить область для хранения всех вхождений операторов, представляющих собой композицию функций, и создать список действий, указывающий на последовательность выполнения данных операторов.
Таким образом, задача разбивается на три подзадачи. Наиболее трудоемким является решение третьей подзадачи, оно же представляет наибольший интерес, поэтому ему посвящена большая часть данной статьи.
3 Операторы ветвления и циклов
Если первые два этапа не представляют сложности и сводятся к добавлению операторов булевой алгебры и договорённости о синтаксисе будущих операторов управления последовательностью вычислений в системе компьютерной алгебры, то для реализации самих алгоритмов подпрограмм и операторов ветвления и циклов удобно иметь некоторое промежуточное представление структуры всей программы.
Обычно поставленную в математическом представлении задачу можно записать в виде совокупности операторов присвоения (например, присвоение через символ «=»), математических операторов (+, *, / и т.д.) и простых функций (sin, cos и т.д.).
Пример 1. а — cos(x) + sin(x); b — 2 * sin(x); a = a — b; b = a/cos(x); c = a*b;
В итоге мы получаем несколько поименованных выражений, представляющих собой композицию различных функций.
В системе компьютерной алгебры Mathpar ([1], [2]) существует тип Рпате для хранения поименованных выражений. Структура объекта типа Fname приведена на рис. 1.
Fname
name X
Х[0] X[l] Х[2] ... X[N]
Рис. 1. Структура типа Fname
Fname имеет два поля:
• name — имя функции, которое представляет собой поле строкового типа;
• X — массив представлений функции, встретившихся в исходном коде пользовательской программы, с именем name. Это поле является массивом типа Element.
Тип Element представляет собой способ хранения числовых и нечисловых данных в системе компьютерной алгебры Mathpar ([1], [2]). Имея массив или список элементов типа Fname, сохраняем в памяти все встретившиеся в программе выражения на момент выполнения программы. Пример способа хранения данных программы приведён на рис. 2.
public java.util.ArrayL¡st<Element> funes
а X
Х[0] xiu X[N]
cos(x)+s¡n(x) a-b
b X
/ *í X[l] *** X[N]
2*sin(x) a/cos{x)
с X
ч* XII] *** X[N]
а*Ь ...
Рис. 2. Способ хранения данных программы
После получения такой структуры представляем исходный код программы в виде ссылок на элементы данного списка. Таким образом, исходная программа сводится к внутреннему представлению, которое содержит в себе список типа Fname и поле со ссылками на этот список.
Например, программа с исходным кодом из примера 1 и списком, представленным на рис. 2, примет вид: 00 10 01 11 20.
Сохранение выражений и создание списка последовательности действий выполняются в процессе трансляции исходного кода программы. После завершения трансляции исходный код программы далее не требуется, поэтому код заменяется внутренним представлением программы.
Таким образом, мы получили удобный способ представления исходного кода, который позволит выполнять программу любое количество раз без повторной трансляции. Подобное представление позволяет добавить операторы ветвления и циклов в систему компьютерной алгебры.
Опишем синтаксис операторов.
• оператор ветвления: if (<условие>) {<ветка_1>} else {<ветка_2>};
• оператор цикла с предусловием: while (<условие>) {<тело_цикла>};
• оператор цикла со счётчиком:
for (<инициализация_счётчика>; <условие_остановки_цикла>; <инкремент_счётчика>) {<тело_цикла>>.
В список последовательности действий необходимо добавить операторы безусловного и условного переходов.
• безусловный переход: -1 <индекс_перехода>. Например, -1 6;
• условный переход: -2 <ячейка_условия><индекс_перехода>. Например, -2 4 0 16.
После введённых обозначений задача сводится к верному распознаванию операторов в тексте программы и к правильному построению списка действий.
Рассмотрим список действий для каждого из операторов управления на примерах.
• Оператор ветвления
if (а < Ь) {а = а + Ь;}
Список действий: -2 0 0 6 1 0
if (а < b) {а = а + b;} else {а = а + b +5;}
Список действий: -2 0 0 8 1 0 -1 10 1 1
• Оператор цикла с предусловием
while (а < b) {а = а + 1;}
Список действий: -2 0 0 8 1 0 -1 0
• Оператор цикла со счётчиком
for (i = 0; i < 5; i = i + 1) {с = с + a;}
Список действий: 00 -2 10 12 2001 -1 2
В цикле со счётчиком место до оператора условного перехода занимает ячейка, отвечающая за инициализацию счётчика, а место до оператора безусловного перехода — ячейка, отвечающая за изменение счётчика.
4 Процедуры и функции
Для добавления к системе компьютерной алгебры процедур и функций записываем процедуру или функцию в отдельный список действий и при вызове исполняем его по определённым правилам. Запись списка действий осуществляется в список или массив, который впоследствии записывается в ArrayList наряду с основной программой.
Отличием функции от процедуры является наличие возвращаемой величины, а также возможность использования функции в качестве операнда в выражениях. Таким образом, можно не различать синтаксически эти два оператора и остановиться на обозначении процедуры, но со следующим условием — любая процедура возвращает значение, либо записанное пользователем после оператора return, либо пустое значение null. Поэтому синтаксис для процедур имеет следующий вид.
• Описание процедуры и функции:
procedure <имя_процедуры> (<аргументы_(через_запятую)>) { тело.процедуры
>
• Вызов процедуры: <имя_процедуры>(передаваемые_аргументы_(через_запятую)).
При отсутствии аргументов ставятся пустые скобки.
Для оператора return в списке действий также введем постоянную со значением -3. Она обозначит выход из метода, выполняющего процедуру, с возвращаемым значением, взятым из ячейки, записанной после данной постоянной.
При вычислении выражения, в составе которого есть процедура, сначала вычисляем процедуру, то есть получаем числовое или символьное представление решения процедуры, затем подставляем это значение в выражение.
5 Заключение
Таким образом, в системе компьютерной алгебры Mathpar появились возможности использования нелинейных конструкций кода, а также возможности структурного программирования. Это позволило упорядочить код и дало пользователю некоторые дополнительные инструменты для решения задач.
ЛИТЕРАТУРА
1. Malaschonok G.I. Project of Parallel Computer Algebra. Tambov University Reports. Series: Natural and Technical Sciences. V. 15. Issue 6. 2010. P. 1724-1729.
2. Малагионок Г.И. Компьютерная математика для вычислительной сети. Вестник Тамбовского университета. Сер.: Естественные и технические науки. Т. 15. Вып. 1. 2010. С. 322-327
3. Дэвенпорт Дж, Сирэ И., Турнье Э. Компьютерная алгебра, Мир, 1991.
4. Мир ПК [Электронный ресурс]. / ЗАО «Издательство «Открытые системы»». Электрон, журн. Режим доступа к журн.: http://www.osp.ru/pcworld/. Загл. с экрана.
5. Ахо Альфред В., Лам Моника С., Сети Рави, Ульман Джеффри Д. Компиляторы: принципы, технологии и инструментарий, 2 издание — М.: «Вильямс», 2010.
6. Хантер Р. Основные концепции компиляторов — М.: Вильямс, 2002.
БЛАГОДАРНОСТИ: Работа выполнена при поддержке РФФИ (грант № 12-07-00755-а) и программы «Развитие потенциала высшей школы» (проект 2.1.1/10437).
Поступила в редакцию 20 февраля 2012 г.
PROCEDURAL PROGRAMMING, OPERATORS OF BRANCHING AND LOOPING IN THE, COMPUTER ALGEBRA SYSTEM
© Dubovitsky Evgeny Vladimirovich
Tambov State University named after G.R. Derzhavin, Internatsionalnaya, 33, Tambov, 392000, Russia, Post-graduate Student of Mathematical Analysis Department, e-mail:
Key words: procedural programming, operators of branching and looping, computer algebra system Mathpar.
We discuss algorithms for creating a system of procedural programming, based on computer algebra system. These algorithms ensure the creation of procedures and functions, as well els the establishment of branch and loop statements. The described approach was applied in the computer algebra system Mathpar.