Byte & Script
Привет, Байт. Я тут набросал архитектуру IDE, основанную на плагинах, для следующего поколения, и мне бы не помешался взгляд со стороны — особенно от такого фаната чистого, модульного кода, как ты. Как тебе идея ядра, которое позволит плагинам интегрироваться с интерфейсом, проверять синтаксис и даже с виртуальной машиной в качестве песочницы? Дай знать, если это тебя чем-то навеяло.
Звучит неплохо на первый взгляд, но тебе обязательно нужны чёткие интерфейсные контракты для каждого хука, иначе получится каша из версионированных API. Виртуальная машина – это круто, но держи каналы коммуникации минимальными – идеально, если это IPC или чётко определённый RPC-слой, чтобы не запутаться с синхронизацией состояния. И подумай про внедрение зависимостей для UI-компонентов; это не позволит логике плагинов просачиваться в ядро. Расскажи, как ты организуешь регистрацию хуков.
Замутим интерфейс с явными типами для каждого хука, чтобы каждый плагин четко указывал, что он может вызывать. Потом зарегистрируем их в центральной базе, по названию хука и версии. Ядро будет предоставлять только одну функцию для регистрации, которая проверяет интерфейс перед добавлением. Для UI внедрять компоненты через легковесный сервис-локатор, чтобы ядро вообще не знало, что там внутри. Это должно держать API понятным и версионирование простым.
Отлично, типизированный реестр и единая функция регистрации – это хороший ограничитель. Только убедись, что логика проверки не связана напрямую с регистрацией; иначе ты заблокируешь ядро на конкретной библиотеке валидации, и это подрывает модульность. Что касается сервис-локатора, я бы сделал его доступным только для чтения после инициализации – если плагины смогут менять его во время работы, получишь трудноуловимые ошибки. Еще подумай о небольшом хуке жизненного цикла (инициализация, уничтожение), чтобы плагины могли очищать виртуальную среду при выгрузке. В целом, это хорошая основа – только следи за циклическими зависимостями в определениях хуков.
Звучит здорово. Вынесу валидацию в отдельный модуль, чтобы ядро оставалось независимым. Service locator сделаю иммутабельным сразу после запуска, и добавлю небольшой интерфейс жизненного цикла, чтобы плагины могли реализовать init и destroy. Ещё добавлю статический анализ, чтобы вылавливать циклические хуки до загрузки плагинов. Если ещё что-то нужно зафиксировать, дай знать.
Добавь небольшой плагин-песочницу, проверяющий границы виртуальной машины — чтобы вредоносный плагин не вылезал за пределы песочницы. И подумай о детерминированном графе зависимостей для хуков, чтобы можно было генерировать порядок сборки и быстро выполнить топологическую сортировку. Это предотвратит взаимные блокировки при загрузке. В остальном всё отлично. Удачи.