![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Меня немного удивляет существование protocol buffers, и еще больше удивляет, когда кроме них изобретают еще и Apache Thrift, а потом еще и https://capnproto.org/ и https://google.github.io/flatbuffers/.
Все эти протоколы подразумевают, что система разрабатывается одной и той же командой (или двумя тесно взаимодействующими) с обоих сторон, что типы передаваемых меняются достаточно синхронно, т.е. что протокол за 2-3 итерации не превратится во что-нибудь вроде "у нас тут 100 опциональных полей на каждый случай жизни".
А вот генератора парсеров на случай "протокол дали ембеддеры-психи, засунув в 8 бит 2 флага и 2 поля по 3 бита с длиной дополнительных данных в пакете" или "обвязка протокол описана в виде ABNF в RFC, а в payload опять поселились эмбеддеры с бинарными форматами" я чего-то не видел.
Все эти протоколы подразумевают, что система разрабатывается одной и той же командой (или двумя тесно взаимодействующими) с обоих сторон, что типы передаваемых меняются достаточно синхронно, т.е. что протокол за 2-3 итерации не превратится во что-нибудь вроде "у нас тут 100 опциональных полей на каждый случай жизни".
А вот генератора парсеров на случай "протокол дали ембеддеры-психи, засунув в 8 бит 2 флага и 2 поля по 3 бита с длиной дополнительных данных в пакете" или "обвязка протокол описана в виде ABNF в RFC, а в payload опять поселились эмбеддеры с бинарными форматами" я чего-то не видел.
no subject
Date: 2015-09-02 03:18 pm (UTC)no subject
Date: 2015-09-02 03:34 pm (UTC)no subject
Date: 2015-09-02 03:38 pm (UTC)Ну да, и перечисленные условия - довольно частая и обыденная вещь, когда разным частям одной системы надо общаться. Для таких ситуаций и делаются.
В эрланге и эликсире весьма удобно сделан парсинг таких бинарных данных. А в других языках как-то ничего сразу на ум не приходит, да. Все привыкли текст парсить.
no subject
Date: 2015-09-02 05:05 pm (UTC)no subject
Date: 2015-09-02 06:12 pm (UTC)no subject
Date: 2015-09-03 08:10 am (UTC)А если надо с чем то снаружи общаться, то все равно ничего кроме json нет
no subject
Date: 2015-09-03 01:12 pm (UTC)http://thesz.livejournal.com/672967.html
Разборщики не так уж беспомощны, надо сказать.
no subject
Date: 2015-09-02 03:42 pm (UTC)никаким Wireshark нельзя закапчурить и пропарсить... =( прямо вот СИЛЬНО бесит
no subject
Date: 2015-09-02 04:38 pm (UTC)no subject
Date: 2015-09-03 02:25 pm (UTC)погуглить нынче это не тот скилл которым стоит хвастаться перед незнакомыми лично вам людьми =)
так что повторю свою точку зрения
protobuf
весьма неприятная штука для отладки клиент серверных взаимодействий
no subject
Date: 2015-09-03 02:32 pm (UTC)Какие бинарные варианты более удобны для отладки на ваш взгляд?
no subject
Date: 2015-09-03 03:41 pm (UTC)бинарность тут в общем то не принципиальна, с точки зрения отладки
no subject
Date: 2015-09-02 03:49 pm (UTC)no subject
Date: 2015-09-02 04:36 pm (UTC)let (|Digits|) (b:byte) = decimal(b >>> 4), decimal(b &&& 0x0Fuy)
let (|DecNums2|_|) (Digits (b1,b2)) = if b1<10m && b2<10m then Some(b1,b2) else None
let (|SignComa|) x =
let coma = (x &&& 0b111uy ) |> decimal
let sign = if (x >>> 7) = 0uy then 1m else (-1m)
sign, coma
что бы потом сказать что-то вроде
let (|Bcd6|_|) = function
| SignComa(sign,coma)::
DecNums2(d'100'000,d10'000)::DecNums2(d1000,d100)::DecNums2(d10,d1)::_ ->
Some( sign*(d'100'000*100000m + d10'000*10000m + d1000*1000m + d100*100m + d10*10m + d1 )/( pow 10m coma ) )
| _ -> None
а по другому хз как
no subject
Date: 2015-09-02 08:51 pm (UTC)no subject
Date: 2015-09-03 11:13 am (UTC)no subject
Date: 2015-09-04 10:04 am (UTC)no subject
Date: 2015-09-04 05:53 pm (UTC)ну я не думаю что алгоритм на каком нибудь Си будет проще (двоично-десятичное число из шести цифр):
надеюсь, это менее ужасно
no subject
Date: 2015-09-02 05:17 pm (UTC)no subject
Date: 2015-09-03 06:39 am (UTC)no subject
Date: 2015-09-02 05:18 pm (UTC)В зеркало посмотри.
no subject
Date: 2015-09-02 05:24 pm (UTC)no subject
Date: 2015-09-02 07:16 pm (UTC)type X = { A : int }
и попытаться считать
type Y = { A : int }
то будет БинариФорматЭксепшн.
no subject
Date: 2015-09-02 05:58 pm (UTC)no subject
Date: 2015-09-02 06:14 pm (UTC)ну да, микросервисы типа
no subject
Date: 2015-09-02 06:38 pm (UTC)Рэбе, ну елки-палки - http://broadcast.oreilly.com/2009/03/the-power-of-erlang-bit-syntax.html
no subject
Date: 2015-09-02 08:01 pm (UTC)no subject
Date: 2015-09-02 08:30 pm (UTC)no subject
Date: 2015-09-03 07:59 am (UTC)никаким Wireshark нельзя закапчурить и пропарсить... =( прямо вот СИЛЬНО бесит
no subject
Date: 2015-09-03 08:26 am (UTC)no subject
Date: 2015-09-03 08:27 am (UTC)no subject
Date: 2015-09-03 08:32 am (UTC)Ну и более новые протоколы умеют больше - контейнеры там всякие вроде map/list/set, и вроде чуть-чуть эффективнее.
no subject
Date: 2015-09-03 10:36 am (UTC)никаким Wireshark нельзя закапчурить и пропарсить... =( прямо вот СИЛЬНО бесит
no subject
Date: 2015-09-04 06:27 am (UTC)