Научная статья на тему 'Формализация иерархии имён в языках объектно-ориентированного программирования'

Формализация иерархии имён в языках объектно-ориентированного программирования Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
101
13
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ / OBJECT-ORIENTED PROGRAMMING / C++ / ДЕРЕВО ИМЕН / NAME TREE / АВТОМАТИЗАЦИЯ ПОСТРОЕНИЯ МОДЕЛЕЙ ПРОГРАММ / AUTOMATION OF SOFTWARE MODEL GENERATION

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Харитонов Дмитрий Иванович, Тарасов Георгий Витальевич, Парахин Роман Валерьевич, Голенков Евгений Александрович, Леонтьев Денис Васильевич

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

i Надоели баннеры? Вы всегда можете отключить рекламу.

Похожие темы научных работ по компьютерным и информационным наукам , автор научной работы — Харитонов Дмитрий Иванович, Тарасов Георгий Витальевич, Парахин Роман Валерьевич, Голенков Евгений Александрович, Леонтьев Денис Васильевич

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Текст научной работы на тему «Формализация иерархии имён в языках объектно-ориентированного программирования»

TECHNICAL SCIENCES

On the formalization of the hierarchy of names in object-oriented programming languages Kharitonov D.1, Tarasov G.2, Parakhin R.3, Golenkov E.4, Leontyev D.5

(Russian Federation) Формализация иерархии имён в языках объектно-ориентированного

программирования Харитонов Д. И.1, Тарасов Г. В.2, Парахин Р. В.3, Голенков Е. А.4, Леонтьев Д. В.5 (Российская Федерация)

'Харитонов Дмитрий Иванович / Kharitonov Dmitry - кандидат технических наук, старший научный сотрудник; 2Тарасов Георгий Витальевич / Tarasov Georgy - научный сотрудник; 3Парахин Роман Валерьевич /Parakhin Roman - инженер-программист; 4Голенков Евгений Александрович / Golenkov Evgeny - кандидат физико-математических наук,

старший научный сотрудник; 5Леонтьев Денис Васильевич /Leontyev Denis - аспирант, инженер-программист, Институт автоматики и процессов управления, г. Владивосток

Аннотация: в настоящей статье рассматривается формальный подход к описанию иерархии имён объектно-ориентированных программ, необходимый для автоматизации построения моделей программ. Предложен вспомогательный математический объект дерево имен и множество операций над деревьями имен. Рассмотрено преобразование деревьев имён в процессе разбора исходного текста программ для моделирования поведения программы на языке С++.

Abstract: this article discusses a formal approach to the description of object-oriented programs element names hierarchy, that are needed to build automation software models. Auxiliary mathematical object called "name tree" and many operations on the name trees are proposed. Name trees transformation in the process of source code parsing for modelling a C ++ program behavior is considered.

Ключевые слова: объектно-ориентированное программирование, C++, дерево имен, автоматизация построения моделей программ.

Keywords: object-oriented programming, C++, name tree, automation of software model generation.

Введение

Формальная проверка свойств является единственным надёжным способом обеспечения корректности функционирования программ, а также является одним из глобальных вызовов, который предстоит решить человечеству в 21 веке [1]. Однако формальная проверка свойств программ не используется в абсолютном большинстве случаев программирования. Программирование в современном производстве - это отлаженный технологический процесс, в котором выделяются планирование и проектирование, разработка и отладка, оптимизация кода, поиск и исправление ошибок, поддержка и обновление программного обеспечения. При этом любая стадия технологического процесса программирования поддерживается богатым разнообразием автоматизированных средств, таких например как интегрированные среды разработки программ (Microsoft Visual Studio, NetBeans, CodeBlocks), средства проектирования (UML Rational Rose, Er/Studio) или средства анализа исполняемого кода (Intel Code Analyser + Adviser, Valgrind). Таким образом, не смотря на интеллектуальность и зависимость от человеческого фактора, программирование опирается на автоматизацию для максимального ускорения процесса. Поэтому для внедрения в

