WO2018182454A1 - Способ разработки, хранения и использования компилированных в бинарное представление программ в таблицах баз данных - Google Patents

Способ разработки, хранения и использования компилированных в бинарное представление программ в таблицах баз данных Download PDF

Info

Publication number
WO2018182454A1
WO2018182454A1 PCT/RU2017/050130 RU2017050130W WO2018182454A1 WO 2018182454 A1 WO2018182454 A1 WO 2018182454A1 RU 2017050130 W RU2017050130 W RU 2017050130W WO 2018182454 A1 WO2018182454 A1 WO 2018182454A1
Authority
WO
WIPO (PCT)
Prior art keywords
class
database
functional
programs
function
Prior art date
Application number
PCT/RU2017/050130
Other languages
English (en)
French (fr)
Inventor
Александр Олегович ПОПОВ
Original Assignee
Александр Олегович ПОПОВ
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Александр Олегович ПОПОВ filed Critical Александр Олегович ПОПОВ
Publication of WO2018182454A1 publication Critical patent/WO2018182454A1/ru

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/10File systems; File servers
    • G06F16/14Details of searching files based on file metadata
    • G06F16/144Query formulation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/10File systems; File servers
    • G06F16/17Details of further file system functions
    • G06F16/178Techniques for file synchronisation in file systems
    • G06F16/1794Details of file format conversion
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/22Indexing; Data structures therefor; Storage structures
    • G06F16/2219Large Object storage; Management thereof

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • Data Mining & Analysis (AREA)
  • Databases & Information Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Software Systems (AREA)
  • Mathematical Physics (AREA)
  • Library & Information Science (AREA)
  • Devices For Executing Special Programs (AREA)
  • Stored Programmes (AREA)

Abstract

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

Description

