Система программирования на языке О2М

Швец Д.А.
(Красноярский государственный технический университет)

Язык программирования О2М [1] расширяет своего предшественника методами процедурно-параметрического программирования [2]. Он включает все возможности языка Оберон-2 [3], что позволяет использовать ранее написанные модули. Для практической апробации процедурно-параметрической парадигмы разработаны транслятор, многофункциональная графическая оболочка и генератор проекта.

Организация системы программирования

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

Транслятор О2М

Транслятор реализован в виде отдельной программы (o2m.exe), осуществляющей раздельную компиляцию модулей. Трансляция заключается в компиляции с О2М на C++. Подобная схема перевода с одного языка высокого уровня в другой широко используется в экспериментальных разработках и позволяет апробировать идеи без дополнительных усилий по созданию генераторов кода.

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

o2m.exe имя_транслируемого_файла имя_файла_проекта [-m]

Указываемый вторым параметром файл настроек проекта используется для доступа к подключаемым библиотекам. Необязательный ключ -m используется во время трансляции главного модуля, который импортирует библиотечные модули, позволяющие формировать консольное или оконное приложение. Помимо этого (в подкаталоге "cpp" проекта) создается файл _O2M_make.2mk, содержащий список всех сгенерированных и библиотечных файлов с расширением cpp, необходимых для создания исполняемой программы. Он получается в результате обработки директив импорта, размещаемых в теле транслируемого модуля, модулей определений, расположенных в подкаталоге "dfn" проекта и библиотечных каталогах.

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

Утилита для создания проекта C++

Утилита make2m.exe используется для порождения файла описания проекта собираемого из файлов на языке C++. Это позволяет упростить подключение к различным C++ компиляторам и автоматизировать процесс сборки. В текущей версии осуществляется генерация файла makefile.mak для системы программирования Microsoft Visual C++ 6.0. Запуск утилиты осуществляется командной строкой:

make2m.exe _O2M_make.2mk

Графическая оболочка

Графическая оболочка позволяет упростить весь процесс создания проекта и формирования исполняемого файла. Она реализована в виде отдельного приложения pro2m.exe, и функционирует под управлением операционных систем MS Windows 95/98/NT/2000/XP.

К основным функциям оболочки относятся: создание проектов и работа с ними, запуск компилятора O2M, утилиты Make2M, и программы nmake из комплекта Microsoft Visual C++ 6.0. Также возможен запуск исполняемого файла, полученного в результате сборки проекта.

Технология создания программ

В большинстве систем программирования, существующих для языков Оберон и Оберон-2, используется раздельная компиляция модулей в динамически подгружаемые компоненты для среды, обеспечивающей активацию команд, сбор мусора, поддержку определенных структур данных времени выполнения. Система, рассматриваемая в работе, также осуществляет раздельную компиляцию модулей, но затем делает их статическую компоновку. Подобное различие обуславливается тем, что одной из основных задач выполняемого проекта является исследование методов связывания эволюционно расширяемых программных объектов на ранних стадиях сборки программы. Не существует принципиальных сложностей в замене статической компоновки на динамическую. Принятое решение определяет специфику создания исполняемого файла, являющегося монолитом, собранным из всех модулей, включенных в проект. Свою специфику накладывает и организация транслятора, генерирующего на выходе исходный текст на языке C++.

Структура проекта программы

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

Файл свойств проекта

Описание используемых программных модулей, задается в специальном конфигурационном файле проекта. Для его обозначения используется расширение pro. Файл содержит описания используемых модулей в формате, аналогичном ini-файлам. Для описания подключаемых модулей с исходным текстом на языке О2М используется строка следующего формата:

FILE=имя_файла_с_модулем

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

MAIN=имя_главного_модуля_программы

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

IMPORT=полный_путь_к_модулю

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

EXEC=имя_исполняемого_файла

Служебные подкаталоги

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

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

В каталоге "cpp" размещаются файлы программы на языке C++, генерируемые в результате трансляции модулей. Там же создается файл проекта, используемый для компиляции программы с языка C++, а также файлы, дополнительно порождаемые при трансляции объектов, поддерживающих процедурно-параметрический полиморфизм (с расширением 2ml).

Каталог "make" используется для результатов трансляции программы на C++. Эта трансляция осуществляется соответствующим компилятором. В каталоге также хранятся объектные файлы и сгенерированный исполняемый модуль.

Пример использования системы программирования

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

MODULE HanoyTower;
IMPORT Out, In;
PROCEDURE Hanoy( n : INTEGER; x, y, z : CHAR );
BEGIN
   IF n>0 THEN
      Hanoy( n-1, x, z, y );
      Out.String("From "); Out.Char(x);
      Out.String(" to "); Out.Char(y);
      Out.Ln;
      Hanoy( n-1, z, y, x );
   END
END Hanoy;
PROCEDURE Run*;
VAR
   n : INTEGER;
BEGIN
   In.Open; Out.Open;
   Out.String("Disk number "); In.Int(n);
   IF (n>0) THEN Hanoy(n, 'A', 'B', 'C' ) END
END Run;
END HanoyTower.

Модуль testhan.o2m, осуществляющий тестирование, использует следующий код:

MODULE TestHanoy;
IMPORT Console, HanoyTower;
BEGIN
   HanoyTower.Run
END TestHanoy.

Для реализации программы создаем каталог "hanoy", в котором размещаем оба файла. Запускаем оболочку Pro2M, с помощью которой внутри этого каталога создается проект с именем hanoytow.pro (имя проекта выбирается по усмотрению разработчика).

Рис.1. Интерфейс графической оболочки Pro2M

При создании проекта автоматически генерируются описанные выше подкаталоги "cpp", "dfn", "make". С помощью инструментальной панели добавляем в проект модули с исходными текстами и пути к описаниям внешних модулей (файлам с расширением dfn). Выделяем главный модуль проекта и осуществляем трансляцию. Пример настроек данного проекта в приложении Pro2M и результаты трансляции представлены на рис.1. В результате установки настроек автоматически генерируется файл конфигурации проекта hanoytow.pro, следующего содержания:

IMPORT=C:\Prog\O2M\Import\
MAIN=testhan.o2m
EXEC=hanoytow.exe
TARGET=0
FILE=hanoytow.o2m
FILE=testhan.o2m

При отсутствии ошибок получаем исходные тексты оттранслированной программы на языке C++ и файл проекта. Запускаем на трансляцию сгенерированный проект и получаем исполняемый модуль. Имя исполняемого файла также можно установить в настройках проекта. Помимо этого оболочка позволяет запустить сгенерированную программу.

Заключение

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

Литература

  1. Легалов А.И. Швец Д.А. Процедурно-параметрические расширения языка программирования Оберон-2. - Вестник Красноярского государственного технического университета. Вып. 23. Математические методы и моделирование. / Красноярск, 2001. с. 140-148.

  2. Легалов А.И. Процедурно-параметрическая парадигма программирования. Возможна ли альтернатива объектно-ориентированному стилю? / Красноярск: 2000. Деп. рук. № 622-В00 Деп. в ВИНИТИ 13.03.2000. - 43 с.

  3. Moessenboeck H., Wirth N. The Programming Language Oberon-2. Institut fur Computersysteme, ETH Zurich July 1996.