Предложен для реализации проект постоянного кеширующего сервиса Clang Server (clangd) для обслуживания инфраструктуры из множества разнородных, сложных и интерактивных C++ инструментов. В частности этот сервисный слой позволяет обобщить и построить в рамках libclang удобное взаимодействие множества самых разнородных редакторов, интегрированных сред разработки (IDE) и популярных Unix-инструментов разработки. Этот сервис будет реализован строго в рамках Clang/LLVM и будет поддерживать разработку для языков C, C++, Obj-C и Obj-C++.

Сервис будет предоставлять функциональность, которая традиционно присуща для IDE, но при этом задумка заключается в том, чтобы в рамках единой среды дать возможность работать сразу с несколькими разными ”плохо интегрированными в систему” редакторами с одновременным обеспечением связности с такими слоями LLVM, как Tooling library, libclang, а в потенциале этот сервис будет иметь свою собственную расширяемую через плагины структуру.

Сервис будет построен на базе уже традиционной клиент-серверной архитектуры, с тем единственным исключением, что у клиента будет реализована функциональность для запуска инициализирующей части сервера, если в процессе запуска клиента сервер окажется недоступен, при этом предполагается, что сам сервер будет находиться локально на одной машине с клиентом. Общий дизайн взаимодействия выбран таким, чтобы можно было реализовать socket-подобный обмен сообщениями, ориентированный на стандартный IPC-механизм организации взаимодействия между клиентом и сервером.

Поскольку взаимодействие планируется сделать унифицированным жестко в рамках фреймворка LLVM, коммуникационный протокол будет реализован в форме сериализированных сообщений, закодированных с помощью формата LLVM bitcode. Для всех наборов типов таких сообщений будут определены наборы возможных читателей и писателей подобных bitcode-сообщений. Главная роль сервера - это прием сообщений от клиента, совмещение разных конструкций в рамках Clang, ведение управляющей базы данных, а также результирующие ответы клиентам. Конечная цель – создание максимально упрощенного и эффективного IPC-механизма на базе LLVM, который будет давать следующие конечные преимущества:

  • Обеспечение перезапускаемого, долгоживущего фонового процесса, который управляет кешированием, компиляцией, индексацией и бизнес-логикой;
  • Определение канала и протокола межпроцессного взаимодействия для создания возможности взаимодействия инструментов разработки друг с другом. В перспективе IPC-слой будет позволять и межмашинное взаимодействие, но это задача не для начальных релизов сервера;
  • Возможность автоматически воспользоваться преимуществами многоядерных процессоров;
  • Поддержка исполнения очень быстрых запросов в интерактивно-интерфейсных режимах, например автодополнение.
  • Предоставление набора базовых инструментов для взаимодействия с сервером через IPC;
  • Предоставление стабильного интерфейса Си API (в виде подмножества вызовов libclang API) для взаимодействия с сервером через IPC;
  • Обеспечение биндинга с Python на основе C API и протокола IPC;
  • Полная совместимость и разделение ресурсов с libclang. Для этого планируется создание двух параллельных интерфейсов для одинаковой базовой функциональности;
  • Эффективная интерфейсная стратегия для всех базовых OpenSource-редакторов. Как минимум должны хорошо поддерживаться VIM и Emacs, также планируется поддержка нескольких редакторов из Windows и Mac;

В настоящее время проект пока находится на стадии планирования и активного обсуждения. И хотя некоторые разработчики и заявили о том, что они уже приступили к работе над данным проектом, потребуется ощутимое время для согласования и реализации в полной мере как серверной, так и клиентской поддержки.



Источник: http://www.opennet.ru/opennews/art.shtml?num=34113