[Перевод] Визуальный отладчик для Jupyter

Прогресс большинства программных проектов строится на малых изменениях, которые, перед тем, как двигаться дальше, тщательно оценивают. Быстрое получение результатов выполнения кода и высокая скорость итеративной разработки — это одни из основных причин успеха Jupyter. В особенности — в сфере научных исследований.

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

3e4bfd89b301022aa64cfdf88599954e.png


Окружение JupyterLab

Проект Jupyter уже несколько лет прилагает усилия к тому, чтобы закрыть разрыв между блокнотами и обычными IDE. Эти усилия, в значительной мере, представлены платформой JupyterLab, которая даёт разработчику более совершенный и удобный интерфейс, в который входят менеджер файлов, текстовые редакторы, консоли, блокноты.

Правда, до недавнего времени в JupyterLab кое-чего не хватало. Речь идёт о том, что являло собой главную причину, по которой пользователи вынуждены были переключаться на другие среды. Пользователям Jupyter не хватало визуального отладчика. Пользователи, особенно те из них, которые привыкли к обычным IDE, долго просили об этой возможности.

Отладчик для Jupyter


Сегодня, после нескольких месяцев разработки, мы рады представить вашему вниманию первый публичный релиз визуального отладчика для Jupyter!

Это — лишь первый релиз, но отладчик уже позволяет устанавливать в ячейках блокнотов и в файлах с исходным кодом точки останова. Он позволяет исследовать содержимое переменных, просматривать стек вызовов. И этим его возможности не ограничиваются.

4809780a6335687b5f7e00d609203b99.gif


Визуальный отладчик Jupyter в действии

Испытание отладчика на сайте проекта binder


101e91fd69047444a7eaced5984b6c41.png


Проект binder

Попробовать новый отладчик в деле можно на сайте проекта binder. Вот демонстрационный блокнот, с которым вы можете поэкспериментировать.

Установка


Фронтенд отладчика можно установить в виде расширения JupyterLab:

jupyter labextension install @jupyterlab/debugger


В будущих релизах фронтенд отладчика будет включён в состав JupyterLab по умолчанию.

На бэкенде, для обеспечения работы отладчика, должно присутствовать ядро, в котором реализован Jupyter Debug Protocol (подробнее о нём мы поговорим ниже). Пока единственное ядро, в котором реализован данный протокол, это — xeus-python. Оно представляет собой Jupyter-ядро для языка программирования Python. (В планах развития проекта есть и поддержка протокола отладчика в ipykernel.)

Установить ядро xeus-python можно так:

conda install xeus-python -c conda-forge


После того, как xeus-python и расширение отладчика установлены, всё должно быть готово к работе с визуальным отладчиком Jupyter.

Обратите внимание на то, что существуют и PyPI-«колёса» для xeus-python, но ни всё ещё носят статус экспериментальных, а их доступность зависит от платформы.

Подробности о Jupyter Debug Protocol


▍Новые типы сообщений для каналов Control и IOPub


Ядра Jupyter (та часть инфраструктуры, которая выполняет пользовательский код) общаются с другими частями системы с использованием чётко разработанного протокола межпроцессного взаимодействия.

Существуют несколько коммуникационных каналов:

  • Канал Shell, который работает по схеме запрос/ответ и используется, например, для запросов на выполнение кода.
  • Канал IOPub, который представляет собой односторонний канал связи, идущий от ядра к клиенту. Он используется, например, для перенаправления стандартных потоков вывода (stdout и stderr).
  • Канал Control, похожий на канал Shell, но работающий на другом сокете. Благодаря этому его сообщения не ставятся в очередь вместе запросами на выполнение кода и имеют более высокий приоритет. Канал Control уже использовался для запросов Interrupt и Shutdown. Мы решили, что будем использовать его и для команд, отправляемых отладчику.


В протокол добавлены два новых типа сообщений:

  • Сообщения debug_[request/reply], которые используются для запроса выполнения отладчиком некоего действия. Например — это добавление в код точки останова или пошаговое выполнение кода. Такие сообщения отправляются в канал Control.
  • Односторонние сообщения debug_event, которые используются отладочным ядром для отправки сведений о событиях отладки фронтенду. Такие сообщения отправляются через канал IOPub.


▍Расширение Debug Adapter Protocol


Ключевой принцип архитектуры Jupyter — это отсутствие привязки к некоему языку программирования. Поэтому важно, чтобы протокол отладчика поддерживал бы адаптацию к различным реализациям ядер.

Популярным стандартом в сфере отладки является протокол Debug Adapter Protocol (DAP), разработанный Microsoft. Это — протокол, основанный на JSON, который, например, лежит в основе подсистемы отладки Visual Studio Code. Этот протокол поддерживает множество бэкендов, рассчитанных на различные языки.

В результате для нас было совершенно естественным использование DAP-сообщений посредством недавно добавленных сообщений debug_[request/reply] и debug_event.

Правда, в случае с Jupyter этого оказалось не вполне достаточно:

  • Для поддержки перезагрузки страницы, или для случаев, когда клиент подключается в процессе работы, ядра Jupyter должны хранить состояние отладчика (точки останова, сведения о том, остановлен ли в данный момент отладчик). Фронтенд может запрашивать это состояние с помощью сообщения debug_request.
  • Для поддержки отладки кода, находящегося в ячейках блокнота, и для поддержки консолей Jupyter, которые не основаны на файлах с исходным кодом, нам, кроме того, нужны были сообщения, позволяющие отправлять отладчику код, в который могут быть добавлены точки останова.


