Зед: Реализация заветной мечты редактора с помощью Rust
Зед: Реализация заветной мечты редактора с помощью Rust

Эта статья не Zed Объявление редактора, но хотелось бы изучить Zed за командойизделовая мотивацияистек технологий。Не начинайте войну редакторов из-за этой статьи!

Введение в редактор Zed

Zed[1] представляет собой продукт, изготовленный из Atom[2] и Tree-sitter[3] Высокопроизводительный многопользовательский редактор кода от создателей .

Atom,да GitHub Текстовый редактор, созданный . Сидящий на дереве да Rust Реализован инкрементный парсер.

Zed излозунгда «Написание кода со скоростью мышления» — этот лозунг передает как минимум следующие понятия:

  1. Быстрый ответ:этотиндивидуальныйлозунгнамекать Zed Редактор Иметь чрезвычайно высокийизпроизводительностьи Скорость ответа,Те, кто умеет иразвивать, могут идти в ногу со скоростью своего мышления. существоватьфактическоеиспользовать середина,этотиметь в Имейте в виду, независимо от редактирования кода、Навигация и другие операции могут выполняться быстро.、Сделано гладко.
  2. Повышение эффективности:лозунгподчеркивать Понятно Zed Целью является повышение эффективности кодирования. Оптимизируя использование пользовательского интерфейса и интеллектуальных функций, Zed позволяет авторам быстрее реализовывать идеи,Сократите время ожидания и избыточные операции.
  3. Акцент на интуитивность и простоту использования:“думатьизскорость”этот一表述还намекать Понятно Zed излегкийиспользоватьсексиинтуициясексдизайн。этотиметь в видуиспользовать Интуитивно понятный пользовательский интерфейслегкий Понимать,Разумная функциональная планировка,Дайте возможность человеку действовать инстинктивно,Не нужно тратить много времени на обучение и адаптацию.
  4. Улучшите креативность:этотлозунгтакже показывает Zed Редактор поддерживает и вдохновляет развитие творчества. Предоставляя эффективные инструменты и удобство работы, Зед помогает развитию больше сосредоточиться на творчестве и решении проблем.,Вместо того, чтобы беспокоиться о тривиальных операциях.
  5. Адаптироваться к современным потребностям программирования:существовать Сегодняшний быстрый темпизпрограммное обеспечениеразвиватьсредасередина,Этим лозунгом Zed демонстрирует свою приверженность пониманию и удовлетворению потребностей современного развития в быстрых и эффективных инструментах.

Zed в настоящий моментиз ХарактеристикадаХорошая производительность,Независимо от задержки вставки, времени запуска или использования памяти,,Вседа Подобные компиляторыи IDE серединаЗанимает наименьшее количество временных и пространственных ресурсовиз。

Zed Предлагает некоторые другие редакторв настоящий моментеще нетизКонцепция современного развития

  • Поддержка командной работы (команда программного обеспечения из виртуального офиса). Зед Через канал и CRDTs Поддержка совместной работы нескольких человек означает, что в команде разработчиков может быть несколько человек, одновременно изменяющих один и тот же файл, и они могут одновременно общаться и обсуждать.
  • Интегрированный AI Вспомогательное кодирование. поддерживать GitHub Copilot и GPT。
  • Zed также поддерживает режим Vim, настраиваемые сочетания клавиш и т. д.

В общем, Зед в настоящий момент «Дайте мне опыт» и Этот слоган более последователен и подчеркивает его цель — обеспечить беспрепятственное и эффективное программирование. Зед После трех лет разработки вчера его исходный код был открыт, а стабильная версия была выпущена для скачивания.

История развития Зеда

Начни с рентгена

Основная идея Zed зародилась как внутренний проект GitHub под названием Xray в 2018 году.

Xray[4] да GitHub Atom Проект, разработанный командой ранее Electron текстовый редактор, потому что Atom После запуска Редактора производительность подверглась критике со стороны пользователей сообщества. Проблема с производительностью особенно очевидна при загрузке больших файлов, поэтому. Atom Команда разработчиков надеется пройти WebGL Переопределите интерфейс. Но они не хотят отказываться Электрон, потому что они верят Electron Также даразвивайте кроссплатформенный расширяемый интерфейс лучшей из технологических платформ. и Xray Начать выбор Rust достичь.

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

Xray Два главных создателя Nathan и Antonio существовать 2019 Канун Нового года 2020 Год начал их заново реализовывать изновыйиз Редактора, просто да Zed и GPUI(Zed для внутреннего использования GUI библиотека) прототип.

