Дмитрий Шуклин  
Научные исследования и Программная архитектура  
 
[English] ГлавнаяПродуктыКибернетикаИнформатикаФилософия
 
Главная
Партнеры
Продукты
Статьи
Форум
Фотоальбом
 

ТЗ на операционное ядро V1.05.00 (2005.05.22)

 

Введение

Реализация нейронной сети на последовательной вычислительной машине требует разработки виртуальной машины. К эффективности языка реализации ядра виртуальной машины эмулирующей нейронную сеть с несколькими сотнями тысяч эмулируемых нейронов предъявляются повышенные требования. В результате, единственным кандидатом в качестве языка программирования для такой системы становится generic C (но уже не C++). Ядро необходимо разработать учитывая современные компонентные технологии. В противном случае будет невозможно реализовать полиморфное взаимодействие различных модулей ядра и динамическое изменение связей между ними. Существующие промышленные реализации компонентной идеологии, например Microsoft COM, слишком громоздки для применения в виртуальной машине, эмулирующей нейронную сеть требуемых размеров. Неэффективность COM в первую очередь связанна с необходимостью выполнять множество команд сравнения GUID при  каждом вызове QueryInterface. В качестве компонентной архитектуры для реализации виртуальной машины семантической нейронной сети предлагается применить оригинальную разработку. Основное отличие предлагаемой архитектуры – отсутствие необходимости вызова QueryInterface и поиска нужного интерфейса по значению GUID. В условиях ядра виртуальной машины можно определить время жизни любого внутреннего объекта на этапе разработки. Поэтому в предлагаемой архитектуре отсутствует подсчет ссылок на объекты. Благодаря отсутствию подсчета ссылок увеличивается производительность ядра. Указатель на объект представляет собой указатель на структуру с данными объекта, а не на интерфейс. Этим обеспечивается отсутствие необходимости приведения указателя на объект к различным типам при множественном наследовании интерфейсов. Для описателя классов применяется специализированный диалект языка XML-IDL. На его основе генерируется прототипы объектов и прототипы методов.

 

XML-IDL позволяет описывать объектную модель приложения. Категория представляет собой описание множества всех интерфейсов поддерживаемых классами данной категории. Категория может включать любое количество интерфейсов. Интерфейс может принадлежать только одной категории. Каждый класс может принадлежать только одной категории. Допускается одиночное наследование классов. Допускается множественное наследование интерфейсов. Класс может реализовывать любое количество интерфейсов той категории которой он принадлежит. Классы не принадлежащие категории являются структурами данных без itbl/vtbl.

 

Метаконтексты.

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

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

ВАЖНО: Информация из метаконтекста не может быть обработана в программном коде, однако есть возможность обработки этой информации на этапе компиляции.


Синтаксис

IDL

XML-IDLОбеспечивает описание модели интерфейсов с помощью языка XML

Пример IDL

<include file=""/>
<typedef name=" " type=" "/>
<interface name="" comment="">
    <inherits name=""/>

    <method name="" type="" comment="">
        <parameter name="" type="" vector="" comment=""/>
    </method>
</interface>

<category name="" type="" comment="">
    <interface name=""/>
</category>

описание IDL

IDL Обеспечивает следующие возможности:

<include file=""/> - Включает дополнительный файл IDL для обработки. В аттрибуте "file" задается путь к файлу. Может использоваться для разделения одного большого XML на несколько разных.

<typedef name=" " type=" "/>- Определяет тип при генерации хеадера на языке C. Транслируется в конструкцию :
typedef name type;

Для описателя интерфейсов применяется следующая конструкция:

<interface name="" comment=""> - Описывает интерфейс. В child nodes описываются методы и их параметры.
Атрибут "name" описывает имя интерфейса.
Атрибут "comment" содержит комментарий к текущему интерфейсу. Данный атрибут не обязателен к инициализации.


 Имеется возможность множественного наследования интерфейсов.

<inherits name=""/> - Узел "inherits" содержит имя интерфейса от которого был порожден данный интерфейс. В общем случае допускается множественное наследование интерфейсов.

 

<method name="" type="" comment=""> - Описывает метод интерфейса. В child nodes описываются параметры текущего метода.
Атрибут "name" описывает имя метода.
Атрибут "type" описывает тип значения, возвращаемого методом.
Атрибут "comment" содержит комментарий к текущему методу. Данный атрибут не обязателен к инициализации.

