- Журнал изменений в версиях системы Papyrus
- PAPYRUS (Демо)
- Papyrus: development
- ppd-chapter-000
- Введение #2
- Инструментарий
- Сборка проекта
- Code style
- Заметки по производительности
- Общие функции
- Базовые типы данных
- Базовые структуры данных
- Базовые алгоритмы
- Управление строковыми ресурсами
- Соображения по вопросу неотрицательности товарных остатков
- Котировки
- Модель объемной оптимизации товарных запасов
- Проект SARTR
- Протокол взаимодействия
- Зарезервированные объекты
- Регламентированные задания
- Papyrus: возможности системы
- Papyrus: руководство пользователя
- Библиотека
- Все об обязательной маркировке 2021
- Все об онлайн-кассах
- Презентации
- Руководства
- Свидетельство о регистрации системы Papyrus
- Технологии и функции
Инструментарий
В этой главе рассмотрены инструментальные средства разработки и сборки системы.
Языки программирования
Подавляющая часть проекта реализована на языке c++.
Стандарт языка c++
В проекте применяется подмножество языка c++, соответствующее стандарту ISO/IEC 14882:1998. Возможности, доступные в более поздних стандартах практически не используются.Компилятор и среда разработки
Для работы собственно над ядром системы используется среда разработки Microsoft Visual Studio. В состав исходных кодов входят каталоги, содержащие файлы решений (solution) и проектов (project) для Visual Studio версий 7.10 (Visual Studio 2003), и 15.0 (Visual Studio 2017).Проект одинаково успешно компилируется в каждой из указанных версий среды.
Дистрибутивы релизов собираются на Visual Studio 2017 и Visual Studio 7.10. Основной дистрибутив релизов собирается на Visual Studio 2017. На Visual Studio 7.10 собираются дополнительные модули с суффиксом -xp, обеспечивающие работу системы на операционных системах Windows XP и Windows Server 2003. Официально, с 2021 года поддержка Windows XP и Windows Server 2003 прекращается (хотя, дистрибутивы по-прежнему содержат упомянутые модули). Начиная с начала 2023 года сборка средствами Visual Studio 7.10 прекращена. Так же полностью остановлена поддержка Windows XP и Windows Server 2003.
Опции компиляции и компоновки
Конфигурации решения (Solution Configurations)
Решение содержит 6 конфигураций для трех базовых вариантов сборки:
- Debug
- Конфигурация пользовательской интерактивной сборки с отладочной информацией.
- Release
- Конфигурация пользовательской интерактивной сборки в релиз-варианте.
- ServerDebug
- Конфигурация Job-Server'а с отладочной информацией.
- ServerRelease
- Конфигурация Job-Server'а в релиз-варианте.
- MtDllDebug
- Конфигурация dll-модуля для использования внешними компонентами посредством COM-интерфейсов. С отладочной информацией.
- MtDllRelease
- Конфигурация dll-модуля для использования внешними компонентами посредством COM-интерфейсов. Релиз-вариант.
Каталоги для формирования промежуточных результатов сборки (Output и Intermediate directories)
Головной каталог проекта обычно называется Papyrus, однако это может быть и любое иное имя, например OpenPapyrus.
- Visual Studio 2003
-
$(ProjectDir)../../__TEMP__/VC70/$(ConfigurationName)/$(ProjectName)/
- Visual Studio 2017
-
$(ProjectDir)../../__TEMP__/VC2017/$(PlatformShortName)/$(Configuration)/$(ProjectName)/
- Visual Studio 2019
-
$(ProjectDir)../../__TEMP__/VC2019/$(PlatformShortName)/$(Configuration)/$(ProjectName)/
- Visual Studio 2022
-
$(ProjectDir)../../__TEMP__/VC2022/$(PlatformShortName)/$(Configuration)/$(ProjectName)/
Такие шаблоны применяются ко всем проектам решения.
Выравнивание структур данных (struct member alignment)
Все проекты компилируются с отсутствием выравнивания структур данных (struct member alignment = 1 byte). Причиной для этого является потенциальная опасность несогласованности persistent-структур при сохранении или передачи их в потоках данных.При этом поля структур настоятельно рекомендуется выравнивать в ручную по границе 4 байт.Например:
// С этой структурой все в порядке: каждый элемент // занимает пространство кратное 4. struct ABC { int A; uint8 B[16]; int C; }; // В этой структуре элемент B следует выровнять до 4-байтовой границы // фиктивным элементом (в данном случае это uint8 Reserve[3]). // К таким фиктивным элементам следует добавлять предопределенный // комментарий @alignment. struct ABC2 { int A; bool B; uint8 Reserve[3]; // @alignment int C; };
Character Set
Все проекты решения компилируются в режиме Unicode.
Многопоточность
Все проекты компилируются в многопоточном варианте.Run-time библиотеки
При сборке всех модулей применяется статическая компоновка с run-time библиотеками (multithread-вариант).
Precompiled headers
Практически все проекты сборки используют предкомпиляцию заголовков. В роли инициирующего файла обычно выступает файл с именем aaa-pch.c(cpp) где aaa - краткая аббревиатура проекта. Например pp-pch.cpp для проекта Papyrus, slib-pch.cpp для проекта SLib, openssl-ssl-pch.cpp для одного из проектов openssl и так далее.Conformance mode
Для большинства проектов решения эта опция включена. К сожалению, не все модули удается скомпилировать с этой опцией, но мы стремимся к тому, чтоб сборка вConformance mode
была повсеместной.
Сторонние компоненты
Мы инкорпорировали в общую инфраструктуру значительное число библиотек и компонентов сторонних разработчиков. Не все из них используются - некоторые были адаптированы с той или иной целью, но дальнейшее применение было отложено. Все инкорпорированные проекты подвергаются значительной адаптации таким образом, чтобы стать максимально унифицированными со остальными частями проекта.Далее перечисляются почти все компоненты, которые так или иначе были включены в общую инфраструктуру.
- asmlib of Agner Fog
- Великолепный набор ассемблерных процедур для улучшения производительности. https://www.agner.org
- zlib
- Версия 1.2.11. Библиотека сжатия данных. Король opensource-мира: очень многие библиотеки и система, как открытые, так и проприетарные, используют этот компонент. https://zlib.net
- cairo
- Версия 1.16.0. Библиотека векторной 2D-графики. https://www.cairographics.org
- pixman
- Версия 0.36.0. Низкоуровневая поддержка для cairo.
- freetype
- Версия 2.10.4 (ноябрь 2020) Библиотека для работы со шрифтами. Инкорпорирована для реализации функций пользовательского интерфейса и отчетной подсистемы. Многие opensource-компоненты зависят от этой подсистемы.
- HarfBuzz
- Версия 2.7.2 (декабрь 2020) Библиотека для рендеринга текстов. Инкорпорирована для реализации функций пользовательского интерфейса и отчетной подсистемы.
- libjpeg
- Библиотека для чтения и записи изображений в формате jpeg. Используется соответствующим образом. Кроме того, значительное число иных компонентов зависят от этой библиотеки.
- libjpeg-turbo
- Библиотека того же назначения, что и libjpeg, но декларирующая лучшую производительность за счет использования SSE-команд процессора. Инкорпорирована в экспериментальных целях. При попытке реального использования стала вызывать аварийные сбои в работе системы, из-за чего применение отключено.
- libpng
- Библиотека для чтения и записи изображений в формате png. Для этого и используется. Кроме того, обеспечивает зависимости других компонентов.
- giflib
- Библиотека для чтения и записи изображений в формате gif.
- tiff
- Версия 4.0.9. Библиотека для чтения и записи изображений в формате tiff.
- OpenJPEG
- Версия 2.3.1 (декабрь 2020) Библиотека для чтения и записи изображений в формате jpeg2000. Инкорпорирована ради обеспечения зависимостей других компонентов.
- jbig2dec
- Версия 0.19 (декабрь 2020) Компонент для декодирования формата сжатия изображений JBIG2. Включена для покрытия зависимостей других подсистем. https://jbig2dec.com
- lcms2
- Версия 2.11 (декабрь 2020) Little color management system. Компонент, реализующий трансформацию цветовых схем. Инкорпорирована ради зависимостей других подсистем. https://www.littlecms.com
- libxml
- Версия 2.9.2. Библиотека для чтения и записи данных в xml-формате. Интенсивно используется. Значительно переработана - дальнейшие заимствования не предполагаются.
- BerkeleyDB
- gSOAP
- Версия 2.8.8. Значительно переработана - дальнейшие заимствования не предполагаются.
- Scintilla
- Версия 3.7.3. Используется для редактирования текстовых файлов и вывода в окне сообщений.
- cURL
- Версия 7.73.
- libzip
- openssl
- Версия 1.1.1d. Исключительно популярная библиотека, обеспечивающая шифрование TCP/IP-соединений (TLS/SSL). Используется значительным числом компонентов системы.
- libssh2
- nginx
- Версия 1.13.4. Нетипичный вариант интеграции. Nginx - нисколько не библиотека и не предназначен для использования в таком качестве. Тем не менее, мы инкорпорировали эту систему как статическую библиотеку. Цель (не достигнутая до сих пор) - реализовать полноценных web-сервер, интегрирующий управления контентом с данными ERP/CRM.
- pcre
- Библиотека для работы с регулярными выражениями с синтаксисом perl. Интегрирована из-за зависимости от нее пакета Nginx.
- 7zip
- lua
- Версия 5.3.4. В планах задействовать LUA в качестве внутреннего скриптового языка.
- libarchive
- Версия 3.5.0 (декабрь 2020)
- jansson
- Экспериментальный форк, сделанный ради сборки проекта rehex.
- capstone
- Версия 4.0.2 (git clone 2020-11-18). Экспериментальный форк, сделанный ради сборки проекта rehex.
- sqlite
- Версия 3.34.00. В отличии от большинства иных заимствованных проектов, эта библиотека пока не подвергалась рефакторингу.
- mariadb-connector-c
- abseil
- Библиотека c++ общего назначения от google.
- googletest
- icu
- imgui
- libphonenumber
- lz4
- zstd
- xapian
- protobuf