2020 Год Nathan полученный Warp[5] (Rust реализованный терминал) изпредложение о работе, но он существует Warp Я уволился через три месяца.,Потому что он никогда не мог отказаться от своей мечты создать совершенный Редакториз.

Поэтому он собрал Антонио Еще одна разработка Max , трое из них начали с 2021 Год начал работать полный рабочий день Zed разработка.

приезжать 2022 Год 3 Мун, Зед Команды перестают работать за закрытыми дверями и начинают строить Alpha Сообщество публичной бета-версии постепенно расширяет круг пользователей, чтобы подготовиться к публичной бета-версии. Сейчас эта стратегия кажется довольно хорошей, и это тоже правда. исходный код Деловому сообществу стоит изучить стратегию. Не да, и другие продукты полностью закончены и затем ориентированы на потребителей, но давайте попытаемся продвигать эту идею. Редактор Zed с открытым исходным кодом,Zed Сообщество представит новую группу пользователей.

Zed РедакторизИнструкции по лицензии с открытым исходным кодом

  1. Совместная лицензия на авторские права:Zed изкодиспользоватьсовместное авторское право(Или“copyleft”)излицензия Способ。этотдобрыйлицензия Способиз Функциида,Любые производные работы, основанные на этом коде, должны быть выпущены под идентичной или совместимой лицензией. Это гарантирует, что любые улучшения или расширения исходного кода принесут пользу всему сообществу.,Вместо того, чтобы быть закрытым или приватизированным.
  2. РедакториспользоватьGPLлицензия:ZedРедактор Выбери это самиспользовать ПонятноGNU Проходитьиспользоватьобщественныйлицензиясертификат(GPL)。GPL Он также широко используется и распространяется лицензия на авторские сертификат права, который требует любого выпуска на основе GPL Код лицензии из производных работ также необходимо использовать. GPL Лицензия. Это означает, что если другой продукт модифицирует Zed Редакторские коды, они должны существовать GPL Эти модификации публикуются по лицензии.
  3. Серверные компонентыиспользовать AGPL лицензия:Zed изсерверные компонентыиспользоватьизда GNU Affero Генеральная общественная лицензия (AGPL). АГПЛ и GPL Аналогично, но с одним ключевым отличием: если AGPL Если программное обеспечение работает как сетевая служба, лицо, предоставляющее услугу, должно предоставить пользователям доступ к исходному коду, даже если они не изменяли код. Этот сертификат лицензии по выбору означает, что любой Zed Серверные компоненты и веб-службы должны предоставлять исходный код своим пользователям.

Zed Channel : Fireside Hacks

Zed использовать Channels запустить программу под названием Fireside Hacks из Новый проект, существование Этот проект середина, глобальное развитие может существовать как публичный канал серединаи появляются из всех вместе в режиме реального времени Zed。

Я думаю, Зед Channel может быть Открытый исходный код社区贡献带来一добрый全новыйиз Способ:Открытый исходный код проекта от сопровождающих может пройти Zen Редакторы Новинки участников проекта, общение и рекомендации в режиме реального времени.

Бизнес-модель Zed с открытым исходным кодом

Может быть и основательсуществовать Wrap Опыт работы в компании, Зед из Бизнес-модели Wrap похожий:Бесплатно для частных лиц и поэтапная оплата, командный сбор。В будущем, специфичные для предприятияиспользоватьпродукт。

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

Zed Также доступен AI Функция, это также способ дополнительной оплаты. Шепот: Обернуть AI дабесплатноиз。

Зед также обещает никогда не размещать рекламные баннеры на нашем сайте.

Это все Zed Текущее видение бизнес-модели и надежды команды Zed Лучше приезжать, в конце концов, использование любит производить электричество и не может длиться долго.

Взгляд на технологический стек Zed

Zed обладает высокой производительностью и поддерживает совместную работу нескольких человек. Секрет заключается в следующем технологическом стеке:

  • Поддержка асинхронного параллелизма в Rust
  • CRDTs
  • Инкрементный парсер
  • GPUI

Поддержка асинхронного параллелизма в Rust

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

CRDTs

CRDTs(Conflict-Free Replicated Data Types,Бесконфликтное копирование типа) да специальная изданная структура,использовать Всуществоватьраспределенная системасередина синхронизации и хранения данных. Таким образом, несколько реплик могут обновляться независимо, а затем эти обновления объединяются, чтобы гарантировать, что все реплики в конечном итоге согласованы. CRDT из Ключевые характеристики да Они существуют в конструкции, позволяющей работать параллельно и независимо на разных узлах без необходимости немедленной центральной координации или блокировки середина.

