LINUX.ORG.RU

ищется протокол удалённого вызова процедур

 


0

2

Клиент - C++, Сервер - программа на языке со сборкой мусора. Вызов только локальный. Нужно уметь описывать интерфейсы, хранить ссылки на удалённые объекты, генерировать обёртки и всё вот это вот.

Основное требование - это простота реализации и независимость от библиотек, т.к. придётся портировать на новый язык, в котором ничего нет (даже json).

Поэтому ищется какая-то компактная многоязычная библиотечка.

Второе требование - пермиссивная лицензия.

В текущем самодельном прототипе используются сокеты. Вроде этого пока должно быть достаточно.

Посмотрел:

  • SOAP - на базе XML = тормоза.
  • Protobuf - формат можно рассмотреть, хотя у меня нет цели слишком сжимать данные, а они там похоже на это запарились.
  • grpc - оказывается, там какое-то http/2, заточенное под оптимизацию веба. Мне это абсолютно не нужно
  • erpc - только Си
  • CORBA - вроде громоздкая?

Фавориты:

★★★★★

Последнее исправление: den73 (всего исправлений: 4)

Ответ на: комментарий от monk

достаточно словосочетаний для идентификации любого объекта

То есть существование судов бессмысленна? Все однозначно на момент подписания договоров?

anonymous
()
Ответ на: комментарий от monk

Так именно это «постановщику» и твердят в каждой его шизофренической теме. Но больной упирается и выплевывает таблетки.

anonymous
()
Ответ на: комментарий от anonymous

Все однозначно на момент подписания договоров?

Ежели обе стороны при составлении договора этого хотят, то да.

monk ★★★★★
()
Ответ на: комментарий от WitcherGeralt

Ну, збс теперь. Пересечение настолько несущетвенное, что всерьёз назвать это сабсетом HTML нельзя, оно может быть вообще случайным.

Данный файл корректно открывается любым браузером HTML, значит содержимое файла является сабсетом.

Урежешь до минимально необходимого для твоего приложения, может получиться так, что готовая библиотека такое не переварит.

Если используется подмножество протокола, то зачем готовая библиотека? Вот если мне надо отобразить упомянутый сабсет HTML, то ручной парсинг будет на несколько порядков быстрее и требовать меньше памяти, чем, например, WebKit.

monk ★★★★★
()
Ответ на: комментарий от monk

И в этих договорах должен по умолчанию подразумеваться пункт

0) Любые споры решаются внесудебном порядке - стенка на стенку
anonymous
()
Ответ на: комментарий от Reset

TLV - понял, как вариант. Я уже изобрёл LV, а про T, видимо, ещё не успел :)

den73 ★★★★★
() автор топика
Ответ на: комментарий от anonymous

и числа только прописью, нельзя использовать арабские цифры

anonymous
()
Ответ на: комментарий от anonymous

По логике Аристотеля «подмножество» != «сабсет»

аристотель бы тебе в рот нассал, логик.

anonymous
()
Ответ на: комментарий от monk

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

WitcherGeralt ★★
()
Ответ на: комментарий от anonymous

Я логику учу на ЛОРе, там хорошо объясняют про «логику Аристотеля», и про Карла, Маркса, Фридриха и Энгельса.

anonymous
()
Ответ на: комментарий от WitcherGeralt

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

Если протокол достаточно прост, то лучше написать свою. Как в примере про HTML, DIV и WebKit.

monk ★★★★★
()
Ответ на: комментарий от anonymous

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

anonymous
()
Ответ на: комментарий от monk

Если протокол достаточно прост, то

надо использовать встроенный в язык менеджер пакетов: npm, cargo, …

anonymous
()
Ответ на: комментарий от WitcherGeralt

Если заняться больше нечем, то конечно.

Весь вопрос в соотнесении расходов рабочего времени.

Есть два языка. Под один есть библиотека, но минимальная реализация протокола для неё занимает 700 строк (условно-независимых от языка). Минимальная реализация необходимого подмножества протокола занимает 300 строк. Тогда использование библиотеки стоит 700 строк, а её неиспользование стоит 600 строк. Выгоднее не использовать.

