Size: a a a

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

2020 March 06

а

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

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

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

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

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

KK

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

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

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

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

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

АВ

Александр Вольнов in cxx.Дискуссионная
Ofee
>> Где есть возможность хранить массивы значений произвольной битности
Важнее другое, сколько раз в жизни это понадобится в современном мире, где JS засовывают в микроконтроллеры? Т.е. этот пункт уже относится к крайне узкому применению
>> дебажить всё это неделями
Целый язык дебажить, конечно же, не нужно
>> на хостовом языке программирования
Можно пример для C++, желательно без макросов?
>> Если твоя структура данных в программе совпадает с той, которая в файле
Так мы ещё и анализ содержимого файла делаем? Мы на шаблонах научились эмулировать контракты, можно ли на твоей реализации сериализатора поиграть в крстики-нолики)
>> Будет онлайн редактор
Надеюсь, не только он, безопасность же и NDA
>> библиотека сама всё сконвертит
Можно где-то почитать про анализ бинарных даннх и то, как это длжно работаь?


А если серьёзно — я не говор, что дея плохая. Она просто... Недостаточна нужна твоей ЦА. Точнее, ЦА слишком узкая
В реальном мире достаточно часто нужна высокая производительность. К примеру, чтобы разгрузить сервера - вместо 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 имена и типы не дублируются, а встречаются ровно один раз. Вот десериализатор будет сверять данные заголовка и данные рефлексии, добавленной в структуру и производить необходимые преобразования, если они требуются.

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

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

АВ

Александр Вольнов in cxx.Дискуссионная
акварель на мету
хостовая, как это ? кстати, вы про руби слышали ?
Вот ты пишешь на C++, значит это хост-язык, в отличие от моего, который играет роль вспомогательного типа схемы protobuf.
источник

KK

Kirill Kaymakov in cxx.Дискуссионная
Александр Вольнов
Вот ты пишешь на C++, значит это хост-язык, в отличие от моего, который играет роль вспомогательного типа схемы protobuf.
Так ты протобуф новый пишешь или яп?)
источник

KK

Kirill Kaymakov in cxx.Дискуссионная
Определись
источник

а

акварель на мету in cxx.Дискуссионная
Александр Вольнов
Вот ты пишешь на C++, значит это хост-язык, в отличие от моего, который играет роль вспомогательного типа схемы protobuf.
так ты про руби не ответил
источник

а

акварель на мету in cxx.Дискуссионная
руби позволяет все это делать
источник

АВ

Александр Вольнов in cxx.Дискуссионная
Kirill Kaymakov
Блин, у меня уже там сомнения, что у него даже кз грамматика. 0-тип бы не отхватить:)
Первая версия моего языка будет иметь контекстно-свободную грамматику, а точнее его подмножество, которое парсится LL(1)-парсером, который написать проще простого. Потом возможно на LALR(1) перейду по мере добавления фич.
источник

KK

Kirill Kaymakov in cxx.Дискуссионная
акварель на мету
руби позволяет все это делать
Как и любой другой современный язык на вм
источник

а

акварель на мету in cxx.Дискуссионная
Kirill Kaymakov
Как и любой другой современный язык на вм
ну он более удобен для этого
источник

АВ

Александр Вольнов in cxx.Дискуссионная
Kirill Kaymakov
Так ты протобуф новый пишешь или яп?)
Я же не раз писал, что первоначальная идея - сделать убийцу protobuf и других, а потом добавлять фичи, которые из него сделают очень необычный ЯП с явной динамической типизацией и т.п..
источник

а

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

KK

Kirill Kaymakov in cxx.Дискуссионная
акварель на мету
ты тупо описываешь руби
F#
источник

KK

Kirill Kaymakov in cxx.Дискуссионная
Александр Вольнов
Я же не раз писал, что первоначальная идея - сделать убийцу protobuf и других, а потом добавлять фичи, которые из него сделают очень необычный ЯП с явной динамической типизацией и т.п..
Не убьешь ты протобуф
источник

AZ

Alexander Zaitsev in cxx.Дискуссионная
Kirill Kaymakov
Не убьешь ты протобуф
ему выгодно, чтобы ты так думал
источник

KK

Kirill Kaymakov in cxx.Дискуссионная
Json дико удобен по причине легкой его воспринимаемости глазу и легкого парсинга
источник

KK

Kirill Kaymakov in cxx.Дискуссионная
Alexander Zaitsev
ему выгодно, чтобы ты так думал
Хитрый план?
источник

AZ

Alexander Zaitsev in cxx.Дискуссионная
да
источник

KK

Kirill Kaymakov in cxx.Дискуссионная
В этот момент он втихоря будет захватывать мир?
источник