LINUX.ORG.RU

Плагинная разработка

 , , , ,


1

1

Почему каждый просмотрщик фотографий завязан на своей библиотеке-просмотрщике? Можно было бы подцеплять библиотеки как плагины: нужен jpeg - openjpeg, png - libpng и т.п. (библиотеки взяты от балды). Получается библиотека-прослойка, перенаправляющая в выбранную библиотеку. Для вызова прослойки нужно придумать уникальное имя аля getjpeg, getpng. Как я понимаю принцип работы библиотек: мы по заранее известному имени отправляем ей запрос «сделай это», она это делает и при необходимости возвращает какое-нибудь значение. Возможно, будет оверхед из-за копирования буфера по памяти, но прослойка же может создать именованный пайп и дать его имя обоим своим клиентам - работать они будут друг с другом. Не думаю, что тривиальный биндинг-библиотеку будет трудно написать неподготовленному, но заинтересованному пользователю.. Чем плоха реализация такой плагинной системы? Можно ли сделать лучше?



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

Гм, так и делают - пишут свою обертку (если таковой нет в тулките) которая форвардит вызовы ко всяким libjpeg/png/svg и т.д. Или ты думаешь что все идиоты и каждый раз пишут кодирование/декодирование форматов изображение врукопашную?

cyanide_regime
()

xkcd: 14 competing standards

anonymous
()

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

https://ru.wikipedia.org/wiki/Разделяемая_память и https://ru.wikipedia.org/wiki/Библиотека_(программирование)
П.С.
Библиотеки используются обычно.

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

Это каноничное решение, когда надо 1) унифицировать API - конкретные реализации форматов изображений все самобытные, 2) не хардкодить все в самом приложении. Лучше не придумать.

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

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

Гм, так и делают - пишут свою обертку (если таковой нет в тулките) которая форвардит вызовы ко всяким libjpeg/png/svg и т.д. Или ты думаешь что все идиоты и каждый раз пишут кодирование/декодирование форматов изображение врукопашную?

Как мне, заинтересованному пользователю, сделать так, чтоб gwenview или какой-нибудь feh работал с jpeg через другую библиотеку? Где мой выбор? О нет, feh не играет gif анимацию, показывает только 1-ый кадр - мне нужно срочно сменить его декодер. Вот эту библиотеку открытия svg изображений писали криворукие обезьяны, но мне сильно нравится именно этот просмотрщик изображений, как мне быть? В моем варианте идеальной программы я бы
как продвинутый пользователь при должном усердии запилил бы библиотеку-прослойку для функции «дай_битмап_для_этого_jpeg», но в реальности приходится жрать кактусы и использовать для gif-ок другую программу. Всё прибито гвоздями..

zusazo
() автор топика
Ответ на: комментарий от yoghurt

Это каноничное решение, когда надо 1) унифицировать API - конкретные реализации форматов изображений все самобытные, 2) не хардкодить все в самом приложении. Лучше не придумать.

Т.е. при наличии библиотеки-прослойки всё-таки будет оверхед по памяти из-за копирования возращаемого результата (битмап)?

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

Это про просмотрщик изображений, при компиляции которого указываем необходимую, но поддерживаемую библиотеку.. use флагами? Интересное решение, но разработчик вместо поддержки полезного кода программы будет сотнями пилить биндинги к различным даже не сильно популярным библиотекам, каждый раз проверять их актуальность состояния и поддерживать - слишком всё сложно, лучше вынести «переименование getjpeg в super_converter_jpeg_to_bitmap» через библиотеку-плагин на пользователя. Те, кого устраивает стандартный функционал, не будут лезть в дебри. И всё-таки при таком подходе какие есть недостатки в производительности по сравнению с обычной программой, батарейки которой прибиты гвоздями и могут протухнуть?

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

Т.е. при наличии библиотеки-прослойки всё-таки будет оверхед по памяти из-за копирования возращаемого результата (битмап)?

Как напишешь, так и будет.

Интересное решение, но разработчик вместо поддержки полезного кода программы будет сотнями пилить биндинги к различным даже не сильно популярным библиотекам, каждый раз проверять их актуальность состояния и поддерживать - слишком всё сложно, лучше вынести «переименование getjpeg в super_converter_jpeg_to_bitmap» через библиотеку-плагин на пользователя.

Много ли пользователей пишут плагины к приложениям, которые используют? Как я уже сказал, программно суть остается прежней, и ответственность в обоих случаях на разработчике (плагина/приложения). А зачем тут биндинги, я вообще не понял.

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

Ну как продвинутый пользователь открывай IDE и пилите, Шура, пилите.

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

О нет, feh не играет gif анимацию, показывает только 1-ый кадр - мне нужно срочно сменить его декодер.

А тебя не смущает что анимацией занимается гуй, а не декодер?

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

Как мне, заинтересованному пользователю, сделать так, чтоб gwenview или какой-нибудь feh работал с jpeg через другую библиотеку?

Подсунуть ее в пути поиска либ?

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

Подсунуть ее в пути поиска либ?

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

zusazo
() автор топика
Ответ на: комментарий от yoghurt

Т.е. при наличии библиотеки-прослойки всё-таки будет оверхед по памяти из-за копирования возращаемого результата (битмап)?

Как напишешь, так и будет.

1. По идее вызывется прослойка, потом вызывается библиотека и это всё вроде копируется каждый раз в памяти. Нужно примерно раз в несколько секунд таскать от 1МБ до 5МБ информации. Может оптимальнее будет создать прослойкой именованный пайп и выдать его имя программе и конечной библиотеке? Или лучше общую память использовать - она всё равно в проекте будет служить небольшим кешем. Какой путь менее затратен в плане производительности?
2. Можно ли без библиотеки-прослойки реализовать следующее: мы знаем, что результатом вызова библиотечной функции будет массив, но мы не знаем имя этой функции, не знаем используемые переменные и их количество, нужно сделать так, чтоб пользователь через конфигурационный файл мог сам писать обращение к функции аля stelayeto(5, 6, «hello»). Потом наша программа парсит эту строку и делает из нее запрос к библиотеке с указанными параметрами. Реализуемо ли такое? Если такой подстановкой нельзя, то может ли пользователь другим способом задавать количество параментров и их значения? Как будет в программе тогда будет вызываться эта «неведомая» функция?

zusazo
() автор топика
Ответ на: комментарий от yoghurt

Ну и, это, динамические библиотеки со своими приложениями живут уже в одном адресном пространстве, память и так общая

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

2) можно, например через libffi

Как это все будет выглядеть? В библиотеку нужно отправить массив, в текстовом файле будет строка stelayeto(massiv, 6, «hello»). Так, massiv мы подменяем на переменную-массив, значения дополнительных параметров (число и строка hello) отправляем неизменными. Получается пользователь тем самым указал имя функции, количество параметров и их порядок следования. Как из этого теперь сформировать запрос к библиотеке? Использоваться будет яп rust.

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

Использоваться будет яп rust.

Не знаю, что у раста с ffi и нужен ли он ему вообще, но в целом алгоритм такой

1) dlopen
2) dlsym
3) libffi

Рекомендую почитать УЖЕ по каждому пункту документацию, ну и ещё на всякий - про x86 calling conventions.

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