Amigun
@Amigun
Джун : |

Как будет работать система плагинов, при условии что плагины можно писать на разных языках?

Давно ломаю голову над тем, как реализовать систему плагинов в своей программе да так, чтобы эти сами плагины можно было писать на разных языках?
Сначала искал вообще про систему плагинов, и набрел на эту статью, хоть там и приводится в пример язык Python, стало ясно, что плагину передается экземпляр основного класса, и плагин может модифицировать его поля и т.д. Но проблема в том, что по такой системе, плагин можно написать только на том языке, на котором написана сама программа... или нет?
Допустим у меня есть программа на C++, как я могу реализовать систему плагинов так, чтобы я или кто-то другой мог написать плагин, используя другой язык (Python, Rust, Go, JS, etc.)?
  • Вопрос задан
  • 392 просмотра
Решения вопроса 2
@rPman
в комментариях к вопросу все что надо уже сказали.
Первая проблема - хранение данных (переменные, структуры, объекты), вторая - код.

1 вариант -. первую проблему предлагали решить стандартом сериализации а вторую - принципиально - пусмть каждый плагин запускается по своему отдельным процессом, и использует какой то способ коммуникаций с основной программой (сеть, IPC и т.п.)

2 вариант - свести все разнообразие используемых языков программирования к одному (например байткоду), и использовать общий фреймворк, если это позволено, такое есть как для java jvm, так и для .net clr (c#, cpp#, vb#, python#,...) или более современно и предпочтительнее (быстрее, больше возможностей и прочее но и сложнее) - llvm, правда с общим фреймворком будет сложнее.
В этом варианте код плагинов скорее всего должен будет подгружаться в рантайме используя идеологию dinamic link library, но не обязательно.

Интересным вариантом может быть линковка во время сборки проекта (не во время выполнения, т.е. потребуется перезапуск, в подавляющем больинстве случаев загрузка плагина на лету не требуется, dll чаще используется как инструмент организации хранения и распространения), отличным примером являются объектные файлы компиляции c/c++ компилятора (на самом деле есть компиляторы и для других языков, даже python с помощью nuitka переводится в c++) и уже на месте с нужной конфигурацией все они собираются линкером в один запускаемый бинарник, и при этом исходные коды не распространяются а процес сборки проходит достаточно быстро (он понадобится при смене конфигурации плагинов или обновлении версии какого либо одного из списка)
Ответ написан
@Akela_wolf
Extreme Programmer
Серебряной пули нет. Поскольку каждый язык имеет свои особенности, то все не так просто.

Поскольку речь о C++, то, я полагаю, речь идет о компилируемом в машинный код проекте. И тут, что в Windows, что в Linux, существуют динамически загружаемые библиотеки: dll и so. Собственно динамически загружаемая библиотека может быть написана на любом языке, важно чтобы она соответствовала некоторому ABI, которое определяет программа. Собственно это все что требуется от плагина. И такой плагин можно писать на C++, Pascal, Go, Haskell, Rust и даже ассемблере (вообще говоря на всем что поддерживается компилятором LLVM).

С другой стороны находятся языки, компилируемые в байт-код. Такие как Java. Чтобы поддержать плагины на Java потребуется написать собственную подсистему, которая будет запускать JVM и оборачивать её в интерфейс плагина. Громоздко и медленно, на мой взгляд большого смысла не имеет. Если хочется писать плагины на Java, то и саму программу имеет смысл разрабатывать на Java. И тогда к вашим услугам весь спектр JVM-языков: Java, Scala, Kotlin, Groovy, Clojure, Jython.

Аналогичная история с платформой .NET

Плагины на скриптовых языках, таких как LUA - можно встроить интерпретатор прямо в программу (это для них родной путь)

Ну и, наконец, отдельно стоят языки, которые "вещь в себе", такие как PHP, Javascript. С ними плагины вряд ли легко сделать, только если, аналогично JVM/.NET делать "обертку" над средой выполнения. Но опять же, большого смысла не имеет.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@d-stream
Готовые решения - не подаю, но...
По сути - достаточно просто исключить термин "плагин" и всё становится на свои места.
Просто применяем термин "нечто". После этого готовим механизм вызова этого нечто и api с которым это нечто должно уметь взаимодействовать. Профит. Это нечто может быть написано даже на языках программирования, которые придумают в 2025 году)
Естественно чтобы всё это взлетело - не помешает так же выступить автором заготовок/фреймоков для большинства яп.
Ответ написан
Комментировать
@Miron11
Пишу sql 20 лет. Срок :)
nothing can be easier.
in the end all you need, is have your mind work through the following point "what it means to have plugin and what it means to the application that launches this plugin"
to my understanding, all there is to it is electronic data interchange protocol, EDI.
For EDI first thing you define is "what"
Second thing you define is "how"
And the last, the third one, is you define, depending on your application very special needs is "when".
---
To tally thing up and to clarify, where you stumble at the moment, on my mind, is you are trying to explore and come to definitive conclusion with regards to point, that has no real bearing on what you need to do, what you are asking is "which".
That is simply is a moot point.
---
Now, that above points simplify and somewhat layout fundamentals, one usually picks and chooses from toolchest what to do.
What should be the format of EDI between main application and plugin ( or subfeature )? -
a. none
b. CSV, Excel, Flat, TSV, LLVT, Parquet, Fixed Width ... ... ... yada yada yada - THE FILE
c. database, well, I am fun of SQL Server, but you are more likely to prefer Postress or Oracle? ( smile )
d. there is always a network way, which can be as simple as raising HTTPServer, however this idiom is implemented in the form of class in the language of your choice, followed by using Get, Post, Put, Delete ( my vocabulary of RESTFull verbs is limited, but it is readily available on the Yandex ), yes, one can open a socket ( whatever that means ) and then there are yet more ways, IPC, Shared Memory ( now, don't really use this last one, it never works well even within same language application, unless you really know what and how to do here )
this point d can be further extended and deliniated.
It can be local ( yes, the localhost, IP Address 127.0.0.1 exists!!! I have seeing it, and it's there, and I can prove it to you in 30 seconds, even if you are in Africa! And then there is network, sometimes, and when there is network there is yamm yamm yamm cloud ( this is where warm and fuzzy feelings usually start to flow ).
And the nice thing about point d, particularly RESTFull, it works and it is easy, and it can be done practically in any language today, more or less.
If I haven't annoyed you at this moment, it would probably mean that you are invariably damaged person when excessive beliefs in technology, go out and have a nice and long walk.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы