Платформа: x86_64
Инструкции: SSE4.2+AES-NI
ОС: Windows 8.1+, Linux 2.6+
Текущая версия: 0.7
Начало разработки: 28.09.2011
Доступность: только внутреннее использование (с версии 1.0, возможно, будет доступна для некоммерческих проектов)
Описание:
Cat Framework это фреймворк для аппаратной платформы x86_64, разрабатываемая с целью получения быстрого и полностью прогнозируемого кода. Ориентируясь на современное аппаратное обеспечение код фреймворка активно использует инструкции процессора вплоть до SSE4.2 включительно (в будущем планируется по мимо текущего технического уровня SSE4.2+AES-NI, добавить вариант кода для уровня AVX2+BMI2+TSX+RDRAND+SHA-NI). На текущий момент фреймворк поддерживает операционные системы Windows (начиная с Windows 8.1) и Linux (начиная с ядра 2.6). В будущем предусмотрена возможность добавления поддержки Solaris, FreeBSD и других ОС, работающих на аппаратной платформе x86_64 (в первую очередь консолей).
Фреймворк включает в себя 4 библиотеки, оформленные в виде пакетов для Lazarus (хотя их можно использовать и с чистым FreePascal`ем что требует ручной настройки путей и самостоятельного определения необходимых define`ов):
- CatFramework – библиотека общего назначения (дала название всему фреймворку)
- CatRTL – облегчённая библиотека времени выполнения для FPC предназначенная для создания клиентских приложений
- CatServerRTL – облегчённая библиотека времени выполнения FPC предназначенная для для создания серверных приложений (только Linux)
- CatServerActors – вспомогательная библиотека, используемая совместно с CatServerRTL, для создания серверных приложений с использованием модели акторов
Сейчас в разработке:
- Доработки и исправления для версии 0.8
- Экспериментальное портирование частей CatFramework и CatServerRTL на FreeBSD и Solaris в интересах проекта CAR
CatFramework
Все модули библиотеки разделены на 10 групп. Пять групп (CFW, CFWLib, CFWOS, CFWSTL и CFWHelper) являются основными (используются при компиляции CatRTL и CatServerRTL), остальные же группы являются дополнительными.
Группа CFW (модули общего назначения):
- Определения основных типов данных в удобной форме, а также определение основных операторов для векторных типов данных
- Основа для реализации журнала и обработки критических ошибок приложения
- Функции для расчёта хешей:
- CRC16
- CRC32
(реализация на базе инструкции CRC32) - CRC64
- SHA-1
- SHA-256
- SHA-512
- Простейшие математические функции для целых чисел
(min, max, clamp, НОД, НОК и т.д.) - Функции работы с памятью:
- Очистка, копирование, заполнение и сравнение регионов памяти
- Операции над битовыми строками (в том числе атомарные)
- Атомарные операций с памятью
- Spinlock`и, в том числе со встроенной очередь
- Ожидание значения переменной в spinlock`е
- Различные ГПСЧ
- Операции со строками:
- ShortString:
- Сравнение строк
(в том числе быстрая проверка на идентичность) - Присвоение (в том числе из массива символов известной длинны)
- Добавление к одной строке другой
- Добавление к строке символа
- Добавление к строке массива символов известной длинны
- Добавление к строке числа (знаковое/без знаковое целое, число с плавающей точной)
- Добавление к строке без знакового целого числа в 16-тиричной форме
- Извлечение из строки знакового/без знакового целого числа
- Извлечение из строки без знакового целого числа в 16-тиричной форме
- Сравнение строк
- Null-терминированные строки:
(как однобайтные, так и двухбайтные символы)- Определение длинны строки
- Сравнение строк
(в том числе быстрая проверка на идентичность) - Поиск в строке символов из числа указанных
- Поиск в строке символов не из числа указанных
- Поиск в строке символов из указанных промежутков
- Поиск в строке символов не из указанных промежутков
- Поиск подстроки в строке
- Массив символов известной длинны:
(как однобайтные, так и двухбайтные символы)- Поиск в строке символов из числа указанных
- Поиск в строке символов не из числа указанных
- Поиск в строке символов из указанных промежутков
- Поиск в строке символов не из указанных промежутков
- Выделение из текста строк и слов
- ShortString:
Группа CFW-Lib (заголовочные файлы для основных API ОС и различных библиотек, переведены частично и допереводятся при необходимости):
- Модули, доступные в ОС Linux:
- Заголовки вызовов ядра (kernel calls)
- Заголовки LibC
- Заголовки DL
- Заголовки PThread
- Заголовки XCB
- Модули, доступные в ОС Windows:
- Заголовки WinAPI
- Заголовки WASAPI
- Заголовки DirectX 10
- Заголовки DirectX 11
- Заголовки DirectX 12
Группа CFW-OS (общий интерфейс для некоторых возможностей ОС):
- Различные функции получения текущего времени
(в том числе добавления меток времени различного формата к строке) - Высокопроизводительная функция лога с добавлением микросекундного тайм-штампа, класса сообщения и идентификатора потока из которого осуществлена запись
- Объявления базовых классов для реализации различных политик выделения памяти и реакций на её нехватку
- Генератор случайных чисел для нужд криптографии
- Функции для синхронной работы с файлами
- Менеджмент памяти процесса
- Работа с виртуальной памятью процесса
- Работа со стандартных хипом процесса
- Отладочный режим работы с хипом, в котором происходит запись стека вызовов для всех выделений памяти, а при завершении работы приложения в консоль выводиться информация об утечках
(при этом, если приложение содержит отладочную информацию, то стек вызовов по мимо адресов будет также содержать информацию о соотв. им строках исходного кода)
- Обёртка над сокетами, расширенный функционал для TCP сокетов
(в Windows базируется на WSAAsyncSelect, в Linux – на Poll) - Работа с потоками:
- Простая функция запуска исполнения процедуры в другом потоке
- Объект-потока позволяющий ожидать завершение созданного потока и получать код его завершения
- Объекты-синхронизации двух видов (без поддержки мультиплексирования средствами ОС и с ней):
- Event
- Semaphore
- CountDownLatch
- Pool (односвязный список регионов памяти с LIFO-доступом связанный через первые 8-байт региона)
- Потокобезопасная очередь указателей с различными режимами работы
- Прочие вспомогательные функции, реализация которых зависит от ОС
Группа CFW-STL (набор контейнеров для хранения различных видов данных, аналог STL в C):
- Контейнеры на основе generic`ов
(массив, список, набор, стек, очередь, односвязный и двусвязный списки, списков указателей с приоритетом, хеш-таблица с открытой адресацией) - Набор примитивов синхронизации для контейнеров
- Набор примитивов управление памятью для контейнеров
- Lock-free хеш-таблица, в том числе с возможностью блокировки записей
Группа CFW-Helper (различные вспомогательные модули):
- Определение поддерживаемых процессором наборов инструкций
- Профайлинг функций
- Объект для разбора отладочной информации Dwarf2 и получения lineinfo
- Вспомогательные функции для каждой ОС
Группа CFW-Compress (модули для быстрого сжатия/разжатия данных без потерь):
- Статическое сжатие Хаффмана для 8-ми битных слов
- 4 варианта LZ77
(минимальное совпадение 3 или 4 байта, размер окна 64КБ или 1МБ) - 4 варианта LZ77+Huffman
(минимальное совпадение 3 или 4 байта, размер окна 64КБ или 1МБ) - Специальные версии декомпрессоров с параллельным подсчётом CRC32 данных (как в сжатом виде, так и в разжатом)
Группа CFW-Crypt (модули для шифрования данных):
- AES-256
(как обычная реализация, так и реализация на базе AES-инструкций процессора) - Diffie-Hellman
(256, 512, 1024, 2048, 4096, 8192, 16384 и 32768 бит) - RSA
(512, 1024, 2048, 4096, 8192, 16384 и 32768 бит)
Группа CFW-Math (математические операции над числами с плавающей точкой. В том числе для нужд 3D графики):
- Функции преобразования между числами с плавающей точкой различной разрядности (64, 32 и 16 бит)
- Простейшие функции вроде min, max, clamp и т.д. для float32 и float64
- Триганоментрические функции для float32 и float64
- Быстрые sin/cos для float32
- Векторная математика для float32
- Матричная математика для float32
Группа CFW-MemMng (менеджмент памяти внутри процесса):
- Объект для организации пулов памяти на основе односвязного списка
- Объекты для организации пулов памяти на основе иерархической битовой карты
Группа CFW-Serialization (модули для сериализации/десериализации произвольных структур данных):
- Описание формата сериализации данных CSSF и функции для упрощения чтения/проверки целостности данных для него
Cat RTL
- Потоки:
- Поддержка threadvar
- Объекты обёртки для таких вещей как поток, эвент, семафор
- Исключения: Отсутствие потребности в динамическом выделении памяти в момент возникновения исключения
- Объекты: оптимизированные методы Dispatch и DispatchStr у TObject
- Интерфейсы COM и CORBA
Cat Server RTL
- Потоки:
- TLS на 56 слотов
- Быстрое получение TID
- Поддержка threadvar
- Возможность создания потоков со стеком в 1КБ (512 байт TLS, 512 – собственно стек)
- Исключения:
- Отсутствие потребности в динамическом выделении памяти в момент возникновения исключения
- Хип процесса:
- Выравнивание на границу 64 байта
- Полная потокобезопасность (но не реинтерабельность)
- Объекты: оптимизированные методы Dispatch и DispatchStr у TObject
- Интерфейсы COM и CORBA
Cat Server Actors
- Специальный пул для сообщений и высокоскоростная очередь для них
- Класс-обработчик сообщений с собственными рабочими потоками
- Акторы и обработчики сообщений для них с различными механизмами ограничения доступа
- Акторы с поддержкой получения сообщений о событиях файлового дескриптора
- Набор классов для организации TCP-сервера
История возникновения
Первое упоминание о CFW датируется 27 декабря 2007 года, когда папка с таким названием появилась в дереве исходных кодов, так и не законченного, движка SkyEngine. В эту папку были вынесены все модули, которые не были напрямую связанны с движком (например определения типов, математические функции, функции хеширования, шифрования и т.д.). Далее, 28 апреля 2009 года, CFW оформился именно как библиотека, но всё еще в составе конкретного проекта. Библиотека была ориентирована только на Windows и платформу x86. 30 июля 2009 года состоялось одно из самых значимых событий в истории CFW – полный переход на платформу x86_64 и отказ от поддержки платформы х86, а 4 августа 2009 произошел полный отказ от использование Delphi в каких-либо частях проекта и полный переход на FreePascal. Основной причиной перехода как раз и послужило отсутствие у Delphi поддержки платформы x86_64 на то время. А 13 марта 2010 года в составе CFW появился первый модуль, ориентированный на работу с ОС Linux. К началу лета 2011 года уже явно сформировалась потребность в полностью независимой библиотеке общего назначения для платформы x86_64 и ОС Windows и Linux. Кроме того, модуль RSA шифрования оказался полностью неработоспособным и найти место где в него закралась ошибка (ну или с когда он перестал работать) так и не удалось. Чтобы избежать повторения этой ситуации в дальнейшем 22 июня 2011 в составе CFW появились первые юнит-тесты, выполняемые после каждого изменения в библиотеке, чтобы убедиться в работоспособности всего её функционала. Ну и наконец 28 сентября 2011 CFW полностью выделилась в независимый проект.