Skip to content

logo

Стилистические соглашения

Технологический стандарт
Статус: Черновик
Дата: Октябрь 24, 2025
Версия: 1.3

АвторыКомпания
Владимир БашевООО ПИРФ
Ильин НиколайООО ПИРФ

Table of Contents

Стилистические соглашения

1. Обзор

1.1. Введение

1.2. Примечание и терминология

1.3. Ссылки

2. Структура каталогов проекта

2.1. Стиль кодирования

2.2. Префикс

2.3. Идентификаторы

1. Обзор

Данный документ описывает стилистические соглашения.

1.1. Введение

Для унификации работы с кодом и разработкой программного обеспечения на базе Эко-Фреймворка (ЭкоОС) рекомендуется следовать определенным конвенциям в части размещения артефактов и их обозначений. В данном документе описаны наиболее важные правила и соглашения, а также приведены примеры программного кода, снабженные инструкциями по использованию и сборке.

1.2. Примечание и терминология

  • Язык программирования С - язык стандарта С89
  • MISRA С – стандарт создания надежного программного кода на языке С
  • АОМК – Адаптированная Объектная Модель Компонент, патентованная архитектура операционных систем, которая является индустриальным стандартом построения ОС
  • Эко-фреймворк – микро-компонентный фреймворк для создания операционных систем и прикладных компонент на базе технологии АОМК
  • ЭкоОС – операционная система разработки ООО ПИРФ на базе Эко-фреймворка
  • ЭкоС – универсальный микрокомпонентный компилятор языка С
  • IDL (Interface Definition Language) – стандарт для описание интерфейса ISO/IEC 19516:2020 и OMG IDL v 4.2 (также имеет совместимость с MS IDL)
  • UGUID (Universal Global Unique Identifier) – специализированный тип данных применяемый в различных языках программирования и системах управления базами данных, является стандартом АОМК технологии.
  • CID (Component ID) - уникальный идентификатор компонента в формате UGUID.
  • IID (Interface ID) - уникальный идентификатор интерфейса в формате UGUID.
  • GID (Generation ID) – уникальный идентификатор поколения компонента в формате UGUID. Соответствует поколению микроядра ОС (= поколению Интерфейсной шины), для которой создан компонент.

1.3. Ссылки

Данный параграф содержит ссылки на информацию, помогающую понять данный документ.

Общепринятые соглашения по стилю программного кода для языка “C”:
https://edk2-docs.gitbook.io/edk-ii-c-coding-standards-specification/

Стандарт написания программного кода MISRA C:
https://www.perforce.com/resources/qac/misra-c-cpp

2. Структура каталогов проекта

При создании и разработке компонентов, предлагается использовать следующую структуру каталогов под проект, представленную ниже на Рис. 1, Рис. 2, Рис. 3:

*Рис. 1* Рис. 2

Рис. 3

2.1. Стиль кодирования


При создании программного кода следует в целом руководствоваться стилистическими соглашениями для языка «С», в частности, описанными по ссылке:
https://edk2-docs.gitbook.io/edk-ii-c-coding-standards-specification/

2.2. Префикс

Рекомендуется использование префиксов по ссылке выше, но с добавлением нижнего подчеркивания между идентификатором и именем переменной. Пример некоторых префиксов:
“m_” обозначает переменную член класса (member)
“l_” переменная с локальным скопом видимости (local)
“g_” обозначает переменную с глобальным скопом видимости (global)
“p_” обозначает переменную с типом указатель (pointer)
“r_” обозначает переменную с типом ссылка (reference)
Примеры:
m_Description
p_Description

Другие префиксы:
“I” – обозначает интерфейс и используется без нижнего подчеркивания (пример: IAccess)
“fn” – обозначает функцию и используется без нижнего подчеркивания (пример: fnStartJob)

Опционально допускаются следующие префиксы для типов:
Integer (count): n
Index Integer i
Unsigned 32-bit Integer: u32
Float point: fp
Double: db
Boolean b

Допускается комбинация букв, при этом рекомендуется разделять префиксы и ставить префикс видимости слева от нижнего подчеркивания, а префикс типа справа от него, например:
g*_u32**BufferSize*
Другие примеры сокращений (идентификаторов) приведены по ссылке:
https://en.wikipedia.org/wiki/Hungarian_notation#Examples

Список возможным идентификаторов указан по ссылке:
https://edk2-docs.gitbook.io/edk-ii-c-coding-standards-specification/4_naming_conventions/43_identifiers#4332-any-variable-with-file-scope-or-better-shall-be-prefixed-by-an-m-or-g


2.3. Идентификаторы