Содержание запросов к отладчику и его ответов, помимо этих двух отличий, соответствует DAP.

Все эти расширения протокола ядра Jupyter были предложены в качестве кандидатов на включение в официальную спецификацию. Соответствующее предложение по развитию Jupyter (Jupyter Enhancement Proposal, JEP) можно найти здесь.

Xeus-python — первое ядро Jupyter, поддерживающее отладку


Xeus — это С++-реализация протокола ядра Jupyter. Это, само по себе, не ядро. Это — библиотека, которая помогает разрабатывать ядра. Эта библиотека полезна при разработке ядер для языков, которые имеют C- или C++-API (вроде Python, Lua или SQL). Она берёт на себя решение трудоёмких задач по реализации протокола обмена сообщениями Jupyter. Это позволяет автору ядра сосредоточиться на задачах, связанных с интерпретацией языковых конструкций: на выполнении кода, на его анализе и так далее.

С использованием xeus было разработано несколько ядер, включая популярное ядро xeus-cling для C++, основанное на C++-интерпретаторе cling, созданном в CERN. Ядро xeus-python — это альтернатива ipykernel, основанная на xeus. Вот материал о первом релизе ядра xeus-python.

Ядро xeus-python подошло для первой реализации протокола отладчика по нескольким причинам:

  • Оно поддерживает конкурентное выполнение кода, что позволяет выполнять работу с каналом Control в отдельном потоке.
  • Оно отличается компактной кодовой базой. Благодаря этому данное ядро является хорошей «песочницей», в которой удобно реализовывать что-то новое. Реализация первой версии протокола отладчика в ipykernel потребовала бы более серьёзного рефакторинга и больших усилий по согласованию изменений на ранних стадиях разработки.


▍План развития ядра xeus-python


Среди краткосрочных целей развития xeus-python можно отметить следующие:

  • Добавление поддержки возможностей IPython. Сейчас это, в сравнении с ipykernel, является основной отсутствующей возможностью xeus-python.
  • Улучшение PyPI-«колёс» xeus-python.


▍О других ядрах


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

В этом году мы будем работать над тем, чтобы обеспечить поддержку отладки в как можно большем количестве ядер.

Скоро поддержка отладки появится для других ядер, основанных на xeus, имеющих много общего с ядром xeus-python. Например, для таких, как xeus-cling.

Подробности об архитектуре фронтенда отладчика


Расширение отладчика для JupyterLab даёт пользователям механизмы, наличия которых обычно ожидают от IDE:

  • Боковая панель с окнами, реализующими следующие возможности: наблюдение за переменными, просмотр точек останова, просмотр кода, анализ стека вызовов.
  • Возможность устанавливать точки останова прямо в коде, в частности — в коде, находящемся в ячейках блокнота и в консолях.
  • Визуальные маркеры, указывающие позицию, в которой остановилось выполнение кода.


При работе с блокнотами Jupyter сведения о состоянии выполнения кода хранятся в ядре. Но код ячейки может быть выполнен, после чего эта ячейка может быть удалена из блокнота. Что должно произойти в том случае, если пользователю, в ходе отладки, захочется войти в удалённый блок кода?

Расширение поддерживает этот специфический сценарий и умеет выводить код ранее выполненной ячейки в режиме только для чтения.

2a7fdf2c3b26f584785a0c92ff852901.gif


Переход в код, находящийся в удалённой ячейке

Отлаживать можно и код, находящийся в консолях и в файлах.

921eab7cca4884f20dba3919a51bb684.gif


Отладка кода из консоли в JupyterLab

52f15106895e10e9acf40ac7776f8bf5.gif


Отладка в JupyterLab кода, находящегося в файле

Отладку можно включить на уровне блокнота, что позволят пользователям отлаживать блокнот и, в то же время, работать с другим блокнотом.

4f71b58e05be7e4b46728f3b9cf93f65.gif


Одновременная отладка нескольких блокнотов

Переменные можно просматривать, пользуясь древовидным или табличным представлением.

f3a33ebae0a1ab5676e968a6aa7959b7.gif


Средства для исследования переменных

Расширение отладчика для JupyterLab было спроектировано так, чтобы оно могло бы работать с любым ядром, которое поддерживает отладку.

Благодаря тому, что расширение полагается на протокол DAP, оно абстрагирует особенности различных языков и даёт пользователю единообразный интерфейс отладки.

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

3a87a676457d16f4d0139f0527ae084a.png


Использование Debug Adapter Protocol в отладчике (источник)

Планы на будущее


В 2020 году мы планируем серьёзно улучшить отладчик. А именно, речь идёт о следующем:

  • Поддержка вывода различных MIME-типов в окне исследования переменных.
  • Поддержка работы с условными точками останова в интерфейсе отладчика.
  • Повышение удобства работы с интерфейсом отладчика.
  • Реализация возможности отладки Voilà-приложений из расширения @jupyter-voila/jupyterlab-preview.


Уважаемые читатели! А вы уже пробовали визуальный отладчик Jupyter?

a_bsaactpbr8fltzymtkhqbw1d4.png

© Habrahabr.ru