monk ★★★★★
()
Ответ на: комментарий от anonymous

надо использовать встроенный в язык менеджер пакетов

Он же не в язык, а в систему сборки встроен. Или что сказать хотел?

monk ★★★★★
()
Ответ на: комментарий от monk

стоит 700 строк

Выгоднее не использовать.

Зарплату платят за количество строк написанных ватсапе! Вообще выпал из реальности!

anonymous
()
Ответ на: комментарий от WitcherGeralt

Я знаю придурков

Не придурки, а реальные пацаны. Раз «логику Аристотеля» отменили.

anonymous
()
Ответ на: комментарий от WitcherGeralt

и распилили на этом две недели.

Если им это оплатили, то придурки таки не они.

monk ★★★★★
()
Ответ на: комментарий от den73

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

ya-betmen ★★★★★
()
Последнее исправление: ya-betmen (всего исправлений: 1)
Ответ на: комментарий от monk

Я не заметил в hprose типа «указатель на удалённый объект». Его нет? И я бы не сказал, что он такой уж маленький - мегабайт исходников на го.

Также не вижу никакого подобия IDL, а как без него экспорты объявлять? Смотрю на thrift - уже ближе к теме кажется.

den73 ★★★★★
() автор топика
Последнее исправление: den73 (всего исправлений: 2)

Не знаю что тебе выбрать, но grpc и protobuf отстой. Не бери их. Они генерирует говнокод, который не компилируется даже при обычном /W4 (аналог -Wall gcc, лишь самые базовые предупреждения)

При том не только в cc файлах, но даже в заголовочных файлах.

Проблема известная, авторам плевать.

Можно по этому понять какое это убожество.

8 лет вопросу на SO: https://stackoverflow.com/questions/13548478/are-there-some-better-ways-to-address-warnings-when-compiling-protocol-buffer-ge

fsb4000 ★★★★★
()
Ответ на: комментарий от den73

Вот всё, что есть: https://github.com/hprose/hprose/blob/master/3.0/serialization.spec.mediawiki

И RPC: https://github.com/hprose/hprose/blob/master/3.0/rpc.spec.mediawiki

Указатели есть только на то, что передаётся. Если нужен указатель, на что-то внешнее, то это обычное целое число.

Если нужны именно указатели на объекты, то указатель добавляешь в структуру класса.

мегабайт исходников на го.

273KB на JS https://github.com/hprose/hprose-js/blob/master/dist/hprose.src.js вместе с комментариями и реализацией Map.

monk ★★★★★
()
Ответ на: комментарий от monk

Эти два документа я посмотрел (и даже китайский автоперевёл - там вроде то же самое).

Нифига себе, значит js в 4 раза плотнее го? Но Оберон ближе к Го, чем к JS.

Если нужен указатель, на что-то внешнее, то это обычное целое число.

Это не целое число, т.к. нужно отслеживать время жизни и принимать обратно только реально существовавшие указатели, с учётом их типа.

den73 ★★★★★
() автор топика
Последнее исправление: den73 (всего исправлений: 1)
Ответ на: комментарий от monk

Не, это протокол для динамической публикации API, но ничего не говорит о том, как его описать и как сгенерировать код обвязок. Особенно, как сгенерировать его из существующих исходников (а-ля SWIG)

den73 ★★★★★
() автор топика
Последнее исправление: den73 (всего исправлений: 2)
Ответ на: комментарий от den73

Там всё про граничные случаи невалидных данных. Если ты там и гененируешь, и парсишь JSON, то ничего такого туда в принципе попасть не может. Только если руками делать кривой JSON.

KivApple ★★★★★
()
Ответ на: комментарий от den73

Не, это протокол для динамической публикации API, но ничего не говорит о том, как его описать и как сгенерировать код обвязок.

Так это от языка зависит. Для Java вот: https://github.com/hprose/hprose-java/wiki/Hello-World

Для C++ есть только клиент (на сервер, видимо, рефлексии не хватило): https://github.com/hprose/hprose-cpp/blob/master/tests/main.cpp

monk ★★★★★
()
Ответ на: комментарий от monk