36

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

Иерархия имён в ООП

Функции в языке С могут вызывать только другие функции, поэтому пространство имён в С образует простое множество. Техническим исключением являются локальные функции, которые формируют дополнительный уровень пространства имён, разный для каждого исходного файла. Поэтому для построения модели программы необходимо построить множество моделей всех её функций и объединить их между собой связями, моделирующими передачу управления [3, 4].

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

В языке С++ используется следующий порядок просмотра имён объектов:

1. Сначала проверяются объекты, объявленные локально.

2. Затем проверяются объекты, являющиеся членами класса, владеющего исполняемым методом.

3. Затем проверяются глобально объявленные объекты.

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

Дерево имен

Для моделирования иерархии имён в ОО языках программирования предложен вспомогательный математический объект — дерево имён, и операции над ним.

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

L

P)

L

Рис. 1. Операции над деревьями имен: a) построение простейшего дерева, b) формальное объединение деревьев, с) операция одношагового роста, d) добавление коротких связей

Рассмотрим преобразование деревьев имён в процессе разбора исходного текста программ для моделирования поведения программы на языке С++. На первом этапе построения пространства имён программы находятся функции, методы и переменные, которые встречаются как в виде деклараций, так и в виде реализации. Любое множество таких объектов можно представить в виде простого дерева (рис. 1 (а)). При необходимости деревья имён можно объединять, начиная с объединения корневых вершин и далее либо склеивая дуги с одинаковыми именами, либо размещая их в результирующем дереве без изменений. Формальное объединение деревьев имен склеивает два или более дерева, объединяя их корневые вершины. Пример операции формального объединения изображён на рис. 1 (b). Для добавления к множеству имён методов наименования пространства имён (namespace в терминологии C++) к дереву имён добавляется новая корневая вершина при помощи операции одношагового роста, а доступные по короткому имени в экземплярах класса переменные и методы можно построить при помощи операции добавления коротких связей. Операция одношагового роста добавляет к дереву новую корневую вершину, давая дуге, связующей новую и старую вершины, заданное имя. Операция добавления коротких связей применима к такому дереву имён, в котором корневая вершина имеет единственную дугу к вершине, называемой стволовой или просто стволом дерева. Эта операция делает копии вершин, исходящих от стволовой, и добавляет дополнительные связи (другого типа), связывающие копии вершин с оригиналами и корневую вершину с копиями. Примеры приведены соответственно на рис. 1 (c, d).

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

Рис. 2. Операции над деревьями имен: а) операция укоренения для заведения класса, Ь) операция одношагового роста для построения дерева имён переменной-объекта

b) исключение: ветки дерева

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

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

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

Работа выполнена при поддержке программы фундаментальных исследований Президиума РАН «Фундаментальные проблемы математического моделирования» (проект 0262-2014-0157) и государственного финансирования (проект 0262-2014-0003).

Литература

1. Tony Hoare. The verifying compiler: A grand challenge for computing research. J. ACM 50, 1 (January 2003), 2003. P. 63-69.

2. Dedova A. and Petrucci L. From code to coloured Petri nets: Modelling guidelines // In Transactions on Petri Nets and Other Models of Concurrency VIII (M. Koutny, W. M. P. van der Aalst, and A. Yakovlev, eds.), Berlin, Heidelberg: Springer Berlin Heidelberg,

2013. P. 71-88.

3. Anisimov N. A., Golenkov E. A., andKharitonov D. I. Compositional Petri net approach to the development of concurrent and distributed systems // Programming and Computer Software. Vol. 27. №. 6, 2001. P. 309-319.

4. Kharitonov G. V. T. Dmitriy I. Modeling function calls in program control flow in terms of Petri Nets // ACSIJ Advances in Computer Science: an International Journal. Vol. 3, November

2014. P. 82-91.

i Надоели баннеры? Вы всегда можете отключить рекламу.