
Стилистические соглашения
Технологический стандарт
Статус: Черновик
Дата: Октябрь 24, 2025
Версия: 1.3
| Авторы | Компания |
|---|---|
| Владимир Башев | ООО ПИРФ |
| Ильин Николай | ООО ПИРФ |
Table of Contents
1.2. Примечание и терминология
2. Структура каталогов проекта
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 на различных ЯП, достаточно воспользоваться структурой данных.
Например на С/С++:
typedef struct UGUID {
byte_t Preamble;
byte_t Length;
byte_t Data[16];
} GUID128;Примеры идентификаторов интерфейсов на C/C++:
/* 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++:
/* 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++:
/* 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) описание идентификаторов интерфейсов будет следующее:
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;
};