CRDT из основных функций

  1. Автоматическое разрешение конфликтов:CRDTsВозможность автоматического решения проблем между несколькими копиямиизданныеконфликт,Нет необходимости в сложных механизмах обнаружения и разрешения конфликтов.
  2. Сильная конечная последовательность:尽管各индивидуальный副本可以独立更новый,но CRDTs Гарантируется, что все реплики в конечном итоге достигнут согласованного состояния.
  3. Автономная работа и допуск задержки:CRDTsподходящийобъединить ВУсловия сети нестабильныизсреда,Может поддерживать работу в автономном режиме,Затем синхронизируйте изменения обратно в кластер.
  4. Нет необходимости в централизованной координации:и Традицияизнуждатьсясерединацентральный сервер для координацииизапираниеизданные Различные структуры,CRDT позволяют независимо обновлять несколько реплик.

CRDT в основном делятся на две категории.

  1. CvRDTs(Convergent Replicated Data Types):Проходить过同步整индивидуальный状态来保сертификатокончательный консенсуссекс。подходящийиспользовать ВПропускная способность недавопрос,Но в сценариях допуск на задержку высок.
  2. CmRDTs(Commutative Replicated Data Types):Проходитьоперация сверхраспространения(а не статус)для достижения последовательностисекс。подходящийобъединить ВОграниченная пропускная способность сети,Но ему необходимо быстрее реагировать на сценарии.

CRDTs из Сценарии применения

  1. распределенная система:существовать Синхронизация между несколькими узламиданныечас,CRDTs Обеспечивает эффективный способ борьбы с задержками и перегородками в сети.
  2. Совместное редактирование:CRDTsОченьподходящийобъединить ВРеальностьчас Совместное Инструменты редактирования, такие как строковая документация Редактор, могут гарантировать, что изменения, вносимые разными пользователями, не конфликтуют друг с другом.
  3. Офлайн-приложение:существовать Необходимость поддержки автономной работыизотвечатьиспользоватьсередина,CRDT позволяют пользователям работать без подключения к сети.,В дальнейшем существующие синхронизирует изменения при повторном подключении.

существовать Zed Редакторсередина, каждый буфер (Редакториспользовать пользователь открывает содержимое файла из области памяти) один CRDTs структура。использовать CRDTs да Для поддержки нескольких пользователей в режиме реального времени функция редактирования. проходить CRDTs,Редактор может гарантировать, что даже если условия сети нестабильны из-за,Несколько изменений также можно объединить без конфликтов.,Поддерживать целостность и полноту документации. Это позволяет членам команды одновременно работать над одним и тем же документом.,Не нужно беспокоиться о конфликтах редактирования или отсутствующих файлах.

Инкрементный парсер

Tree-sitter да Zed Еще один соучредитель работ, также даразвивавший много Года. Он реализует парсеры специально для написания Редактор. Потому что исходный код часто меняется и требует быстрого повторного анализа, а правильно написанный код может быть неполным, но его все равно необходимо правильно анализировать. Другие существующие парсеры не обладают достаточной производительностью для поддержки этого сценария. Zed из Идеал.

Tree-sitter использовать контекстно-свободную грамматику точной формы для анализа принятого кода; использовать тип, называемый обобщенным. LR Разобрать (или GLR)изалгоритм,Поддерживает практически любойпрограммированиеязыкизграмматика。иПоддерживает инкрементный синтаксический анализ, позволяющий эффективно анализировать существующее содержимое после редактирования.,и具有一добрыйновый Иньизметоды восстановления ошибок,Даже если файл находится в недопустимом состоянии,Анализатор также может выдавать результаты использования.

Расширить знания

Zed середина использовать Sum Tree Для хранения абстрактного синтаксического дерева (AST), созданного после анализа. существовать Zed середина также широко используется для хранения упорядоченных коллекций.

"Sum «дерево» (иtree) даа изданные структуры особого типа, имеющие B-дерево (B-дерево) и копирование при записи (при написании копировать) и характеристика. Эта структура данных обычно используется для эффективного управления переменными данными, особенно в тех случаях, когда необходимо оптимизировать производительность чтения и записи в сценариях середина.

  1. Функции B-дерева:B Дерево да — это самобалансирующаяся древовидная структура данных, которая может поддерживать порядок данных и подходит для хранения и извлечения больших объемов данных. Б Деревья работают, сохраняя несколько ключей и ссылок на подузлы на каждый узел. Это делает B Существующая библиотека данных дерева и файловая система середина очень эффективны, особенно при работе с большими наборами данных.
  2. Характеристики копирования при записи:Писатьчаскопироватьдастратегия оптимизации,Его система середина существует только при необходимости копировать объекты. когда объект модифицируется,Не вносите изменения непосредственно в исходный объект.,И да создает новую копию и вносит изменения в существующую копию. Этот метод помогает сократить ненужные изданныекопирования.,Повышена эффективность операций модификации.