<parameter name="" type="" vector="" comment=""/> - Описывает параметр метода.
Атрибут "name" описывает имя параметра.
Атрибут "
type" описывает тип значения, передаваемого в параметр.
Атрибут "
vector" описывает способ передачи параметра: out, ref или val. В будущем, возможно, через запятую будут вводится и другие аттрибуты, например, in/out/ret
Атрибут "
comment" содержит комментарий к текущему параметру. Данный атрибут не обязателен к инициализации.

 

Категории объектов.

Категория объектов объединяет некоторое множество классов объектов которые потенциально могут поддерживать некоторое множество интерфейсов. Множество интерфейсов которое могут поддерживать объекты категории будем называть множеством(группой) интерфейсов категории.

<category name="" type="" comment=""> - Описывает категорию объектов. в child nodes описываются интерфейсы, входящие в категорию. Порядок описания интерфейсов соответствует порядку вхождения указателей на интерфейсы в структуре категории itbl.
Атрибут "name" описывает имя категории.
Атрибут "type" имя типа которое будет присвоено объектам этой категории.
Атрибут "comment" содержит комментарий к текущей категории. Данный атрибут не обязателен к инициализации.

<interface name=""/> - Указывает, что интерфейс с именем "name" входит в  данную категорию.

Замечание: для обеспечения более тесной интеграции с С без использования возможности приведения типов С++ возможность вхождения одного интерфейса в разные категории отменяется до обнаружения workaround.

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

  • В нашем метаконтексте примем постулат о том, что любой класс может быть членом не более одной категории.
  • В нашем метаконтексте примем постулат о том, что любой интерфейс может быть членом не более одной категории.

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

ODL

для описателя классов объектов применяется специализированный XML

на его основе генерируется хеадер объектов и прототипы методов.

пример ODL:

<include file=""/>
<class name="" category="" inherits="" comment="">
    <interface name="">
        <method name="" target=""/>
    </interface>
    <interface name="" target=""/>
    <member name="" type="" comment=""/>
    <method name=" " type=" " modifier=" " comment="">
        <parameter name=" " type=" " vector="val" comment=""/>
    </method>
</class>

 

описание ODL

<include file=""/> - Включает дополнительный файл IDL для обработки. В атрибуте "file" задается путь к файлу. Может использоваться для разделения одного большого XML на несколько разных.

 <class name="" category="" inherits="" comment=""> - Описывает класс объекта.
Атрибут "name" - Имя класса
Атрибут "
category" - Имя категории

Атрибут "inherits" - Зарезервирован для одиночного наследования классов. На первом этапе поддержка не обязательна.
Атрибут "
comment" содержит комментарий к текущему классу. Данный атрибут не обязателен к инициализации.

<interface name="">
<interface name="" target=""/>
- Показывает что данный класс реализует интерфейс с именем "name"
Атрибут "name" - Имя реализуемого интерфейса
Атрибут "target" - Имя интерфейса, с помощью которого производится реализация текущего интерфейса. Интерфейс, указанный в этом атрибуте должен быть наследником текущего(Атрибут "name") интерфейса.

<method name="" modifier=""  target=""/> - Показывает что данный класс реализует метод "name" с помощью функции "target". Modifier определяет видимость метода для внешнего кода.

Shared – означает, что данный метод может быть включен в различные классы. Следовательно не требуется приведение параметра VNPIOBJECT _object к конкретному типу класса, который реализует данный метод.

Import – означает что данный метод уже реализован в другом классе как Shared метод. В данном классе достаточно включить указатель на функцию реализующую данный методы в таблицу vtbl. Генерировать шаблон метода не нужно.

Public – данный метод доступен для прямого обращения внешнего кода. Его определение включается в основной хеадер при генерации.

"" – Пустое значение по умолчанию. Означает Private доступ к методу. Определение генерируется в файле *.f

<member name="" type="" comment=""/> - описывает член класса (переменную)

Атрибут "name" - Имя переменной
Атрибут "
type" - Тип переменной
Атрибут "
comment" содержит комментарий к текущему члену. Данный атрибут не обязателен к инициализации.


На основе ODL генерируется реализация структур категорий и интерфейсов, а также генерируются прототипы функций, реализующих методы интерфейсов.

 FDL

<function name="method_target" comment="" [type=""]>

   [<parameter name="" type="" vector="" comment=""/>]
    <local name="" type="" comment=""/>

</function>