СПОСОБ РАЗРАБОТКИ, ХРАНЕНИЯ И ИСПОЛЬЗОВАНИЯ КОМПИЛИРОВАННЫХ В БИНАРНОЕ ПРЕДСТАВЛЕНИЕ ПРОГРАММ В ТАБЛИЦАХ БАЗ ДАННЫХ
1 Область техники
Настоящее изобретение относится к области информационных технологий и конкретно к системам управления базами данных в части способов хранения и использования программ для обработки данных.
2 Уровень техники
В современных системах управления базами данных используется в основном
библиотечный способ организации хранения и использования программ для обработки данных, занесенных в базу данных. Это способ применения хранимых процедур, которые регистрируются в системе под уникальными именами отдельно от данных и доступны для использования посредством указания этих имен. Дополнительно в системах управления базами данных применяются триггеры, которые предоставляют более гибкий способ вызова заключенных в них программ по событиям уровня таблицы данных, к которой триггер приписан. При этом использование триггеров в большей степени увеличивает сложность системы и вызывает дополнительные трудности в отладке из-за побочных эффектов. Оба этих метода можно назвать статичными, поскольку они не предполагают возможности модификации программ в процессе использования информационной системы, которая включает в себя базу данных.
В то же время программные модули так же являются информацией, как и данные, традиционно хранящиеся в базе данных. Можно ожидать, что возможности разработки и использования информационных систем возрастут, если программы обработки данных можно будет хранить в таблицах базы данных, наряду со всеми другими данными, как равноправный тип данных.
При этом для того, чтобы хранение и использование программ в качестве данных было эффективным, необходимо решить ряд проблем. В первую очередь, необходимо обеспечить способ хранения программ в откомпилированном бинарном виде для возможности эффективного использования программ. Во-вторых, необходимо реализовать способ обеспечения таких программ информацией из базы данных, которая необходима в качестве исходных данных. В- третьих, необходимо обеспечить механизм запуска программ и применения результатов в процессе эксплуатации информационной системы пользователем. В-четвертых, необходимо обеспечить способы обслуживания, связанные с анализом, отладкой и диагностикой программ. В - пятых необходимо обеспечить возможности контроля над побочными эффектами при
использовании множества программ, хранящихся в таблицах наряду с другими данными, чтобы избежать непропорционально большого роста сложности информационной системы при ее разработке и развитии. В данном изобретении предлагаются способы решения этих задач.
3 Краткое описание изобретения
В данном изобретении предлагается способ разработки, хранения, использования и обслуживания программ, которые находятся в таблицах базы данных наряду с другими данными пользователя, и предназначены для выполнения расчетов на множестве данных базы данных. Указанные программы могут разрабатываться на языке высокого уровня, записываться и храниться в таблицах базы данных в бинарном откомпилированном виде, вызываться на исполнение из хранимых процедур, триггеров базы данных или программных приложений пользователя. Доступ к программам, как и другим данным, осуществляется по запросам базы данных.
Функциональность программ включает в себя методы извлечения исходных данных из базы данных и множество необходимых вычислительных операций для расчета результатов. Для обеспечения контроля над сложностью системы при использовании множества программных модулей, хранящихся в среде данных, во всех операциях, производимых в рассматриваемых программах, исключены побочные эффекты. То есть, все программы, разрабатываемые в рамках представляемого способа, являются программами - функциями. Это дает возможность для реализации программ использовать функциональный язык высокого уровня, который может обеспечить краткость при написании текстов программ и эффективность при их сопровождении.
Представление программ в таблицах базы данных является достаточным, также для их сопровождения. Описываемый способ обеспечивает возможность декомпиляции программ обратно в текстовую форму из бинарного представления. Кроме этого, в разработанных программах предусматривается верификация, диагностика и генерирование событий, которые могут использоваться системой управления базой данных для обработки ошибок и отката транзакций.
Эффект изобретения заключается в расширении возможностей разработки, настройки и применения информационных систем, базирующихся на использовании базы данных. Расширение возможностей основано на использовании функциональных программ обработки данных, которые хранятся в эффективном для использования бинарном представлении в таблицах данных наряду со всеми данными пользователя и могут эффективно разрабатываться, модифицироваться и использоваться в процессе эксплуатации информационной системы. Спектр использования таких функциональных программ может быть достаточно широк. В частности, они могут применяться для обновления данных в базе при изменении других данных. Функциональные программы - предикаты могут использоваться в качестве ограничений взаимосвязанных данных в базе данных. Также эти программы могут использоваться на уровне программных приложений, реализующих бизнес - логику информационной системы.
4 Раскрытие сущности изобретения
4.1 Введение
Способ разработки программ для хранения в бинарном виде в таблицах базы данных и использования их для вычислений на множестве данных базы данных основан на использовании программируемых пользовательских типов данных базы данных, создаваемых на объектно- ориентированном языке программирования.
В основе данного способа лежит разработка структуры классов, каждый из которых описывает множество функций функционального языка программирования для вычислений на множестве данных базы данных. Структура классов является иерархией, построенной на отношении наследования. Объекты классов играют роль конкретных функций.
Программные методы классов служат для обеспечения исполнения функций, описываемых классом, а также для их обслуживания, в частности, компиляции, записи в бинарное
представление, обратной компиляции, диагностики.
Атрибуты классов являются параметрами, которые обеспечивают создание множеств различных функций из классов. С помощью структурных атрибутов формируются функции, имеющие в качестве результата структурные типы данных. В частности, с помощью структурных атрибутов формируются внутренние вызовы функций, на основе которых строится суперпозиция функций.
Текстовое представление программы функционального языка компилируется в структуру объектов классов, которая играет роль суперпозиции вызовов функций. В узлах структуры находятся внутренние вызовы функций, конечными элементами структуры являются вызовы функций без параметров. Корневым элементом структуры является вызов головной функции. Запуск программы функционального языка на исполнение осуществляется с помощью
рекурсивного вызова специальных виртуальных методов классов, которые обеспечивают выполнение всей суперпозиции функций.
В последующих подразделах представлено детальное описание изобретения. Объектно-ориентированный язык программирования, использующийся для реализации представленных в данном изобретении решений, в дальнейшем для краткости будет называться инструментальным языком. Функциональный язык программирования высокого уровня, который предназначается для разработки программ, хранящихся в таблицах базы данных, будет называться функциональным языком. Программа, разработанная на функциональном языке
программирования, будет называться функциональной программой. Пользовательский тип данных базы данных, используемый для создания программ-функций, будет называться функциональным типом данных. Классы инструментального языка программирования, предназначенные для реализации функционального языка, будут называться классами функционального языка.
4.2 Структура классов для реализации функционального языка
Классы для реализации функционального языка представляют множества функций функционального языка программирования. Основные классы объединены в единую структуру отношением наследования. В структуре наследования каждый базовый класс описывает множество функций, которое является объединением множеств функций, представляемых наследуемыми классами. Два различных класса, имеющих общий базовый класс, представляют два множества функций, которые не имеют общих функций. В структуре наследования классов функционального языка находится один корневой базовый класс, который является объединением всех функций, представленных в функциональном языке. В целом структура классов
функционального типа данных является деревом классов, построенном на отношении
наследования, с единым корневым базовым классом.
Объект основного класса описывает конкретную функцию функционального языка программирования. Среди объектов есть сложные объекты, объекты, представляющие собой вызовы других функций, а также примитивные объекты, которые описывают функции без параметров. Часть классов являются абстрактными, они не предназначены для создания объектов. Абстрактные классы служат для описания множеств функций, то есть для представления типов функций.
Основные классы имеют атрибуты, множество различных значений которых определяет множество различных функций, представляемых классом. Структура наследуемых классов формируется таким образом, чтобы минимизировать количество атрибутов в классах, за счет вынесения однотипных атрибутов классов в их общий базовый класс.
Объект функционального типа данных является контейнером, содержащим объекты классов функционального языка. Структура объектов классов функционального языка внутри контейнера формирует суперпозицию функций, которая служит для выполнения вычислений на множестве данных базы данных. 4.3 Синтаксис функционального языка
Синтаксис языка программирования может быть представлен, как множество
синтаксических правил. Способ компиляции программ функционального языка в рамках данной работы основан на том, что каждому основному классу сопоставлен свой набор синтаксических правил, который, таким образом, является синтаксисом этого класса. Поскольку классы
взаимосвязаны, синтаксические правила одного класса могут ссылаться на синтаксические правила другого класса. При такой организации головное синтаксическое правило корневого класса в иерархии наследования является головным синтаксическим правилом всего
функционального языка. При этом дерево классов, сформированное отношением наследования, играет роль дерева грамматического разбора для процесса компиляции из текстового
представления программ функционального языка в объектную форму.
Синтаксическое правило для класса, который имеют производные классы, представляет собой набор альтернатив синтаксических правил производных классов, а также собственных синтаксических правил для своих объектов, принадлежащих исключительно данному классу. Если класс является абстрактным, соответственно, синтаксическое правило для своих объектов будет отсутствовать. Синтаксические правила класса для своих объектов основываются на описании синтаксиса атрибутов классов. Если в составе атрибутов присутствуют объекты других классов, синтаксические правила классов имеют ссылки на синтаксические правила других классов. В этом случае могут возникать рекурсивные ссылки.
Представленный способ формирования синтаксиса дает возможность расширять язык программирования без необходимости модифицировать уже разработанные программы и минимизировать объемы модификаций при изменении синтаксических правил для отдельных классов.
4.4 Компиляция программ функционального языка
Способ компиляции функционального языка основан на том, что в составе каждого класса должен присутствовать статический метод - функция на инструментальном языке, который выполняет компиляцию объектов этого класса. Этот метод получает на вход строку символов - текстовое определение класса, а на выходе создает объект класса, соответствующий текстовому определению. Поскольку синтаксические правила классов могут ссылаться друг на друга, компиляторы одних классов могут вызвать компиляторы других классов. Компилятор корневого класса в иерархии наследования классов является компилятором всего функционального языка.
Поскольку синтаксические правила функционального языка привязаны к реализующим его классам, сложность отдельной программы-компилятора в каждом классе будет достаточно низкой. При этом общая структура программ компиляции, является эффективной с точки зрения разработки, модификации и расширения функционального языка. Это обусловлено тем, что изменение существующего или добавление нового элемента функционального языка в основном вызовет необходимость изменения программы компиляции только в том классе, который связан с реализацией этого элемента.
Эффективность методов компиляции зависит от сложности языка. Поскольку речь идет о функциональном языке программирования, синтаксис языка может быть сформирован таким образом, чтобы синтаксический разбор выполнялся в основном программами обработки регулярных выражений, входящих в стандартные библиотеки многих языков программирования. Это дает возможность разработки компактных и эффективных методов компиляции.
Необходимо отметить, что расширение или модификация функционального языка производится в основном за счет элементов, которые являются конечными в дереве
грамматического разбора. Поэтому компиляторы для новых или модифицируемых элементов языка, как правило, будут относительно простыми. Таким образом, расширение или модификация функционального языка в части изменения компилятора является несложной задачей.
4.5 Структура объектов функционального языка
В результате компиляции программы функционального языка генерируется структура объектов классов функционального языка. В узлах структуры находятся объекты, которые содержат в себе ссылки на другие объекты классов функционального языка. В частности, узлами служат объекты, которые являются вызовами функций и структурами данных. Если в
функциональном языке предусмотрены другие структурные или ссылочные классы, такие как условные операторы, функции высшего порядка, идентификаторы, - то их объекты также будут играть роль узлов структуры объектов. При использовании таких объектов структура может быть рекурсивной. Построенная структура объектов имеет выделенную вершину, в которой находится головной вызов функции. В целом структура объектов однозначно отражает суперпозицию функций в программе, написанной на функциональном языке программирования.
4.6 Исполнение программ функционального языка
Каждый объект основного класса функционального языка играет роль функции. Вызов функции на исполнение осуществляется специальным виртуальным программным методом, который присутствует в каждом классе. Этот программный метод вычисляет результат функции, роль которой играет объект. Результатом функции является объект одного из классов
функционального языка. В абстрактных классах данный метод может быть абстрактным. При вызове абстрактного метода в инструментальном языке программирования управление передается виртуальному методу объекта соответствующего типа. Программный метод вычисления результата функции для объекта, который является узловым в структуре объектов
функциональной программы, в процессе выполнения вызывает аналогичные методы в связанных объектах. Таким образом, осуществляется выполнение запрограммированной суперпозиции функций. Расчет общего результата функциональной программы осуществляется вызовом данного программного метода в головном объекте структуры объектов.
Для каждого класса, который описывает функции запроса к базе данных, в представленном здесь способе, предусматривается хранимая процедура в базе данных, которая реализует действия оператора функционального языка и скрывает детали организации данных в базе. Программный метод, реализующий такой запрос в классе, является, таким образом, оболочкой вызова хранимой процедуры. При такой организации пользователь, разрабатывая программы на функциональном языке, оперирует с объектами высокого уровня, такими как множества, отношения, иерархия, а также операторами над этими объектами, которые находятся на уровне теоретико -множественных операций. При этом в функциональном языке нет необходимости учитывать особенности реализации структур данных в базе данных. Соответственно, изменения, производимые на уровне базы данных, не будут непосредственно влиять на уже разработанные программы
функционального языка.
4.7 Декомпиляция программ функционального языка
Преобразование программ, написанных на функциональном языке, обратно в текстовую форму выполняется с помощью виртуального программного метода, который включен в каждый класс функционального языка. Этот метод переводит объект класса в текстовую форму в соответствии с синтаксическими правилами, установленными для этого класса. Для классов, которые описывают структурные или ссылочные объекты, программный метод декомпиляции может вызывать такой же метод других объектов. В абстрактных классах данный метод может быть абстрактным. При вызове метода управление будет передано в программный метод класса, соответствующий типу объекта, по правилам обработки виртуальных программ в объектно- ориентированном языке программирования. Вызов метода декомпиляции в головном объекте структуры объектов функционального языка обеспечивает получение текста исходной программы, написанной на функциональном языке.
При такой организации декомпиляции сложность разработки каждого отдельного метода перевода объектов обратно в текстовую форму будет достаточно низка. В целом расширение или модификация функционального языка в части разработки программных методов декомпиляции будет несложным, поскольку необходимые изменения в основном затронут только программный метод декомпиляции в модифицируемом или разрабатываемом классе.
4.8 Перевод в бинарное представление
Объекты пользовательского типа данных хранятся в таблице базы данных в бинарном представлении. Для перевода программы в бинарное представление и обратно используются специальные методы классов. Организация записи объектов в бинарное представление и извлечение их из этого представления аналогично организации декомпилятора и компилятора функционального языка.
Для записи в бинарное представление в каждом классе предусматривается виртуальный программный метод, который записывает объект в виде последовательности бинарных символов. Параметром метода является бинарный поток, в который ведется запись. При вызове данного метода исполняется программный метод класса, тип которого имеет объект, который переводится в бинарную форму. Для распознавания класса, к которому принадлежит объект в бинарном представлении, в качестве префикса объекта в бинарную запись включается дескриптор, однозначно указывающий на класс объекта. Для объектов, которые содержат другие объекты или ссылаются на них, данный метод вызывает одноименный программный метод для этих объектов. Вызов данного метода для головного объекта в структуре объектов функционального типа данных обеспечит перевод в бинарный вид всей функциональной программы.
Для считывания объектов из бинарного представления в объектную форму, в каждом классе предусматривается статический программный метод. Параметром метода является бинарный поток, из которого ведется считывание. Возвращаемым результатом метода является объект класса функционального языка, который генерируется на основе бинарной записи. Данный программный метод создает объект того класса, который обозначен дескриптором класса, записанного при переводе объекта в бинарную форму. Затем из бинарного потока считываются значения атрибутов. При этом данный метод может рекурсивно обращаться к аналогичным методам других классов. Вызов данного метода для корневого класса функционального языка обеспечивает полностью считывание объектного представления функционального программы из бинарного потока.
При такой организации каждый из методов записи и считывания будет достаточно простым. Модификация и расширение функционального языка в части разработки методов записи в бинарное представление и считывание из этого представления, также будет несложным, поскольку необходимые изменения локализуются в основном в самом изменяемом классе.
4.9 Формирование функционального типа данных в базе данных
Программы функционального языка формируются в базе данных в виде пользовательского типа данных, который разрабатывается на инструментальном объектно-ориентированном языке программирования. Пользовательский тип данных определяет программная структура (struct) инструментального языка, которая в данном способе играет роль оболочки для классов функционального языка программирования. Данная программная структура обеспечивает учет особенностей инструментальной среды для встраивания в нее пользовательского типа данных, обеспечивающего работу функционального языка программирования. В данной программной структуре в качестве атрибута включается головной объект структуры объектов функциональной программы. Дополнительно в качестве члена программной структуры оболочки присутствует элемент, указывающий на текущий для данной программы документ базы данных. Кроме этого в число членов включаются, объекты, необходимые для обслуживания функциональной программы, такие как флаг, указывающий на корректность программы и диагностические сообщения о возможных ошибках.
Использование пользовательского типа данных осуществляется с помощью программных методов данной программной структуры пользовательского типа данных. В числе методов присутствует программный метод, обеспечивающий вызов функциональной программы. Кроме этого определяются программные методы компиляции, декомпиляции, записи в бинарную форму и считывания из бинарной формы. Дополнительно включаются методы для обслуживания программы функционального языка, такие как проверка корректности, получение диагностики.
4.10 Использование программ функционального языка
Доступ к программам функционального языка осуществляется с помощью запросов к базе данных, также как выполняется доступ к остальным данным. Запись и чтение функциональных программ в базе данных происходит так же, как выполняется запись и чтение других данных. Вывод функциональных программ в интерфейсе пользователя осуществляется в их текстовом представлении.
Использование программ функционального языка осуществляется как на уровне базы данных в запросах к базе данных, в хранимых процедурах и триггерах; так и на уровне
программных приложений пользователя. Разработка и модификация функциональных программ возможна в процессе эксплуатации и непосредственного использования информационной системы, в которой применяются функциональные типы данных.
5 Краткое описание чертежей
На чертежах, включенных в описание изобретения, представлены диаграммы в нотации Universal Modeling Language - UML(tm).
На Фиг. 100 изображен пример верхнего уровня модели классов программируемого типа данных для формирования программ на функциональном языке программирования.
На Фиг. 200 изображен пример модели классов, которые описывают метаданные базы данных для обеспечения доступа к базе данных из программ, разработанных на функциональном языке программирования.
На Фиг. 300 изображен пример модели классов, которые предназначены для создания структурных объектов функционального языка программирования, включая структуры данных и программные структуры. На Фиг. 400 изображен пример модели классов, которые предназначены для работы с константами.
На Фиг. 500 изображен пример модели классов, которые являются предопределенными функциями, то есть операторами функционального языка программирования.
На Фиг. 600 изображен пример структуры объектов, соответствующей конкретной программе функционального языка программирования.
6 Осуществление изобретения
6.1 Введение
В данном разделе представлено осуществление решений, описанных в разделе 4, на примере одной конкретной функциональной программы. Структура данного раздела идентична структуре раздела 4. В каждом подразделе данного раздела рассматривается пример реализации, относящийся к способам, описанным в соответствующих подразделах раздела 4.
Примеры, описанные в данном разделе, носят иллюстративный характер. Конкретный вид функционального языка предметом данного изобретения не является. Данный способ
предполагает возможность разработки множества различных языков для создания программ в таблицах базы данных, а также возможность их эффективного расширения и модификации.
Для описания примеров использовался язык программирования Microsoft Visual С# (1М) и система управления базами данных Microsoft SQL Server (1М) . Для реализации представленных здесь решений, может быть использован произвольный объектно-ориентированном язык программирования и любой сервер базы данных, предусматривающий возможность создания пользовательских типов данных на этом языке.
6.2 Структура классов для реализации функционального языка
В данном подразделе описан пример структуры классов функционального языка программирования. Этот пример будет использован в дальнейших подразделах для построения варианта функционального языка и иллюстрации его использования на примере конкретной простой программы.
На Фиг. 100 - 500 представлен пример структуры классов функционального языка программирования. Каждый класс описывает множество функций функционального языка.
Классы, которые описывают функции без параметров, являются, по сути, представлением множеств элементов, являющихся результатами этих функций. Соответственно, имена таких классов отражают названия множеств этих элементов. На Фиг. 100 представлен верхний уровень структуры классов функционального языка. Тип данных 101 FunctionType представляет функциональный тип данных, определяемый в базе данных. Основные классы имеют единый корневой базовый класс 102 BaseObject, который обозначает общий для всех тип объектов инструментального языка. В функциональном языке программирования класс 102 описывает общий тип всех функций. Все объекты класса 102 BaseObject содержатся в объекте функционального типа данных 101 FunctionType и имеют доступ к нему по имени Function. Класс 103 BaseMetaData является производным классом от класса 102 и описывает множество функций, которые предоставляют мета данные базы данных. Мета данные базы данных используются в функциональном языке для построения запросов к базе данных. Класс 104 ObjectList является производным от класса 102 BaseObject и описывает множество функций, которые предоставляют структуры данных функционального языка, включая структуры данных и программные структуры. Класс 105 BaseConst является производным от класса 102 BaseObject и описывает константы, используемые в функциональном языке. Классы 102
BaseObject , 103 BaseMetaData, и 105 BaseConst являются абстрактными и не предназначены непосредственно для создания объектов.
На Фиг. 200 представлены классы, которые относятся к типу 103 BaseMetaData. Класс 201 Field представляет метаданные полей таблиц базы данных. В качестве атрибута в классе 201 Field используется наименование поля. Класс 203 Document представляет документы, которые формируются записями в таблицах данных. В данном примере один документ соответствует одной записи. Класс 203 Document имеет в качестве атрибута идентификационный номер, который в соответствующей таблице базы данных является ключевым. Класс 202 Property описывает объекты, являющиеся свойствами документа. Связь с классом 203 Document указывает, что свойство принадлежит определенному документу; при этом связь с классом 201 Field указывает, что свойство также принадлежит определенному полю таблицы. По сути это означает, что свойство определяется пересечением столбца и строки в таблице данных. Класс 202 Property имеет атрибут Property Value типа 105 BaseConst, который представляет значение данного свойства, то есть величину, которая находится в соответствующей строке и заданном поле таблицы базы данных.
При запросе к базе данных из функционального языка создается структура мета данных типа 103 BaseMetaData. Эта структура мета данных определяет множество данных в базе, необходимых для работы функциональной программы. Далее необходимые данные считываются из базы данных, и производится расчет результата.
На Фиг. 300 представлены классы, которые предназначены для создания структурных объектов, включая структуры данных и программные структуры. Класс 104 ObjectList содержит
упорядоченное множество Tuple - кортеж произвольных элементов функционального языка, то есть элементов типа 102 BaseObject; а также целое число Count, в котором хранится количество элементов в данной структуре. Атрибут Tuple принадлежит классу List<BaseObject>, который имеет программный метод Add - для добавления элемента в список:
// Класс List<BaseObject> метод Add - добавление объекта в список объектов (6201) // Параметр obj - объект, добавляемый в список
public void Add(BaseObject obj);
Доступ к элементам списка осуществляется по индексу - порядковому номеру элемента в списке:
// Класс List<BaseObject> индексер this[] - доступ к элементу списка (6202) // Параметр index - порядковый номер объекта в списке, начиная с нуля
// Результат - объект с заданным порядковым номером в списке
public BaseObject this [int index];
Класс 301 FunctionCall является производным от класса 104 ObjectList и описывает объекты, являющиеся вызовом функции. Абстрактный класс 302 BaseOperator является производным от класса 104 ObjectList и объединяет множество классов, которые являются операторами - предопределенными функциями, выполняющими элементарные действия в функциональном языке.
Определение класса 104 ObjectList является рекурсивным и предполагает возможность построения вложенных структур произвольной сложности. При этом одни и те же элементы функционального языка могут агрегироваться в различные структуры типа 104 ObjectList.
Класс 301 FunctionCall представляет структурные объекты, состоящие из двух элементов: объекта типа 302 BaseOperator, который является исполняемым оператором, и базового объекта типа 104 ObjectList, который играет роль списка фактических параметров. В объекты класса 302 BaseOperator также включаются базовые объекты типа 104 ObjectList, которые в данном случае играют роль списка формальных параметров. Формальные параметры структуры 104 ObjectList, входящей в состав объекта типа 302 BaseOperator, заполняются фактическими параметрами структуры 104 ObjectList, входящей в состав объекта типа 301 FunctionCall, в процессе построения структуры объектов, которая представляет суперпозицию функций.
На Фиг. 400 представлены классы, которые предназначены для работы с константами.
Классы 401 MoneyConst, 402 IntegerConst служат для создания объектов, которые представляют собой, соответственно, денежные единицы и целые числа. Необходимым атрибутом в этих классах является член класса Value, который хранит значение константы соответствующего типа. Атрибут Value в абстрактном классе 105 BaseConst имеет общий универсальный тип object. В классах 401 MoneyConst и 402 IntegerConst значение атрибута перегружается одноименным членом класса со специальным типом. В классы, представляющие константы, включен программный метод Addition - сложение. В классе 105 BaseConst этот метод является абстрактным:
// Класс BaseConst метод Addition - сложение текущей константы и константы - параметра (6203) // Параметр const - второе слагаемое
// Результат - константа - сумма текущей константы и константы - параметра
public abstract BaseConst Addition(BaseConst const);
В классах 401 MoneyConst и 402 IntegarConst этот метод является перегруженным и выполняет сложение, соответственно, десятичных и целых чисел. В качестве примера приводится текст метода Addition для класса MoneyConst:
// Класс MoneyConst метод Addition - сложение текущей константы и константы - параметра (6204) // Параметр const - второе слагаемое
// Результат - константа - сумма текущей константы и константы - параметра
public override BaseConst Addition(BaseConst const)
{
decimal value = Value + (decimal)const.Value; //сумма десятичных значений
return new MoneyConst( value, Function); // создание и возврат константы - результата
}
В число реализуемых типов констант могут быть включены все типы данных,
поддерживаемые базой данных, а также типы данных определяемые пользователем.
На Фиг. 500 представлены классы, которые являются примерами операторов
функционального языка. Классы 501 CurrentDocument, 502 Sum, 503 PropertyList и 504
HierarchySubordinate являются производными от класса 304 BaseOperator. Объект класса 501 CurrentDocument является функцией, которая возвращает текущий документ, то есть документ, свойство которого вычисляет текущая функциональная программа. Объект класса 502 Sum является функцией, которая вычисляет сумму множества констант. Объект класса 503 PropertyList является оператором преобразования данных, который формирует множество свойств документов на основе множества документов и заданного поля таблицы. Объект класса 504
HierarchySubordinate является функцией доступа к базе данных, которая формирует множество дочерних документов, то есть документов, которые иерархически подчиненных заданному документу.
Приведенные здесь классы, реализующие операторы функционального языка, выбраны для описания примера, который будет рассмотрен далее в настоящем изложении. Набор операторов, который можно реализовать в рамках описываемого способа является модифицируемым и расширяемым. 6.3 Синтаксис функционального языка
Для описания примера синтаксиса функционального языка вводятся следующие
обозначения. Если имя класса - Class, то множество текстовых представлений всех объектов класса обозначается: Class. Text . При этом текстовые представления собственных объектов класса без объектов производных классов, будет обозначаться как Class. Text. Base. Для абстрактного класса множество Class. Text. Base является пустым. Если класс не имеет производных классов то множества Class.Text и Class.Text.Base совпадают.
Для классов 102 BaseObject, 103 BaseMetaData, 104 ObjectList, 105 BaseConst, 302
BaseOperator, которые имеют производные классы, набор синтаксических правил, является следующим:
BaseObject.Text ::= BaseMetaData.Text I ObjectList.Text I BaseConst.Text (6301) BaseMetaData.Text ::= Field.Text I Property.Text I Document.Text
ObjectList.Text ::= ObjectList.Text.Base I FunctionCall.Text I BaseOperator.Text
BaseOperator. Text ::= CurrentDocument.Text I Sum. Text I PropertyList.Text I
HierarchySubordinate.Text
Для остальных классов, у которых нет классов производных, возможны различные варианты реализации текстового представления. Далее приводятся описания только тех синтаксических правил, которые будут использоваться в примерах программ:
ObjectList.Text.Base ::= (listO) (6302) listO ::= I list 1
listl ::= BaseObject.Text I BaseObject.Text, listl
Field.Text ::= SchemaName.TableName.FieldName
FunctionCall.Text ::= BaseOperator.Text ObjectList.Text.Base
CurrentDocument.Text ::= 'CurrentDocument'
Sum.Text ::= 'Sum'
PropertyList.Text ::= 'PropertyList'
HierarchySubordinate.Text ::= 'HierarchySubordinate'
В синтаксических правилах (6302) структурные объекты класса 104 ObjectList,
представляются в виде списка объектов, заключенных в круглые скобки и разделенных запятыми; при этом список может быть пустым. Имена SchemaName, TableName и FieldName обозначают, соответственно, имена схемы базы данных, таблицы базы данных и поля в таблице. Текстовые строки 'CurrentDocument', 'Sum', 'PropertyList', 'HierarchySubordinate' являются
предопределенными идентификаторами операторов функционального языка.
В качестве примера рассматривается программа функционального языка, вычисляющая сумму стоимостей задач, которые иерархически подчинены текущей задаче. В приведенном выше синтаксисе функционального языка (6301-6302) данная программа будет выглядеть следующим образом:
'Sum(PropertyList(HierarchySubordinates(CurrentDocument()),Management.Task.Cost))' (6303)
Головной структурой программы (6303) является вызов функции с оператором Sum.
Результатом этого вызова будет сумма элементов списка, который является параметром функции. В свою очередь этот список вычисляется вызовом функции с оператором Property List. Эта функция рассчитывает список свойств для множества документов, при этом свойства
соответствуют полю Management. Task. Cost, то есть определяются столбцом Cost в таблице Task, в схеме базы данных Management. Необходимый список документов, при этом, рассчитывается как множество документов, иерархически подчиненных текущему документу. Текущим документом при этом будет документ, возвращаемый функцией CurrentDocument().
6.4 Компиляция программ функционального языка
В данном подразделе рассматривается пример компилятора для функционального языка, построенного с помощью синтаксических правил (6301-6302). Для наглядности в приведенных примерах используются только стандартные функции инструментального языка, при этом вопросы оптимизации не рассматриваются. В качестве имени программы - компилятора класса принимается идентификатор Parse, компилятор собственных объектов класса будет называться BaseParse.
Для синтаксических правил (6301) компиляция может быть представлена как простой перебор альтернатив. Таким образом, например, для корневого класса 102 BaseObject, программа компиляции на инструментальном языке может быть записана следующим образом:
// Класс BaseObject статический метод Parse - компиляция объекта (6401)
// Параметр text - текстовое представление объекта
// Параметр function - объект функционального типа базы данных
// Результат - скомпилированный объект
internal static BaseObject Parse(string text, FunctionType function)
{
BaseObject result; // объявление переменной для результата
result = BaseMetaData.Parse(text, function); //компиляция класса BaseMetaData
if(result != null) return result; //если компиляция успешна возврат результата result = ObjectList.Parse(text, function); //компиляция класса ObjectList
if(result != null) return result; //если компиляция успешна возврат результата result = BaseConst.Parse(text, function); //компиляция класса BaseConst
if(result != null) return result; //если компиляция успешна возврат результата return function.Error("Incorrect BaseObject text: "+text); //выход по ошибке
}
Если программа компиляции не может распознать входной текст, ее результатом будет пустая ссылка null, при этом в объекте функционального типа данных заносится сообщение об ошибке. Компиляторы для остальных классов, для которых синтаксис определен правилами (6301), устроены аналогичным образом.
Компиляция для структурных объектов типа 104 ObjectList реализуется с помощью цикла, в котором выполняется разбор последовательности объектов типа 102 BaseObject между
разделителями текста программы. Созданные в процессе разбора объекты включаются в результирующий объект типа 104 ObjectList. Программа компиляции собственных объектов класса 104 ObjectList может быть записана следующим образом:
// Класс ObjectList статический метод Parse - компиляция объекта (6402)
// Параметр text - текстовое представление объекта
// Параметр function - объект функционального типа базы данных
// Результат - скомпилированный объект
internal static ObjectList BaseParse(string text, FunctionType function)
{
if (!text.StartsWith("(")) return null; //проверка, является ли запись - списком объектов if (!text.EndsWith(")")) //проверка, корректности записи списка
return function.Error("Incorrect ObjectList text: "+text) //выход по ошибке
string rest_text = text.Substring(l, text.Length-2); //удаление скобок
List<BaseObject> tuple = new List<BaseObject>(); // объявление кортежа объектов string obj_text = //присваивание записи первого объекта
GetFirstObjectText(rest_text, out rest_text); // извлечение записи первого объекта while (!string.IsNullOrEmpty(obj _text)) //цикл до конца строки
{
BaseObject obj = BaseObject.Parse(obj _text, function); //компиляция очередного объекта if(obj == null) //проверка успешности компиляции
return function.Error("Incorrect BaseObject text: "+ obj _text); //выход по ошибке tuple. Add(obj); //добавление очередного объекта в кортеж obj_text = //переход к следующей записи объекта
GetFirstObjectText(rest_text, out rest_text);
}
return new ObjectList(tuple, function); // создание и возврат объекта ObjectList Здесь методы StartsWith, EndsWith, Substring, IsNullOrEmpty являются стандартными функциями языка Visual С# (tm). Функция StartsWith проверяет начало строки, EndsWith - проверяет конец строки, на совпадение с образцом. Функция Substring - вырезает подстроку, в данном случае освобождает входной текст от внешних скобок. Функция IsNullOrEmpty проверяет, является ли строка пустой. Метод GetFirstObjectText играет роль лексического анализатора. Этот метод вырезает из входной строки запись первого объекта в списке и возвращает во втором параметре оставшуюся строку входного текста программы. Текст этого метода является очевидным и здесь не приводится.
Компиляция для вызовов функций, то есть объектов типа 301 FunctionCall выполняется аналогичным образом. В соответствии с синтаксическим определением (6302) сначала
компилируется оператор вызова программы, а затем список параметров. В случае успеха из полученных объектов создается новый вызов функции - объект типа 301 FunctionCall. Программа компиляции для этих объектов может быть записана следующим образом:
// Класс FunctionCall статический метод Parse - компиляция объекта (6403)
// Параметр text - текстовое представление объекта
// Параметр function - объект функционального типа базы данных
// Результат - скомпилированный объект
new internal static FunctionCall Parse(string text, FunctionType function)
{
string rest_text; // объявление текстовой переменной для остатка строки
string obj_text; // объявление текстовой переменной для текста объекта
obj_text = GetFirstItemText(text, out rest_text); //извлечение записи первого объекта
BaseOperator operator = BaseOperator.Parse(obj_text, function); //компиляция оператора obj_text = GetFirstItemText(rest_text, out rest_text); //извлечение записи второго объекта
ObjectList parameters = ObjectList.BaseParse(obj_text, function); //компиляция параметров if(operator==null II parameters ==null) //проверка успешности компиляции return function.Error("Incorrect FunctionCall text: "+text); //выход по ошибке
if(operator. Count != parameters. Count) //проверка корректности количества параметров return function.Error("Incorrect fact parameters number: "+text); //выход по ошибке
return new FunctionCall //создание и возврат объекта FunctionCall
(operator, parameters, function);
}
Программы компиляции для остальных синтаксических правил (6302) являются более простыми и формируются аналогичным образом. 6.5 Структура объектов функционального типа данных
В результате компиляции программы (6303) программой - компилятором (6401) будет сгенерирована структура объектов, приведенная на Фиг. 600. В данном случае структура представляет собой иерархическое дерево объектов, принадлежащих классам, представленным на Фиг. 100-500. Связи между объектами являются экземплярами ассоциаций между классами, которые показаны на Фиг. 300.
В корне дерева находится объект 601, который принадлежит классу 301 FunctionCall. Это головной вызов функции. В объект 601 включен объект 602, который является экземпляром класса 502 Sum, и объект 603 класса 301 FunctionCall, который является единственным параметром головной функции. Объект 603 является вызовом функции с оператором, которым является объект 604 класса 503 PropertyList, и двумя параметрами. Первый параметр - объект 605, являющийся вызовом функции, а второй - объект 606 класса 201 Field. Вызов функции 605 содержит оператор - объект 607 класса 504 HierarchySubordinate и параметр - объект 608, который является последним в данной структуре вызовом функции. Вызов функции 608 содержит оператор - объект 609 класса 501 CurrentDocument, для которого параметры не предусмотрены. Таким образом, структура объектов на Фиг. 600 отражает суперпозицию вызовов функций программы (6303).
При отображении объектов на Фиг.600 указаны конкретные значения их атрибутов. В объектах класса 301 FunctionCall устанавливается используемый оператор. Значение Count в объектах типа 304 BaseOperator означает количество формальных параметров, в объектах типа 301 FunctionCall - количество фактических параметров для вызовов функций. Количество фактических и формальных параметров должно совпадать для вызова функции и применяемого в ней оператора. При построении структуры объектов это служит примером проверки корректности исходной программы в методе (6403).
6.6 Исполнение программ функционального языка
В настоящем подразделе рассматриваются примеры программных методов вызова функций для классов, представленных на Фиг. 100-500. В качестве имени метода будет использоваться InternalCall.
Для корневого абстрактного класса 102 BaseObject метод InternalCall является абстрактным. Для классов 103 BaseMetaData, 104 ObjectList, 105 BaseConst метод InternalCall является тривиальным: он возвращает в качестве результата сам объект. В классе 204 Property определение метода InternalCall должно быть перегружено. Результатом этого метода будет константа, являющаяся значением объекта класса 204 Property:
// Класс Property метод InternalCall - исполнение функции (6601) // Результат - объект, являющийся результатом исполнения функции override internal BaseObject InternalCall()
{
return Property Value; // возврат значения свойства документа
}
Для операторов функционального языка, то есть объектов класса 302 BaseOperator метод InternalCall рассчитывает результат, который является результатом конкретной функции, реализованной в классе.
Для класса 502 Sum, объекты которого играют роль математической функции,
рассчитывающей сумму элементов множества, метод InternalCall может выглядеть следующим образом:
// Класс Sum метод InternalCall - исполнение функции (6602) // Результат - объект, являющийся результатом исполнения функции
override internal BaseObject InternalCall()
{
ObjectList const_list = //извлечение первого параметра и
(ObjectList)Tuple[0]; //приведение его к типу ObjectList
if(const_list.Count == 0) //проверка, является ли список пустым
return new MoneyConst(0, Function); //возврат нулевой константы
BaseConst result = (BaseConst)const_list.Tuple[0] ; //извлечение первой константы из списка for (int i = 1 ; i < const_list.Count; i++) //цикл со второй константы до конца списка
result = result.Addition //добавление к результату
((BaseConst) const_list.Tuple[i]); // очередной константы
return result; // возврат результата
}
Оператор Sum имеет один параметр. Конструкция Tuple [0] извлекает этот параметр из базового объекта типа 104 ObjectList и присваивает его переменной const_list, которая таким образом будет содержать заданное множество констант. Далее выполняется цикл с вызовом функции сложения Addition. Причем в зависимости от типа констант, будет вызываться функция сложения класса 401 MoneyConst или 402 IntegerConst. Результатом метода InternalCall будет объект, представляющий сумму констант заданного множества соответствующего типа. Если множество констант пусто, результатом функции будет, в данном случае, нулевое значение константы типа 401 MoneyConst.
Для класса 501 CurrentDocument, объекты которого играют роль оператора, возвращающего текущий документ, метод InternalCall записывается следующим образом: // Класс CurrentDocument метод InternalCall - исполнение функции (6603) // Результат - объект, являющийся результатом исполнения функции
override internal BaseObject InternalCall()
{
//возврат текущего документа из объекта функционального типа базы данных
return Function.CurrentDocument;
}
Данный метод возвращает объект, являющийся текущим документом, который находится в объекте функционального типа данных базы данных. Информация о текущем документе заносится в объект функционального типа данных при внешнем вызове функциональной программы (раздел 5.9).
Для объектов - операторов, которые обращаются с запросами к базе данных, метод
InternalCall является оболочкой вызова хранимой процедуры базы данных из среды
инструментального языка. Среди классов - операторов, показанных на Фиг. 500, два класса определяют операторы, обращающиеся к базе данных: это класс 503 PropertyList и класс 504 Hierarchy Subordinate. Методы вызова запрограммированной в классах функции реализуются в них одинаковым образом. В качестве примера рассматривается метод InternalCall для оператора 504 Hierarchy Subordinate :
// Класс HierarchySubordinate метод InternalCall - исполнение функции (6604) // Результат - объект, являющийся результатом исполнения функции
internal override BaseObject InternalCall()
{
// установление связи с базой данных
using (SqlConnection conn = new SqlConnection( "context connection = true"))
{
using (SqlCommand cmd = conn.CreateCommand())// создание команды базы данных
{
conn.Open(); // открытие связи с базой данных
cmd.CommandText = "Management.HierarchySubordinates"; //установка имени команды cmd.CommandType = CommandType.StoredProcedure; //тип команды - хранимая процедура SqlParameter parameter = cmd.CreateParameter(); //создание параметра
parameter. ParameterName = " @Id"; //ввод имени параметра
parameter.DbType = DbType.Int32; //ввод типа параметра - целое число
parameter.Direction = ParameterDirection.Input; //указание, что параметр является входным parameter.Value = ((Document)this[0]).ld; //присваивание значения параметра - Id документа cmd.Parameters.Add(parameter); // включение параметра в список параметров SqlDataReader reader = cmd.ExecuteReader(); // вызов хранимой процедуры в базе данных ObjectList result = new ObjectList(); //объявление переменной для результата while (reader. Read()) //цикл по всем элементам входного потока из базы данных
{
int id = reader.GetInt32(0); //считывание значения из первого столбца очередной записи Document doc = new Document(id,Function); //создание документа с заданным Id result.Tuple.Add(doc); //добавление документа в результирующий список
}
return result; //возврат результата
}
}
}
Используемые в этой программе классы SqlConnection, SqlCommand, SqlDataReader являются стандартными классами в библиотеке Visual C#(tm). В приведенном методе сначала устанавливается соединение с базой данных conn, затем формируется команда базы данных cmd. Далее указывается имя команды Management.HierarchySubordinates, тип команды как хранимой процедуры. После чего создается параметр хранимой процедуры с именем @Id, типом Int32, направлением использования - ввод, и величиной, которая равна ключевому номеру документа из первого параметра в списке параметров оператора. Сформированный параметр добавляется в список параметров хранимой процедуры, после чего команда запускается на исполнение.
Результатом процедуры Management.HierarchySubordinates будет поток данных, представляющий таблицу с единственным столбцом, содержащим ключевые номера документов, которые иерархически подчинены данному документу. В заключении, в методе InternalCall полученные номера последовательно в цикле считываются из потока, и формируется объект типа 104
ObjectList, состоящий из документов с полученными ключевыми номерами.
Вызываемая в данном методе хранимая процедура базы данных
Management.HierarchySubordinates может иметь следующий вид на языке SQL(tm):
— Схема базы данных Management хранимая процедура HierarchySubordinate (6605)
— Параметр @Id - ключевой номер документа
CREATE PROCEDURE [Management]. [HierarchySubordinate]
@ Id INT
AS
SELECT [Id] FROM [Management]. [Task] — выборка полей Id из таблицы Task для документов,
WHERE [ParentTaskld] = @Id — у которых родительский документ совпадает с заданным RETURN 0 — выход с кодом успешности исполнения В данной хранимой процедуре производится выборка ключевых номеров тех задач, для которых ключевой номер родительской задачи равен заданному номеру.
При этом таблица Task , к которой обращается программа, в минимальном определении записывается следующим образом:
— Схема базы данных Management таблица Task (6606)
CREATE TABLE [Management]. [Task]
(
[Id] INT NOT NULL PRIMARY KEY, -ключевой номер
[Cost] MONEY NULL, -стоимость
[ParentTaskld] INT NULL, —ключевой номер родительской задачи
[Function] [Management]. [FunctionType] NOT NULL, —объект функционального типа данных CONSTRAINT [FK_Task] FOREIGN KEY ([ParentTaskld]) -связь номера родительской
REFERENCES [Management]. [Task]([Id]) — задачи с номером текущей задачи
)
В таблице (6606) иерархия документов организована с помощью ссылок на родительский документ: CONSTRAINT [FK_Task] . Метод, с помощью которого организована иерархия документов в данном примере, не влияет на построение функциональной программы.
Особенности метода учитываются только в хранимой процедуре, которая выполняет обработку иерархических связей.
В определении таблицы также продемонстрировано хранение функциональных программ в базе данных. В данном случае функциональные программы хранятся под пользовательским типом данных [Management]. [FunctionType], который в инструментальном языке определяется типом данных 101 FunctionType.
Центральным узлом для организации суперпозиции функций является метод расчета результата функции для класса 301 FunctionCall:
// Класс FunctionCall метод InternalCall - исполнение функции (6607) // Результат - объект, являющийся результатом исполнения функции
override internal BaseObject InternalCall()
{
for (int i = 0; i < Count; i++) // цикл по всем объектам списка параметров
Operator.Tuple[i] = // присвоение очередному формальному параметру
Tuple[i] .InternalCall() ; // результата исполнения фактического параметра return Operator. InternalCall (); // вызов на исполнение оператора и возврат результата В данном примере сначала вычисляются и заполняются параметры оператора, после чего оператор вызывается на исполнение. Если в числе параметров объекта 301 FunctionCall есть другие вызовы функций, то они будут обрабатываться рекурсивно до конечных объектов, для которых метод InternalCall возвращает сам объект. Таким образом, рассчитывается суперпозиция функций произвольной глубины.
6.7 Декомпиляция программ функционального языка
В данном подразделе приведены варианты основных программных методов декомпиляции для классов, представленных на Фиг.100-500. Имя программного метода, переводящего объект в текстовую форму - ToString. Одноименный метод является стандартным в инструментальном языке Visual C#(tm) для получения текстового представления объектов.
Метод ToString для абстрактного класса 102 BaseObject является абстрактным. Для структурных объектов метод ToString вызывает одноименный метод для вложенных объектов. Например, для класса 301 FunctionCall данный метод может быть записан следующим образом:
// Класс FunctionCall метод ToString - декомпиляция (6701) // Результат - текстовое представление объекта
override public string ToStringO
{
return Operator.ToStringO + // конкатенация текста оператора
base.ToString(); // и списка параметров
} ·
Здесь выполняется конкатенация двух строк: записи оператора и текстового представления базового объекта типа 104 ObjectList, который играет роль списка параметров для данного функционального вызова.
Для класса 104 ObjectList метод ToString может быть записан следующим образом:
// Класс ObjectList метод ToString - декомпиляция (6702) // Результат - текстовое представление объекта
override public string ToStringO
{
string str = string.Empty; // объявление строки для формирования результата for (int i = 0; i < Count; i++) // цикл по всем объектам списка
{
str += Tuple[i].ToString(); // добавление в строку текста очередного объекта if (i < Count - 1) str += "," // добавление разделителя после объекта кроме последнего
} return "("+ str +")"; // возврат текстового списка в скобках
} ·
В результате работы данной программы будет получен список из текстовых представлений объектов, заключенных в объекте 104 ObjectList, разделенных запятыми, и заключенный в круглые скобки.
Методы декомпиляции для остальных классов являются более простыми, по сути, они выводят в качестве результата текстовое представление своих атрибутов.
В целом, при вызове метода ToString для головного объекта, представленного на Фиг. 600, будет получена строка (6303). То есть пользователь, работающий с системой, всегда может видеть актуальное текстовое представление программ, хранящихся в таблицах базы данных.
6.8 Перевод в бинарное представление
В приводимых ниже примерах в качестве дескриптора, указывающего на класс
записываемого объекта, используется наименование класса. Имена программных методов записи и считывания в примерах являются стандартными для аналогичных программ в среде
инструментального языка Visual C#(tm): это Write и Read.
Метод Write каждого класса, прежде всего, вызывает этот же метод для базового класса, затем записывает дескриптор класса и после этого атрибуты класса. Для корневого класса 102 BaseObject метод Write может быть записан следующим образом:
// Класс BaseObject метод Write - запись в бинарное представление (6801)
// Параметр w - бинарный поток записи
internal virtual void Write(System.IO.BinaryWriter w)
{
string type_name = GetType().Name; //получение имени класса текущего объекта w.Write(type_name); //запись имени класса текущего объекта
}
Для абстрактного класса 105 BaseConst метод Write обращается к такому же методу базового класса:
// Класс BaseConst метод Write - запись в бинарное представление (6802)
// Параметр w - бинарный поток записи
internal override void Write(System.IO.BinaryWriter w)
{
base.Write(w); //запись объекта базового класса
} Для класса 104 ObjectList метод Write выполняет цикл по объектам списка:
// Класс ObjectList метод Write - запись в бинарное представление (6803)
// Параметр w - бинарный поток записи
internal override void Write(System.IO.BinaryWriter w)
{
base.Write(w); // запись объекта базового класса
w.Write(Count); // запись количества объектов в списке
for (int i = 0; i < Count; i++) // цикл по всем объектам списка
Tuple [i].Write(w); // запись очередного объекта списка
}
Здесь после вызова метода Write базового класса, записывается величина, указывающая на количество элементов в структуре, далее в цикле последовательно записываются все элементы структуры.
Для класса 301 FunctionCall метод Write является достаточно простым:
// Класс FunctionCall метод Write - запись в бинарное представление (6804)
// Параметр w - бинарный поток записи
internal override void Write(System.IO.BinaryWriter w)
{
base.Write(w); // запись объекта базового класса
Operator .Write(w); // запись оператора вызова функции
}
В данном методе вначале выполняется метод Write базового класса 104 ObjectList, в рамках которого записывается список параметров. Затем записывается оператор вызова функции.
Для остальных классов метод Write является еще более простым и записывается
аналогичным образом.
Статический метод Read для корневого класса 102 BaseObject считывает дескриптор класса и, используя его как переключатель, вызывает аналогичный метод соответствующего класса:
// Класс BaseObject метод Read - чтение из бинарного представления (6805) // Параметр г - бинарный поток чтения
// Параметр function - объект функционального типа базы данных
internal static BaseObject Read(System.IO.BinaryReader r, FunctionType function)
{
string type_name = r.ReadString(); // считывание имени класса
switch (type_name) // выбор варианта по имени класса { // чтение и возврат объекта указанного типа
case "ObjectList": return ObjectList.Read(r, function);
case "Field": return Field.Read(r, function);
case "Property": return Property.Read(r, function);
case "Document": return Document.Read(r, function);
case "FunctionCall": return FunctionCall.Read(r, function);
case "MoneyConst": return MoneyConst.Read(r, function);
case " Inter gerConst": return IntergerConst.Read(r, function);
case "CurrentDocument": return CurrentDocument.Read(r, function);
case "Sum": return Sum.Read(r, function);
case "Property List": return PropertyList.Read(r, function);
case "HierarchySubordinate": return HierarchySubordinate.Read(r, function);
default: return function.Error("Incorrect BaseObject binary line."); //выход по ошибке
}
}
В данном методе осуществляется выбор класса, объект которого записан в бинарном потоке, и вызывается программный метод чтения объекта этого класса.
Метод Read для класса 104 ObjectList выполняет цикл по объектам списка:
// Класс ObjectList метод Read- чтение из бинарного представления (6806) // Параметр г - бинарный поток чтения
// Параметр function - объект функционального типа базы данных
new internal static ObjectList Read(System.IO.BinaryReader r, FunctionType function)
{
List<BaseObject> tuple = new List<BaseObject>(); //объявление пустого кортежа int Count = r.ReadInt32(); //считывание количества объектов
for (int i = 0; i < Count; i++) // цикл по всем объектам списка
{
BaseObject obj = BaseObject.Read(r, function); // считывание очередного объекта
if(obj == null) // проверка успешности считывания
return function.Error("Incorrect ObjectList binary line."); //выход по ошибке
tuple. Add(obj); //добавление объекта в кортеж
}
return new ObjectList(tuple, function);// создание и возврат результата - объекта ObjectList
}
Здесь сначала считывается количество элементов в структуре, затем организуется цикл, в котором последовательно считываются все элементы списка. Метод Read для класса 301 FunctionCall последовательно считывает список параметров и оператор:
// Класс FunctionCall метод Read - чтение из бинарного представления (6807) // Параметр г - бинарный поток чтения
// Параметр function - объект функционального типа базы данных
new internal static FunctionCall Read(System.IO.BinaryReader r, FunctionType function)
{
ObjectList parameters = ObjectList.Read(r, function); // чтение списка объектов - параметров BaseOperator operator = // чтение оператора
(BaseOperator) BaseObject.Read(r, function);
if (parameters == null II operator == null) //проверка успешности считывания return function.Error("Incorrect FunctionCall binary line."); //выход по ошибке
//создание и возврат результата - объекта FunctionCall
return new FunctionCall(operator, parameters, function);
}
Методы считывания и записи в бинарное представление для остальных классов
формируются аналогичным образом.
6.9 Формирование функционального типа данных в базе данных
В данном подразделе приводится пример программной структуры пользовательского типа данных, служащей оболочкой для функциональных программ, основанных на классах, представленных на Фиг. 100-500.
Заголовок программной структуры пользовательского типа данных формируется следующим образом:
// Определение пользовательского типа данных базы данных (6901) [Microsoft.SqlServer.Server.SqlUserDefinedType(Format.UserDefined)]
// Пользовательский тип данных Function
public struct Function:
INullable, // интерфейс для неопределенного значения в базе данных
IBinarySerialize // интерфейс для приведения в бинарную форму
{
BaseObject FunctionProgram; // головной объект функциональной программы
Document CurrentDocument; // текущий документ базы данных
string ErrorMessage; // диагностическое сообщение
public bool IsNull; // флаг неопределенного значения
[SqlMethod(DataAccess = DataAccessKind.Read)] //определение метода для вызова из базы данных public object Call(SqlInt32 CurrentDocId); //метод вызова функциональной программы
[SqlMethod(OnNullCall = false)] //определение метода для вызова из базы данных public bool IsValid(); // метод проверки корректности функциональной программы
[SqlFunction()] // определение функции для вызова из базы данных
public SqlString GetErrorMessage(); //функция получения диагностического сообщения
[SqlMethod(DataAccess = DataAccessKind.Read)] //определение метода для вызова из базы данных public static Function Parse(SqlString SqlString); //метод компиляции
public override string ToStringO; //метод де компиляции
public void Read(System.IO.BinaryReader г); //метод чтения из бинарного представления public void Write(System.IO.BinaryWriter w); //метод записи в бинарное представление internal BaseObject Error( string message); // метод записи диагностического сообщения
}
В данном определении указывается атрибут программной структуры инструментального языка (SqlUserDefinedType), указывающий на пользовательский тип данных (Format.UserDefined). Наименование структуры - Function. Структура имеет интерфейсы, один из которых позволяет принимать в базе данных неопределенные значения (INullable), второй - записываться в бинарное представление (IBinarySerialize). В качестве членов структуры определены сама функциональная программа, то есть ее головной объект (FunctionProgram), текущий документ и строка
диагностики, для вывода ее пользователю. В числе методов присутствует метод Call для вызова функциональной программы на исполнение. Параметром метода Call является ключевой номер, идентифицирующий текущий документ. Дополнительно определены метод проверки
корректности (Is Valid), функция получения диагностики (GetErrorMessage), программный метод компиляции (Parse), функция обратной компиляции (ToString), методы записи в бинарную форму и считывания из бинарной формы (Read и Write). Атрибуты программных методов в
инструментальном языке (SqlMethod и SqlFunction) обеспечивают возможность вызова этих методов из среды сервера базы данных.
Метод вызова функциональной программы Call записывается следующим образом:
// Структура Function метод Call - вызов функциональной программы (6902) // Параметр CurrentDocId - целое число базы данных - ключевой номер текущего документа // Результат - значение, вычисленное в ходе выполнения функциональной программы
public object Call(SqlInt32 CurrentDocId)
{
// занесение текущего документа в структуре Function
CurrentDocument = new Document(CurrentDocId. Value, this);
// внутренний вызов функциональной программы
BaseConst result = (BaseConst)FunctionProgram.InternalCall(); return result. Value; // возвращение результата
}
Здесь сначала устанавливается текущий документ в атрибуте структуры CurrentDocument. Это значение используется в дальнейшем в операторе функционального языка 501
CurrentDocument. Затем вызывается метод InternalCall для головного объекта программы функционального языка (FunctionProgram). Результатом метода является значение константы общего типа object. При вызове из среды сервера базы данных будет получена константа в универсальном типе sql_variant.
Остальные методы структуры пользовательского типа данных являются простыми: по сути, они представляют оболочки для вызова соответствующих методов головного объекта
функциональной программы FunctionProgram. В качестве примера, приводятся определения программных методов компилятора и декомпилятора структуры пользовательского типа данных:
// Структура Function метод Parse - компиляция объекта функционального типа (6903)
// Параметр str- строка базы данных - текст программы
// Результат - объект пользовательского типа данных
public static Function Parse(SqlString str)
{
FunctionType function = new Function(); //создание нового объекта функционального типа function. FunctionProgram = // компиляция текста и присваивание головного
BaseObject.Parse(str.Value, function); // объекта функциональной программы
return function; // возврат результата
}
// Структура Function метод ToString - декомпиляция объекта функционального типа (6904) // Результат - текст программы
public override string ToStringO
{
//вызов декомпиляции функциональной программы и возврат текста программы
return FunctionProgram. ToStringO;
}
Программные методы для чтения программной структуры функционального типа данных из бинарного представления и записи в бинарное представление формулируются следующим образом:
// Структура Function метод Read - чтение объекта из бинарного представления (6905) // Параметр г - бинарный поток на чтение
public void Read(System.IO.BinaryReader г) {
// Чтение структуры объектов функциональной программы из бинарного потока
FunctionProgram = BaseObject.Read(r, this);
// Чтение текущего документа из бинарного потока
CurrentDocument = (Document)BaseObject.Read(r, this);
// Чтение диагностического сообщения из бинарного потока
ErrorMessage = r.ReadString();
}
// Структура Function метод Write - запись объекта в бинарное представление (6906) // Параметр w - бинарный поток на запись
public void Write(System.IO.BinaryWriter w)
{
// Запись структуры объектов функциональной программы в бинарный поток
FunctionProgram. Write(w) ;
// Запись текущего документа в бинарный поток
CurrentDocument. Write(w) ;
// Запись диагностического сообщения в бинарный поток
w.Write(ErrorMessage) ;
}
Методы компиляции и преобразования в бинарное представление вызываются в процедурах базы данных автоматически при преобразовании типов данных и записи объектов в таблицы базы данных. Например, в следующем фрагменте кода на языке SQL(tm) декларируется переменная с функциональным типом данных и производится компиляция программы на функциональном языке с присвоением результата этой переменной. Затем, если компиляция прошла успешно, в таблицу Task заносятся функциональные программы. В противном случае выводится диагностика:
— Объявление строки и присвоение ей текста программы (6907) DECLARE @FunctionText nvarchar(lOO) =
'Sum(PropertyList(HierarchySubordinates(CurrentDocument()),Management.Task.Cost))'
— Преобразование строки в объект функционального типа данных
DECLARE ©Function [Management]. [Function] = CAST(@FunctionText AS [Management]. [Function] )
IF @Function.IsValid() = 1— проверка корректности программы
UPDATE [Management]. [Task] SET [Function] = ©Function— занесение в таблицу функции ELSE Print @Function.GetErrorMessage() — вывод сообщения об ошибке
В результате выполнения этого фрагмента в таблицу Task будет занесена
откомпилированная бинарная форма программы (6303). В данном примере во все строки таблицы заносится одна и та же функция. В реальности возможны разные варианты использования различных алгоритмов для различных типов задач, создания связанных таблиц для хранения программ обработки и. т. п.
Внутренний программный метод Error используется внутри классов функционального языка для записи сообщений об ошибках. Внешний метод - функция IsValid проверяет наличие сообщений об ошибках и возвращает соответствующий флаг в вызывающую процедуру.
// Структура Function метод Error - запись диагностического сообщения (6908)
// Параметр message - диагностическое сообщение
// Результат - неопределенный объект функциональной программы
public BaseObject Error(string message)
{
ErrorMessage += message + "\n"; //добавление новой строки сообщения об ошибке
return null; // возвращение неопределенного значения
}
// Структура Function метод IsValid - флаг корректности (6909)
// Параметр message - диагностическое сообщение
// Результат - флаг корректности
public bool IsValid()
{
// наличие диагностического сообщения свидетельствует об ошибке
return string.IsNullOrEmpty(ErrorMessage);
}
Внутри метода обработки ошибок могут также генерироваться события, которые будут передаваться на обработку на уровне сервера базы данных или бизнес - приложения.
Структуру пользовательского типа данных для функционального языка программирования можно назвать стандартной: она практически не зависит от вида функционального языка. При этом необходимо отметить, что в одной базе данных может использоваться произвольное количество функциональных типов данных, реализующих свои функциональные языки программирования .
6.10 Использование программ функционального языка
В этом подразделе приводятся примеры использования функциональной программы в базе данных. В первом примере представлен триггер для таблицы базы данных (6606)
Management. Task, который пересчитывает значение стоимости задач, для которых изменилась функция, рассчитывающая эту стоимость: — Схема базы данных Management таблица Task триггер TriggerAfterFunctionChanged (6101)
— Обновление стоимости задачи после изменения ее функциональной программы
CREATE TRIGGER [Management]. [TriggerAfterFunctionChanged]—создание триггера
ON [Management]. [Task]— привязка к таблице Task
AFTER INSERT, UPDATE — режим инициации: после добавления или изменения строк
AS
BEGIN
IF UPDATE( [Function]) — проверка: если изменилось поле Function
UPDATE [Management]. [Task] — обновление таблицы Task
SET [Cost] = CAST([Function].[Call]([Id]) AS money) -пересчет поля Cost
WHERE [Id] in (SELECT [Id] FROM inserted) — только для измененных задач
END
Триггер (6101) выполняет обновления, если модификации подвергается данные из столбца Function таблицы (6606), то есть изменяются функциональные программы пересчета. Пересчет осуществляется только для тех задач, в которых изменились функциональные программы. Запуск функциональных программ осуществляется вызовом метода Call функционального типа данных. В качестве параметра при вызове передается ключевой номер документа - задачи. Полученная в результате вызова константа преобразуется к денежному типу и заносится в поле стоимости задач.
Следующий пример аналогичен первому, но в нем осуществляется каскадное обновление данных по всей иерархии задач.
— Схема базы данных Management таблица Task триггер Trigger AfterCostChanged (6102)
— Обновление стоимости задачи после изменения стоимости в дочерних задачах
CREATE TRIGGER [Management]. [Trigger AfterCostChanged]—создание триггера
ON [Management]. [Task]— привязка к таблице Task
AFTER INSERT, UPDATE— режим инициации после добавление или изменения строк
AS
BEGIN
IF UPDATE([Cost]) — проверка: если изменилось поле Cost
UPDATE [Management]. [Task] — обновление таблицы Task
SET [Cost] = CAST([Function].[Call]([Id]) AS money) -пересчет поля Cost
— только для тех родительских задач, у которых изменены задачи дочерние
WHERE [Id] in (SELECT DISTINCT [ParentTaskld] FROM inserted)
END
Данный триггер выполнит изменения, если модификации подверглись значения стоимостей задач. В триггере будут пересчитываться значения стоимостей только для родительских по иерархии задач, для которых изменены подчиненные - дочерние задачи. При изменении стоимости родительских задач, данный триггер сработает вновь. Рекурсия будет продолжаться до тех пор, пока все значения стоимостей в зависимых задачах не будут обновлены.
Аналогично функциональные программы могут вызываться из хранимых процедур, которые запускаются автоматически по событиям или по инициативе пользователя. Естественно вызов функциональных программ, которые реализуются на инструментальных языках
программирования, возможен также из программных приложений пользователя.

Claims

Формула изобретения СПОСОБ РАЗРАБОТКИ, ХРАНЕНИЯ И ИСПОЛЬЗОВАНИЯ КОМПИЛИРОВАННЫХ В БИНАРНОЕ ПРЕДСТАВЛЕНИЕ ПРОГРАММ В ТАБЛИЦАХ БАЗ ДАННЫХ
1. Компьютерно реализуемый способ, заключающий в себе:
способ формирования компьютерных программ, обеспечивающих вычисления на множестве данных базы данных;
хранение упомянутых программ в бинарном представлении в таблицах базы данных наряду со всеми данными;
вызов на исполнение упомянутых программ.
2. Способ по п.1, в котором упомянутые программы обеспечивают запросы к базе данных для извлечения исходных данных для вычислений, операции над множествами данных, а также необходимые математические операции для расчета требуемых результатов.
3. Способ по п.2, в котором упомянутые программы предоставляют следующие
возможности:
расчет новых значений данных в базе данных;
определение корректности функционально связанных данных в базе данных;
преобразование упомянутых программ в бинарном представлении обратно в текстовую форму для анализа и модификации;
контроль ошибок и диагностику.
4. Способ по п.З, в котором упомянутые программы могут формироваться на языке
программирования высокого уровня функционального типа.
34
ЗАМЕНЯЮЩИЙ ЛИСТ (ПРАВИЛО 26)
PCT/RU2017/050130 2017-03-31 2017-12-27 Способ разработки, хранения и использования компилированных в бинарное представление программ в таблицах баз данных WO2018182454A1 (ru)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
RU2017111039 2017-03-31
RU2017111039A RU2666287C1 (ru) 2017-03-31 2017-03-31 Способ разработки, хранения и использования компилированных в бинарное представление программ в таблицах баз данных

Publications (1)

Publication Number Publication Date
WO2018182454A1 true WO2018182454A1 (ru) 2018-10-04

Family

ID=63459924

Family Applications (1)

Application Number Title Priority Date Filing Date
PCT/RU2017/050130 WO2018182454A1 (ru) 2017-03-31 2017-12-27 Способ разработки, хранения и использования компилированных в бинарное представление программ в таблицах баз данных

Country Status (2)

Country Link
RU (1) RU2666287C1 (ru)
WO (1) WO2018182454A1 (ru)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20200242420A1 (en) * 2019-01-29 2020-07-30 Canon Kabushiki Kaisha Information processing apparatus, information processing method, and storage medium for classifying object of interest

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7797304B2 (en) * 2006-03-20 2010-09-14 Microsoft Corporation Extensible query language with support for rich data types
RU2515565C1 (ru) * 2012-10-22 2014-05-10 Закрытое акционерное общество Научно-производственное предприятие "Реляционные экспертные системы" Способ обновления структурированных данных в системе управления реляционными базами данных
EA201500340A1 (ru) * 2015-01-22 2016-07-29 Кирилл Андреевич Сурков Система управления базой данных

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6993534B2 (en) * 2002-05-08 2006-01-31 International Business Machines Corporation Data store for knowledge-based data mining system
RU2526753C1 (ru) * 2013-06-20 2014-08-27 Закрытое акционерное общество Научно-производственное предприятие "Реляционные экспертные системы" Способ восстановления данных в системе управления базами данных

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7797304B2 (en) * 2006-03-20 2010-09-14 Microsoft Corporation Extensible query language with support for rich data types
RU2515565C1 (ru) * 2012-10-22 2014-05-10 Закрытое акционерное общество Научно-производственное предприятие "Реляционные экспертные системы" Способ обновления структурированных данных в системе управления реляционными базами данных
EA201500340A1 (ru) * 2015-01-22 2016-07-29 Кирилл Андреевич Сурков Система управления базой данных

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20200242420A1 (en) * 2019-01-29 2020-07-30 Canon Kabushiki Kaisha Information processing apparatus, information processing method, and storage medium for classifying object of interest
US11526709B2 (en) * 2019-01-29 2022-12-13 Canon Kabushiki Kaisha Information processing apparatus, information processing method, and storage medium for classifying object of interest
US20230068272A1 (en) * 2019-01-29 2023-03-02 Canon Kabushiki Kaisha Information processing apparatus, information processing method, and storage medium for classifying object of interest
US11823451B2 (en) 2019-01-29 2023-11-21 Canon Kabushiki Kaisha Information processing apparatus, information processing method, and storage medium for classifying object of interest

Also Published As

Publication number Publication date
RU2666287C1 (ru) 2018-09-06

Similar Documents

Publication Publication Date Title
Schordan et al. A source-to-source architecture for user-defined optimizations
US6370681B1 (en) Computer system and computer implemented process for representing software system descriptions and for generating executable computer programs and computer system configurations from software system descriptions
US7890928B2 (en) Mechanism and system for representing and processing rules
CN101334728B (zh) 一种基于xml文档描述的界面生成方法和装置
US8826225B2 (en) Model transformation unit
Yi POET: a scripting language for applying parameterized source‐to‐source program transformations
Said et al. A method of refinement in UML-B
Atkinson et al. Data types and persistence
CN101315601A (zh) 用于管理资源的系统和方法
CN115757462B (zh) 一种面向对象的数据库动态接口生成方法及操作方法
Ballantyne et al. Macros for domain-specific languages
Mey et al. Continuous model validation using reference attribute grammars
WO2018182454A1 (ru) Способ разработки, хранения и использования компилированных в бинарное представление программ в таблицах баз данных
Cutts Delivering the benefits of persistence to system construction and execution
KR102614967B1 (ko) 자바스크립트의 중간 언어 기반 의미론 추출 자동화 시스템 및 방법
CN114816356A (zh) 基于接口文档生成http请求代码的系统及方法
CN113608748A (zh) C语言转换Java语言的数据处理方法、装置及设备
Weng DeepSpec: Modular Certified Programming with Deep Specifications
JP7059757B2 (ja) Api処理方法、端末、api処理プログラム
Neeraj et al. A domain specific language for business transaction processing
Sanchez et al. Runtime translation of OCL-like statements on Simulink models: Expanding domains and optimising queries
Tuong et al. Isabelle/C
CN114675831B (zh) 一种编程语言的编译系统及方法
Gargantini et al. Metamodelling a formal method: applying mde to abstract state machines
CN115185526B (zh) 一种能够逆向推理的编程语言的编译系统及方法

Legal Events

Date Code Title Description
121 Ep: the epo has been informed by wipo that ep was designated in this application

Ref document number: 17903703

Country of ref document: EP

Kind code of ref document: A1

NENP Non-entry into the national phase

Ref country code: DE

122 Ep: pct application non-entry in european phase

Ref document number: 17903703

Country of ref document: EP

Kind code of ref document: A1