Как работает дерево сумм:

  1. Ведение агрегированной информации:Sum дерево из ключевой характеристикисуществовать Каждый узел поддерживает некоторую форму агрегированной информации (например, поддерево из общего числа, максимального или минимального значения и т. д.). Это позволяет быстро запросить все дерево или его подмножество или агрегировать информацию.
  2. Оптимизация операций чтения и записи:объединить B Дерево упорядоченности и копировать оптимизацию времени записи, сумма tree Он может поддерживать эффективное чтение, одновременно уменьшая потери производительности, вызванные операциями модификации.

Сценарии применения

  • контроль версий:существовать Нужно часто читатьи Вносите периодические правкиизсистемасередина,Такие как система контроля управления,sum Дерево может обеспечить эффективный доступ к записям изменений.
  • индекс базы данных:данные Библиотекасерединаиз Индекс можетиспользоватьsum дерево для быстрого расчета результатов запроса диапазона, например, для поиска максимального значения приезжать в пределах определенного диапазона.

GPUI

Современные мониторы имеют частоту обновления от 60 приезжать 120 кадров в секунду,этотиметь в виду一индивидуальныйотвечатьиспользовать Каждый кадр программы имеет только8.33миллисекундаизчаснажимать пикселиприезжать Экран。этот Включает в себя большеновыйотвечатьиспользоватьстатус программы,Макет элементов пользовательского интерфейса,Наконец данные записываются в фреймбуфер.

Для выступления Редакториз занимайте это 8.33 Миллисекунды означают для пользователей плавный и плавный отклик. Поэтому Зед Решил разработать сам GUI Рамку и общую идею нужно будет визуализировать. Zed изиспользовать Пользовательский интерфейс из Написание собственных шейдеров для каждого конкретного графического примитива. По существу CPU Опишите атрибуты каждого примитива на основе данных, делегируя всю тяжелую работу GPU, существуют там параллельные рисунки UI элемент.

текущий Открытый исходный кодиз Zed GPUI Пережила капитальную реконструкцию и вторая версия. существуют первое издание GPUI серединаиспользоватьиздапохожий Flutter из макета. После реконструкции использование продукта станет более гибким. Flexbox Гибкая планировка. использовать изда Rust библиотека макетов DioxusLabs/taffy[6]

в настоящий момент Zed Поддерживает только Mac из-за причины, текущий нижний слой GPU Платформа поддерживает только Metal платформа, основанная на gfx-rs/metal-rs[7] из библиотеки для работы Metal 3D Graphics API. Но с точки зрения реализации исходного кода Зед существующие уже хорошо поработали над кроссплатформенной абстракцией в архитектуре, но, по оценкам, Windows и Linux Поддержка появится не скоро, поскольку код конкретной реализации платформы еще не написан.

Zed Автор: Team существует GPUI изпроцесссередина Самая большая проблема — это Rust изсобственность。Как использовать Rust изхарактеристика для динамического выражения реального мира в графическом интерфейсе, да Zed Большой вызов для команды

Zed В настоящее время команда изучает методы существования: GPUI середина, следует использовать программу серединаиз Каждая модель или представление фактически представлены программой под названием AppContext из Объект верхнего уровня владеет。当创建一индивидуальныйновыйизмодель или вид(сущности)час,Передача ему права собственности на приложение,Чтобы он мог участвовать в различных службах приложений и взаимодействовать с другими объектами.

Язык кода:javascript
копировать
use gpui::{prelude::*, App, AppContext, Model};
 
struct Counter {
    count: usize,
}
 
fn main() {
    App::new().run(|cx: &mut AppContext| {
        let counter: Model<Counter> = cx.new_model(|_cx| Counter { count: 0 });
        // Call `update` to access the model's state.
     counter.update(
      cx, 
   |counter: &mut Counter, cx: &mut ModelContext<Counter>|
    {
          counter.count += 1;
    }
  );
        // ...
    });
}

Для иллюстрации рассмотрим простой пример кода выше. По вызову run чтобы запустить приложение и передать функцию обратного вызова (закрытие), которая получает AppContext известииспользовать,Должен AppContext Иметь все статусы прикладной программы, использовать. этот AppContext да Доступ ко всем службам и входам уровня приложения, таким как открытие окон, отображение диалоговых окон и т. д. у него также есть new_model Метод, существующий, вызывает его для создания модели и передачи права собственности на нее программе.