В стандарте АОМК технологии используется тип данных UGUID генерация которого базируется на стандартах RFC 4122 и RFC 9562 применяемых для генерации UUID. Основное отличие UGUID от UUID заключается в том, что UUID имеет фиксированное 128 битное значение. UGUID может иметь разную длину которую определяет преамбола. Для достижения неоходимой длины значения UGUID превышающую значения 128 бит, повторно применяется алгоритм генерации UUID стандарта RFC 4122/RFC 9562. При превышении значения большего чем необходимо, значимая часть оставляется, остальное отбрасывается. В большинстве случаев достаточно иметь 128 битное значение UGUID для идентификаторов. Соответственно для описания типа данных UGUID на различных ЯП, достаточно воспользоваться структурой данных.

Например на С/С++:

cpp
typedef struct UGUID {  
    byte_t Preamble;  
    byte_t Length;  
    byte_t Data[16];  
} GUID128;

Примеры идентификаторов интерфейсов на C/C++:

cpp
/* IEcoFoo1 IID = {52545486-0562-4C26-93EE-352A9C88AD04} */  
#ifndef __IID_IEcoFoo1  
static const UGUID IID_IEcoFoo1 = {0x01, 0x10, {0x52, 0x54, 0x54, 0x86, 0x05, 0x62, 0x4C, 0x26, 0x93, 0xEE, 0x35, 0x2A, 0x9C, 0x88, 0xAD, 0x04}};  
#endif /* __IID_IEcoFoo1 */  
  
/* IEcoFoo1 IID = {F27E20BF-79B3-45E2-9FAA-EFB5D3B2F06D} */  
#ifndef __IID_IEcoBar1  
static const UGUID IID_IEcoBar1 = {0x01, 0x10, {0xF2, 0x7E, 0x20, 0xBF, 0x79, 0xB3, 0x45, 0xE2, 0x9FA, 0xA, 0xEF, 0xB5, 0xD3, 0xB2, 0xF0, 0x6D}}};  
#endif /* __IID_IEcoBar1 */

Пример идентификатора компонента на C/C++:

cpp
/* EcoMath1 CID = {5B7DD38B-A684-41A7-A64B-FB30D47FE35B} */  
#ifndef __CID_EcoMath1  
static const UGUID CID_EcoMath1 = {0x01, 0x10, {0x5B, 0x7D, 0xD3, 0x8B, 0xA6, 0x84, 0x41, 0xA7, 0xA6, 0x4B, 0xFB, 0x30, 0xD4, 0x7F, 0xE3, 0x5B}};  
#endif /* __CID_EcoMath1 */

Примеры идентификаторов поколений под разные архитектуры на C/C++:

cpp
/* IEcoSystem_x86_32 GID = 00000000-0000-0000-0000-000014C00200 */  
#ifndef __GID_IEcoSystem_x86_32  
static const UGUID GID_IEcoSystem_x86_32 = { 0x01, 0x10, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0xC0, 0x02, 0x00} };  
#endif /* __GID_IEcoSystem_x86_32 */  
  
/* IEcoSystem_x86_64 GID = 00000000-0000-0000-0000-000086640300 */  
#ifndef __GID_IEcoSystem_x86_64  
static const UGUID GID_IEcoSystem_x86_64 = { 0x01, 0x10, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x64, 0x03, 0x00} };  
#endif /* __GID_IEcoSystem_x86_64 */  
  
/* IEcoSystem_AARCH64 GID = 00000000-0000-0000-0000-0000AA640300 */  
#ifndef __GID_IEcoSystem_AARCH64  
static const UGUID GID_IEcoSystem_AARCH64 = { 0x01, 0x10, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAA, 0x64, 0x03, 0x00} };  
#endif /* __GID_IEcoSystem_AARCH64 */  
  
/* IEcoSystem_RV64 GID = 00000000-0000-0000-0000-000050640200 */  
#ifndef __GID_IEcoSystem_RV64  
static const UGUID GID_IEcoSystem_RV64 = { 0x01, 0x10, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x64, 0x02, 0x00} };  
#endif /* __GID_IEcoSystem_RV64 */

На языке описание интерфейсов (IDL) описание идентификаторов интерфейсов будет следующее:

cpp
module EcoMath1 {  
    [  
        uuid(F27E20BF-79B3-45E2-9FAA-EFB5D3B2F06D)  
    ]  
    interface IEcoFoo1 {  
        readonly attribute string name;  
        void setValue([in] long value);  
        long getValue();  
    };  
    [  
        uuid(5B7DD38B-A684-41A7-A64B-FB30D47FE35B)  
    ]  
    coclass Component {  
        [default] interface IEcoFoo1;  
    };