<function name="method_target" comment=""> - Описывает функцию, реализуемую классом.

    <local name="" type="" comment=""/> - Описывает локальную переменную в функции.

 

 

Реализация

 

Среда разработки виртуальной машины должна обеспечивать максимальный комфорт программисту. Поэтому разбор IDL|ODL реализуется на языке C# для платформы Microsoft .NET. В процессе синтаксического разбора анализируется содержимое DOM-XML и на его основе формируется объектная модель IDL путем создания и инициализации объектов. После построения объектной модели IDL на ее основе формируются исходные тексты прототипов функций на языке C.

Для категории, класса, интерфейса, метода, параметра создаются специальные классы в который в качестве property хранятся значения соответствующих атрибутов XML. Классы контейнеры (категория, класс, интерфейс, метод) имеют в качестве своих членов коллекции объектов соответствующих дочерним Node. Коллекции адресуют свои члены с помощью текстовых ключей, соответствующих именам этих членов. В процессе парсинга анализируется содержимое DOM-XML и на его основе формируется объектная модель IDL|ODL путем создания и инициализации объектов. Вторым проходом, на основе созданной объектной модели формируются файлы хеадеров(.h, .f) и реализации (.c, .i)

В случае обработки IDL на основе файла XML-IDL заданного первым параметром в командной строке парсер формирует выходной хеадер файл, заданный в качестве второго параметра командной строки. В хеадер файл помещаются определения структур категорий и интерфейсов. Так же помещаются константы IID интерфейсов и хелперы вызова методов интерфейсов.

В случае обработки ODL на основе файла XML-ODL формируется хеадер файл описания классов объектов, файл реализации itbl и vtbl классов объектов, а также файл реализации прототипов методов (опционально - в зависимости от параметров командной строки).

Генерируемый код:

Реализация категории; 

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

__size – размер класса в байтах. Позволяет автоматизировать процесс создания instance класса по указателю на его ITBL.
 __
base – указатель на ITBL родительского класса. Позволяет вызывать методы базового класса из переопределенных виртуальных методов текущего класса.
__
init – конструктор объекта. В системе VNPI V3.0 вызов конструктора не гарантируется.
__
kill – деструктор объекта. В системе VNPI V3.0 вызов деструктора не гарантируется.

структура категории именуется  _itbl_<Name_of_Category>

например

typedef struct _itbl_SystemObject {
    const VNPINUMBER __size;
    const VNPICLSREF __base;
   VNPIRESULT ( __VNPI_CALLTYPE __VNPI_PTR __init )( VNPIOBJECT __VNPI_VAL Object );
   VNPIRESULT ( __VNPI_CALLTYPE __VNPI_PTR __kill )( VNPIOBJECT __VNPI_VAL Object );
    const _vtbl_ILockCount __VNPI_PTR ILockCount;
    const _vtbl_I1_Obtain __VNPI_PTR I1_Obtain;
    const _vtbl_I1_Update __VNPI_PTR I1_Update;
} _itbl_SystemObjects;

Структура категории определяется при генерации IDL. По описателю IDL генерируется описание категории и входящих в нее интерфейсов. результатом является хеадер файл со структурами категорий и интерфейсов. Реализация категории определяется при генерации ODL для каждого класса.


Каждый объект своим первым элементом имеет структуру, называемую корень объекта, определяющую его категорию. Эта структура определяет принадлежность объекта к его категории на уровне метаконтекста.
эта структура имеет в себе один элемент - переменную itbl с указателем на структуру itbl категории объекта.

структура корня именуется _root_<Name_of_Category>

например

 typedef struct _root_SystemObject {
    _itbl_SystemObject __VNPI_PTR itbl;
} _root_SystemObject;


Интерфейсы

Интерфейс представляет собой структуру, содержащую список указателей на методы реализованные в объекте.

данная структура именуется _vtbl_<Name_of_Category>

например для интерфейса

