Прогресс большинства программных проектов строится на малых изменениях, которые, перед тем, как двигаться дальше, тщательно оценивают. Быстрое получение результатов выполнения кода и высокая скорость итеративной разработки — это одни из основных причин успеха Jupyter. В особенности — в сфере научных исследований.
Пользователи Jupyter любят проводить в блокнотах эксперименты, они используют блокноты как интерактивное средство коммуникации. Правда, если говорить о задачах классической разработки ПО, например, о рефакторинге большой кодовой базы, то можно сказать, что для решения таких задач Jupyter часто меняют на обычные IDE.
Окружение JupyterLab
Проект Jupyter уже несколько лет прилагает усилия к тому, чтобы закрыть разрыв между блокнотами и обычными IDE. Эти усилия, в значительной мере, представлены платформой JupyterLab, которая даёт разработчику более совершенный и удобный интерфейс, в который входят менеджер файлов, текстовые редакторы, консоли, блокноты.
Правда, до недавнего времени в JupyterLab кое-чего не хватало. Речь идёт о том, что являло собой главную причину, по которой пользователи вынуждены были переключаться на другие среды. Пользователям Jupyter не хватало визуального отладчика. Пользователи, особенно те из них, которые привыкли к обычным IDE, долго просили об этой возможности.
Сегодня, после нескольких месяцев разработки, мы рады представить вашему вниманию первый публичный релиз визуального отладчика для Jupyter!
Это — лишь первый релиз, но отладчик уже позволяет устанавливать в ячейках блокнотов и в файлах с исходным кодом точки останова. Он позволяет исследовать содержимое переменных, просматривать стек вызовов. И этим его возможности не ограничиваются.
Визуальный отладчик Jupyter в действии
Проект binder
Попробовать новый отладчик в деле можно на сайте проекта binder. Вот демонстрационный блокнот, с которым вы можете поэкспериментировать.
Фронтенд отладчика можно установить в виде расширения JupyterLab:
В будущих релизах фронтенд отладчика будет включён в состав JupyterLab по умолчанию.
На бэкенде, для обеспечения работы отладчика, должно присутствовать ядро, в котором реализован Jupyter Debug Protocol (подробнее о нём мы поговорим ниже). Пока единственное ядро, в котором реализован данный протокол, это — xeus-python. Оно представляет собой Jupyter-ядро для языка программирования Python. (В планах развития проекта есть и поддержка протокола отладчика в ipykernel.)
Установить ядро xeus-python можно так:
После того, как xeus-python и расширение отладчика установлены, всё должно быть готово к работе с визуальным отладчиком Jupyter.
Обратите внимание на то, что существуют и PyPI-«колёса» для xeus-python, но ни всё ещё носят статус экспериментальных, а их доступность зависит от платформы.
Ядра Jupyter (та часть инфраструктуры, которая выполняет пользовательский код) общаются с другими частями системы с использованием чётко разработанного протокола межпроцессного взаимодействия.
Существуют несколько коммуникационных каналов:
В протокол добавлены два новых типа сообщений:
Ключевой принцип архитектуры Jupyter — это отсутствие привязки к некоему языку программирования. Поэтому важно, чтобы протокол отладчика поддерживал бы адаптацию к различным реализациям ядер.
Популярным стандартом в сфере отладки является протокол Debug Adapter Protocol (DAP), разработанный Microsoft. Это — протокол, основанный на JSON, который, например, лежит в основе подсистемы отладки Visual Studio Code. Этот протокол поддерживает множество бэкендов, рассчитанных на различные языки.
В результате для нас было совершенно естественным использование DAP-сообщений посредством недавно добавленных сообщений
Правда, в случае с Jupyter этого оказалось не вполне достаточно:
Содержание запросов к отладчику и его ответов, помимо этих двух отличий, соответствует DAP.
Все эти расширения протокола ядра Jupyter были предложены в качестве кандидатов на включение в официальную спецификацию. Соответствующее предложение по развитию Jupyter (Jupyter Enhancement Proposal, JEP) можно найти здесь.
Xeus — это С++-реализация протокола ядра Jupyter. Это, само по себе, не ядро. Это — библиотека, которая помогает разрабатывать ядра. Эта библиотека полезна при разработке ядер для языков, которые имеют C- или C++-API (вроде Python, Lua или SQL). Она берёт на себя решение трудоёмких задач по реализации протокола обмена сообщениями Jupyter. Это позволяет автору ядра сосредоточиться на задачах, связанных с интерпретацией языковых конструкций: на выполнении кода, на его анализе и так далее.
С использованием xeus было разработано несколько ядер, включая популярное ядро xeus-cling для C++, основанное на C++-интерпретаторе cling, созданном в CERN. Ядро xeus-python — это альтернатива ipykernel, основанная на xeus. Вот материал о первом релизе ядра xeus-python.
Ядро xeus-python подошло для первой реализации протокола отладчика по нескольким причинам:
Среди краткосрочных целей развития xeus-python можно отметить следующие:
То, что уже сделано в плане поддержки отладки во фронтенде, может быть использовано с любыми ядрами, реализующими расширенный протокол ядра.
В этом году мы будем работать над тем, чтобы обеспечить поддержку отладки в как можно большем количестве ядер.
Скоро поддержка отладки появится для других ядер, основанных на xeus, имеющих много общего с ядром xeus-python. Например, для таких, как xeus-cling.
Расширение отладчика для JupyterLab даёт пользователям механизмы, наличия которых обычно ожидают от IDE:
При работе с блокнотами Jupyter сведения о состоянии выполнения кода хранятся в ядре. Но код ячейки может быть выполнен, после чего эта ячейка может быть удалена из блокнота. Что должно произойти в том случае, если пользователю, в ходе отладки, захочется войти в удалённый блок кода?
Расширение поддерживает этот специфический сценарий и умеет выводить код ранее выполненной ячейки в режиме только для чтения.
Переход в код, находящийся в удалённой ячейке
Отлаживать можно и код, находящийся в консолях и в файлах.
Отладка кода из консоли в JupyterLab
Отладка в JupyterLab кода, находящегося в файле
Отладку можно включить на уровне блокнота, что позволят пользователям отлаживать блокнот и, в то же время, работать с другим блокнотом.
Одновременная отладка нескольких блокнотов
Переменные можно просматривать, пользуясь древовидным или табличным представлением.
Средства для исследования переменных
Расширение отладчика для JupyterLab было спроектировано так, чтобы оно могло бы работать с любым ядром, которое поддерживает отладку.
Благодаря тому, что расширение полагается на протокол DAP, оно абстрагирует особенности различных языков и даёт пользователю единообразный интерфейс отладки.
На следующей диаграмме показан поток сообщений, передаваемых в ходе сессии отладки между пользователем, расширением JupyterLab и ядром.
Использование Debug Adapter Protocol в отладчике (источник)
В 2020 году мы планируем серьёзно улучшить отладчик. А именно, речь идёт о следующем:
Уважаемые читатели! А вы уже пробовали визуальный отладчик Jupyter?
Пользователи Jupyter любят проводить в блокнотах эксперименты, они используют блокноты как интерактивное средство коммуникации. Правда, если говорить о задачах классической разработки ПО, например, о рефакторинге большой кодовой базы, то можно сказать, что для решения таких задач Jupyter часто меняют на обычные IDE.
Окружение JupyterLab
Проект Jupyter уже несколько лет прилагает усилия к тому, чтобы закрыть разрыв между блокнотами и обычными IDE. Эти усилия, в значительной мере, представлены платформой JupyterLab, которая даёт разработчику более совершенный и удобный интерфейс, в который входят менеджер файлов, текстовые редакторы, консоли, блокноты.
Правда, до недавнего времени в JupyterLab кое-чего не хватало. Речь идёт о том, что являло собой главную причину, по которой пользователи вынуждены были переключаться на другие среды. Пользователям Jupyter не хватало визуального отладчика. Пользователи, особенно те из них, которые привыкли к обычным IDE, долго просили об этой возможности.
Отладчик для Jupyter
Сегодня, после нескольких месяцев разработки, мы рады представить вашему вниманию первый публичный релиз визуального отладчика для Jupyter!
Это — лишь первый релиз, но отладчик уже позволяет устанавливать в ячейках блокнотов и в файлах с исходным кодом точки останова. Он позволяет исследовать содержимое переменных, просматривать стек вызовов. И этим его возможности не ограничиваются.
Визуальный отладчик Jupyter в действии
Испытание отладчика на сайте проекта binder
Проект 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 сведения о состоянии выполнения кода хранятся в ядре. Но код ячейки может быть выполнен, после чего эта ячейка может быть удалена из блокнота. Что должно произойти в том случае, если пользователю, в ходе отладки, захочется войти в удалённый блок кода?
Расширение поддерживает этот специфический сценарий и умеет выводить код ранее выполненной ячейки в режиме только для чтения.
Переход в код, находящийся в удалённой ячейке
Отлаживать можно и код, находящийся в консолях и в файлах.
Отладка кода из консоли в JupyterLab
Отладка в JupyterLab кода, находящегося в файле
Отладку можно включить на уровне блокнота, что позволят пользователям отлаживать блокнот и, в то же время, работать с другим блокнотом.
Одновременная отладка нескольких блокнотов
Переменные можно просматривать, пользуясь древовидным или табличным представлением.
Средства для исследования переменных
Расширение отладчика для JupyterLab было спроектировано так, чтобы оно могло бы работать с любым ядром, которое поддерживает отладку.
Благодаря тому, что расширение полагается на протокол DAP, оно абстрагирует особенности различных языков и даёт пользователю единообразный интерфейс отладки.
На следующей диаграмме показан поток сообщений, передаваемых в ходе сессии отладки между пользователем, расширением JupyterLab и ядром.
Использование Debug Adapter Protocol в отладчике (источник)
Планы на будущее
В 2020 году мы планируем серьёзно улучшить отладчик. А именно, речь идёт о следующем:
- Поддержка вывода различных MIME-типов в окне исследования переменных.
- Поддержка работы с условными точками останова в интерфейсе отладчика.
- Повышение удобства работы с интерфейсом отладчика.
- Реализация возможности отладки Voilà-приложений из расширения
@jupyter-voila/jupyterlab-preview
.
Уважаемые читатели! А вы уже пробовали визуальный отладчик Jupyter?