Ну а на клиентской стороне только динамически тогда можно вызывать, без статической проверки. Не есть хорошо. В идеале из серверного кода (заголовочника) генерируется IDL, а из него - обвязки для клиента на любом языке, к-рые предоставляют на клиентской стороне данное API. Так сделано в SWIG для случая, когда сервер - C++

den73 ★★★★★
() автор топика
Последнее исправление: den73 (всего исправлений: 1)
Ответ на: комментарий от KivApple

У меня и библиотеки JSON нет пока что. Когда я её напишу, будет ещё один экземпляр тех же грабель, поскольку другие пользователи этой библиотеки попадут в те же граничные случаи (которые проистекают из самого стандарта). Это, конечно, жизнь, но всё же слегка демотивирует.

den73 ★★★★★
() автор топика
Последнее исправление: den73 (всего исправлений: 1)
Ответ на: комментарий от den73

В идеале из серверного кода (заголовочника) генерируется IDL, а из него - обвязки для клиента на любом языке, к-рые предоставляют на клиентской стороне данное API.

Тогда HPROSE не подходит. Там предполагается, что API не вкомпилируется в клиента. Можно сделать генератор, но готового нет.

monk ★★★★★
()
Ответ на: комментарий от den73

JSON в 99% случаев пишется машиной для машины. Ты знаешь много библиотек, которые генерируют JSON с лишними запятыми, незакрытыми скобками и числами, не влезающими в double? Такой JSON может придти только при формировании его руками и единственная твоя задача это не упасть на каком-нибудь переполнении буфера, а либо распарсить, либо выдать ошибку. Если юзер умышленно сделал невалидный JSON, то он не обидется, если в ответ на запрос сервис сделает не то, что он хочет. ССЗБ же.

Все разногласия из статье - по поводу JSON, которые этими самыми инструментами из статье сгенерировать нельзя.

KivApple ★★★★★
()
Последнее исправление: KivApple (всего исправлений: 4)
Ответ на: комментарий от KivApple

Гугловый протобаф же. Кстати, а если паскалевы структуры? Насколько они платформозависимы?

anon1984
()

Сделать на коленке, это несложно.

Нижний уровень - передача базовых типов (строк и чисел, целых и с плавающей точкой). Поверх этого можно навернуть что угодно, включая ссылки и проброс исключений с сервера.

Я так в том числе питон с плюсами вяжу, причём без сокетов, через стандартный ввод/вывод, а под него можно SSH например подложить.

AntonI ★★★★
()

т.к. придётся портировать на новый язык, в котором ничего нет

CORBA

смищно

anonymous
()
Ответ на: комментарий от AntonI

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

den73 ★★★★★
() автор топика
Последнее исправление: den73 (всего исправлений: 2)

хранить ссылки на удалённые объекты

apache thrift

ЕМНИП в Thrift не было раньше явного понятия удаленного об’екта. Можно было только адресоваться к конкретному серваку через адрес сетевого уровня, т.е. если нужны разные «об’екты», надо для каждого создавать свой рантайм сервер и вешать его на уникальный сетевой адрес. Но в Thrift IDL нет такого понятия как «ссылка на обьект», которую можно передавать как типизированный аргумент. Хотя, может быть я уже безбожно устарел…

seiken ★★★★★
()
Последнее исправление: seiken (всего исправлений: 1)
Ответ на: комментарий от KivApple

У меня есть такая проблема, как чрезмерное обобщение. Если мне json не нравится, то я в целом начинаю искать, а что ещё вместо него есть. Понятно, что это вкусовщина, но поскольку в моём языке json-а нет, то и пусть не через меня это зло туда придёт. А если где-то есть вменяемая альтернатива, так я её буду везде совать.

den73 ★★★★★
() автор топика
Ответ на: комментарий от seiken

Да, что-то в доке нету. Что ж оно всё такое убогое-то :( Или имеется в виду, что я сам должен сформировать какие-то «хендлы», которые будут вместо указателей?

den73 ★★★★★
() автор топика
Последнее исправление: den73 (всего исправлений: 1)

ссылки на удалённые объекты

какая-то компактная многоязычная библиотечка

Очень плохо сочетаются.

Можно посмотреть msgpack-rpc (очень плохо документирован)

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.