<interface name="IStream" comment="">
 <method name="Obtain" type="VNPIRESULT" comment="Reads Data from stream">
  <parameter name="Handle" type="VNPIHANDLE" vector="byval" comment="Handle(id) of stream"/>
  <parameter name="Offset" type="VNPIOFFSET" vector="byval" comment="Data offset within stream"/>
  <parameter name="Length" type="VNPIOFFSET" vector="byval" comment="Leangth of transfering data block"/>
  <parameter name="Buffer" type="VNPIMEMORY" vector="byref" comment="Pointer to destination memory"/>
  <parameter name="Copied" type="VNPIOFFSET" vector="byref" comment="Really processed data block length"/>
 </method>
 <method name="Update" type="VNPIRESULT" comment="Writes Data to stream">
  <parameter name="Handle" type="VNPIHANDLE" vector="byval" comment="Handle(id) of stream"/>
  <parameter name="Offset" type="VNPIOFFSET" vector="byval" comment="Data offset within stream"/>
  <parameter name="Length" type="VNPIOFFSET" vector="byval" comment="Leangth of transfering data block"/>
  <parameter name="Buffer" type="VNPIMEMORY" vector="byref" comment="Pointer to source memory"/>
  <parameter name="Copied" type="VNPIOFFSET" vector="byref" comment="Really processed data block length"/>
 </method>
</interface>

структура будет иметь следующий вид.

typedef struct _vtbl_IStream {
        VNPIRESULT ( __VNPI_CALLTYPE __VNPI_PTR Obtain )(
            _root_SystemObject __VNPI_PTR This, VNPIHANDLE Handle, VNPIOFFSET Offset, VNPIOFFSET Length, VNPIMEMORY __VNPI_PTR Buffer, VNPIOFFSET __VNPI_PTR Copied);
        VNPIRESULT ( __VNPI_CALLTYPE __VNPI_PTR Update )(
            _root_SystemObject __VNPI_PTR This, VNPIHANDLE Handle, VNPIOFFSET Offset, VNPIOFFSET Length, VNPIMEMORY __VNPI_PTR Buffer, VNPIOFFSET __VNPI_PTR Copied);
} _
vtbl_IStream;

дополнительно генерируются helper macros для облегчения вызова методов объекта.

Методы.

имеют соглашения о вызове __stdcall  /* _fastcall */

/*
например
:

#define IStream_Update(This, Handle, Offset, Length, Buffer, Copied) (This)->itbl->IStream->Update(&(This)->root, Handle, Offset, Length, Buffer, Copied)

вызов метода:
   
IStream_Update(pobject, handle, filepointer, blocksize, psource, prealsize);

 */

 

Класс

Класс - структура данных описывающая экземпляр класса (объект).

Каждый класс содержит в себе первым своим элементом структуру корня объекта:

typedef struct MyClass {
    _root_SystemObject root;

    Member1_Type Member1_Name;

    Member2_Type Member2_Name;

    .....
} MyClass;

При генерации класса формируются экземпляры категории и всех интерфейсов, реализуемых объектами данного класса.

Реализация интерфейса класса именуется vtbl_<Name_of_Class>_<Name_of_Interface>

Например:
_vtbl_IStream vtbl_MyClass_IStream = {MyClass_Read, MyClassWrite};
_vtbl_IMemory vtbl_MyClass_IMemory = {MyClass_Alloc, MyClassFree};

Экземпляры vtbl инициализируются указателями на функции - методы класса, реализующие соответствующие методы интерфейсов.

Реализация категории класса именуется itbl_<Name_of_Class>_<Name_of_Category >

Например:

_itbl_SystemObject itbl_MyClass_SystemObject = {&vtbl_MyClass_IMemory, &vtbl_MyClass_IStream };

Экземпляры itbl инициализируются указателями на реализации интерфейсов поддерживаемых данным классом.

/* 

Необходимо генерировать хелпер макрос для инициализации root.itbl объекта указателем на соответствующую реализацию категории. Название: CONSTRUCT_ITBL_<Name_of_Class>(p)

например

#define CONSTRUCT_ITBL_MyClass(p) (p)->itbl = &itbl_MyClass_SystemObject;

//          Зарезервировать CREATE_OBJECT_<Name_of_Class>(p, ...)

//          Зарезервировать DELETE_OBJECT_<Name_of_Class>(p)

 */

Объекты.

Объект - экземпляр структуры данных класса.

По возможности реализуются в парадигме State Less

При создании объекта необходимо инициализировать корень объекта указателем на реализацию категории данного объекта.

Например:
 MyClass *pMyObjcect = (создаем память);
 pMyObjcet->root.itbl = &itbl_MyClass_SystemObject;

 

Аналогичные проекты доступны по следующим ссылкам: 

http://www.embedded.com/97/fe29712.htm

http://www.quantum-leaps.com/resources/papers.htm#OOPinC

http://www.quantum-leaps.com/writings/samek9712.txt

 

 
Яндекс цитирования

Copyright (C) 2000-2008 Dmitry Shuklin Shuklin