вызов new_model Возвращает дескриптор модели, содержащий параметры типа, на основе типа объекта, на который указывает ссылка. В одиночку использовать это Model<Counter> Дескриптор не может получить доступ к модели из состояния. Это просто ленивый идентификатор плюс метка типа во время компиляции, и он поддерживает базовый код, принадлежащий прикладной программе. Counter Счётчик использования объекта.

Чтобы обновить счетчик, вызовите update ,Передайте ссылку на контекст в функцию обратного вызова. Для переменной счетчика referenceuse предусмотрена функция обратного вызова.,Вы можете использовать его для управления статусом.

GPUI Существуют также внутренние реализации режима наблюдателя и режима подписки для изменения состояния и распределения событий. Подробнее о графическом процессоре Внутреннее управление состояниемиз Контент можно просмотреть максимальноновыйиз Официальный блог:gpui-ownership[8] . Официальная команда раскроет более подробную информацию о реализации в будущем.

Другие редакторы, реализованные на Rust

  • https://xi-editor.io/ 100[9]
  • https://helix-editor.com/ 92[10]
  • https://kakoune.org/ 63[11]
  • https://lapce.dev/ 70[12]
  • https://amp.rs/ 63[13]
  • https://zee.rs/ 109[14]
  • pepper | A simple and opinionated modal code editor for your terminal 55[15]
  • GitHub - neovide/neovide: No Nonsense Neovim Client in Rust 38[16]

Здесь нет никакого сравнения.

boy illustration
Почему транзакция не вступает в силу, когда @Transactional добавляется в частный метод?
boy illustration
Знание создания образов Docker: подробное объяснение команды Dockerfile.
boy illustration
Псевдостатическая конфигурация ThinkPHP
boy illustration
Код изображения для загрузки апплета WeChat: последний доступный (код серверной части + код внешнего интерфейса)
boy illustration
Используйте растровое изображение Redis для реализации эффективной функции статистики регистрации пользователей.
boy illustration
[Nginx29] Обучение Nginx: буфер прокси-модуля (3) и обработка файлов cookie
boy illustration
[Весна] SpringBoot интегрирует ShardingSphere и реализует многопоточную вставку 10 000 фрагментов данных в пакетном режиме (выполнение операций с базой данных и таблицами).
boy illustration
SpringBoot обрабатывает форму данных формы для получения массива объектов
boy illustration
Nginx от новичка до новичка 01 - Установка Nginx через установку исходного кода
boy illustration
Проект flask развертывается на облачном сервере и получает доступ к серверной службе через доменное имя.
boy illustration
Порт запуска проекта Spring Boot часто занят, полное решение
boy illustration
Java вызывает стороннюю платформу для отправки мобильных текстовых сообщений
boy illustration
Практическое руководство по серверной части: как использовать Node.js для разработки интерфейса RESTful API (Node.js + Express + Sequelize + MySQL)
boy illustration
Введение в параметры конфигурации большого экрана мониторинга Grafana (2)
boy illustration
В статье «Научно-популярная статья» подробно объясняется протокол NTP: анализ точной синхронизации времени.
boy illustration
Пример разработки: серверная часть Java и интерфейсная часть vue реализуют функции комментариев и ответов.
boy illustration
Nodejs реализует сжатие и распаковку файлов/каталогов.
boy illustration
SpringBootИнтегрироватьEasyExcelСложно реализоватьExcelлистимпортировать&Функция экспорта
boy illustration
Настройка среды под Mac (используйте Brew для установки go и protoc)
boy illustration
Навыки разрешения конфликтов в Git
boy illustration
Распределенная система журналов: развертывание Plumelog и доступ к системе
boy illustration
Артефакт, который делает код элегантным и лаконичным: программирование на Java8 Stream
boy illustration
Spring Boot(06): Spring Boot в сочетании с MySQL создает минималистскую и эффективную систему управления данными.
boy illustration
Как использовать ArrayPool
boy illustration
Интегрируйте iText в Spring Boot для реализации замены контента на основе шаблонов PDF.
boy illustration
Redis реализует очередь задержки на основе zset
boy illustration
Получить текущий пакет jar. path_java получает файл jar.
boy illustration
Краткое обсуждение высокопроизводительного шлюза Apache ShenYu
boy illustration
Если вы этого не понимаете, то на собеседовании даже не осмелитесь сказать, что знакомы с Redis.
boy illustration
elasticsearch медленный запрос, устранение неполадок записи, запрос с подстановочными знаками