Size: a a a

cxx.Дискуссионная

2020 March 14

BB

Bohdan Bessonov in cxx.Дискуссионная
Переслано от Александр Вольнов
Оптимизация - это отдельный проход, который может переименовывать приватные поля, подставлять и упрощать выражения, используя всю доступную статическую информацию и параллельно находя ошибки, которые можно выявить в компайл-тайм.
источник

BB

Bohdan Bessonov in cxx.Дискуссионная
Переслано от Александр Вольнов
Вместо комментов приватные статические поля, которым присваивается строка. При оптимизации такие поля будут удалены.
источник

BB

Bohdan Bessonov in cxx.Дискуссионная
Переслано от Александр Вольнов
В реальном мире достаточно часто нужна высокая производительность. К примеру, чтобы разгрузить сервера - вместо JSON передавать компактный и умный бинарь. Ускорить обработку данных, храня их не в виде текста, а в виде умного бинаря со структурой, оптимизированной под те операции, которые нужны для данной задачи. Сейчас с форматами не заморачиваются, потому что это сложно. У меня это будет проще простого и можно выжать производительность. Можно будет писать программы, которые не потребляют практически никакой памяти за счёт того, что работают с файлами и потоками напрямую без хранения промежуточных данных в оперативке.

Я пока ещё не продумал API, но будет что-то типа такого:
struct Vec3
{
   float x, y, z;
   DATAVOLN_ADD_FIELD_REFLECTION(x, y, z);
};
struct Vertex
{
   Vec3 Position;
   Vec3 Normal;
   DATAVOLN_ADD_FIELD_REFLECTION(Position, Normal);
}
std::vector<Vertex> humanMesh;
DataVoln::OpenFile("file.bdv").DeserializeExpression("HumanMesh", humanMesh);
Предполагается, что файл содержит структуру с полем HumanMesh, которое является коллекцией структур, имеющих поля Position и Normal. Типы полей являются векторами, содержащими поля с именами x, y, z, причём они могут быть не float, а с фиксированной точкой любой битности - либа сконвертит. Если тип содержимого поля HumanMesh полностью совпадает с типом в C++, это будет простой memcpy. Также же будет API, который может замапить файл в память и использовать напрямую без копирования.

Итак, из этих 2 строчек первая - это макрос, который добавляет рефлексию в существующую структуру пользователя, а вторая - это команда на десериализацию данных из файла. В других языках, а также когда наконец добавят рефлексию в C++ первая строчка станет не нужна.

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

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

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

BB

Bohdan Bessonov in cxx.Дискуссионная
Переслано от Александр Вольнов
Где есть возможность хранить массивы значений произвольной битности? Например, есть временной ряд с миллионом целочисленных значений параметра в интервале от 0 до 15, для хранения одного значения достаточно 4 бит. В protobuf нет, в flatbuffers тоже, а мне такое нужно было недавно на работе, чтобы уменьшить объём данных, передаваемых через Интернет. А ещё нужно было паковать вместе несколько разных параметров разной битности и слать с самолёта по спутниковой связи, где один килобайт стоит больше доллара.
Если бы у меня была реализация моего языка, я бы это сделал за 15 минут. А так пришлось пилить свой протокол с ручной упаковкой бит и дебажить всё это неделями. Потом протокол менялся и приходилось дебажить снова.

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

Если твоя структура данных в программе совпадает с той, которая в файле, файл просто замапится в память или скопируется через memcpy. Будет не медленнее, чем flatbuffers. Если структура не совпадает, то всё автоматически сконвертится и это будет не медленнее, чем код, который делает это вручную.

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

С откатом кода назад проблем быть не должно. Если в новой версии кастомного формата появились новые поля, старая версия программы всё равно сможет прочитать этот файл, проигнорировав эти новые поля. Если изменить тип существующего поля, например @int16 на @int32 или наоборот, библиотека сама всё сконвертит. Если каких-то старых полей не хватает, то да, она их не увидит. Но в новом формате можно это предусмотреть и прописать константу, алиас или формулу для вычисления старых полей через новые. То есть при желании можно создавать версии формата, совместимые в обе стороны. И не нужно никаких ручных номеров версий в заголовке файла - с моим языком такой подход уйдёт в прошлое.
источник

A

Alex Ф-ф-фэils!🌠︙ in cxx.Дискуссионная
Ну пусть человек делает
источник

A

Alex Ф-ф-фэils!🌠︙ in cxx.Дискуссионная
Он молодец
источник

i

ivan in cxx.Дискуссионная
А, про инет кстати прикольно было, я читал это
источник

A

Alex Ф-ф-фэils!🌠︙ in cxx.Дискуссионная
Проект амбициозный, желаю ему успехов
источник

A

Alex Ф-ф-фэils!🌠︙ in cxx.Дискуссионная
ivan
А, про инет кстати прикольно было, я читал это
Угу
источник

BB

Bohdan Bessonov in cxx.Дискуссионная
мы должны вспомнить нетленочку
источник

BB

Bohdan Bessonov in cxx.Дискуссионная
источник

i

ivan in cxx.Дискуссионная
Челу бы вышку в mit каком получить еще и мб реализует что-то подобное
источник

A

Alex Ф-ф-фэils!🌠︙ in cxx.Дискуссионная
Что ору уже от названия
источник

BB

Bohdan Bessonov in cxx.Дискуссионная
Alex Ф-ф-фэils!🌠︙
Что ору уже от названия
посмотри, годно очень, хоть и старенькое
источник

v

vehlwn in cxx.Дискуссионная
источник

Е

Егор in cxx.Дискуссионная
ребят если я нашел баг в либе на гитхабе и знаю решение, но оно очень маленькое (правда стоило мне 5 дней в дебаггере), мне надо ишью открыть или пул реквест сделать?
источник

AZ

Alexander Zaitsev in cxx.Дискуссионная
Егор
ребят если я нашел баг в либе на гитхабе и знаю решение, но оно очень маленькое (правда стоило мне 5 дней в дебаггере), мне надо ишью открыть или пул реквест сделать?
Как минимум issue
источник

AZ

Alexander Zaitsev in cxx.Дискуссионная
Если не лень, то и pr сделай
источник

Е

Егор in cxx.Дискуссионная
спасибо
источник

АВ

Александр Вольнов in cxx.Дискуссионная
ivan
Локальный минимум чата
Локальный экстремум. А минимум или максимум - покажут дополнительные исследования.
источник