Debugger Visual untuk Jupyter

Kemajuan sebagian besar proyek perangkat lunak didasarkan pada perubahan kecil, yang, sebelum melanjutkan, dievaluasi dengan cermat. Hasil cepat dari eksekusi kode dan kecepatan tinggi pengembangan berulang adalah beberapa alasan utama untuk kesuksesan Jupyter. Terutama di bidang penelitian ilmiah.

Pengguna Jupyter suka bereksperimen dengan notebook, mereka menggunakan notebook sebagai sarana komunikasi interaktif. Namun, jika kita berbicara tentang tugas-tugas pengembangan perangkat lunak klasik, misalnya, refactoring basis kode besar, maka kita dapat mengatakan bahwa untuk memecahkan masalah seperti itu, Jupyter sering diganti dengan IDE biasa.


Lingkungan JupyterLab

Proyek Jupyter telah bekerja selama beberapa tahun untuk menutup kesenjangan antara notebook dan IDE biasa. Upaya ini sebagian besar diwakili oleh platform JupyterLab, yang memberikan pengembang antarmuka yang lebih maju dan nyaman, yang meliputi manajer file, editor teks, konsol, notes.

Benar, sampai baru-baru ini, ada sesuatu yang hilang di JupyterLab. Ini adalah tentang apa alasan utama mengapa pengguna dipaksa untuk beralih ke lingkungan lain. Pengguna Jupyter tidak memiliki debugger visual. Pengguna, terutama mereka yang terbiasa dengan IDE biasa, telah lama meminta fitur ini.

Debugger untuk Jupyter


Hari ini, setelah beberapa bulan pengembangan, kami dengan bangga mempersembahkan rilis publik pertama dari debugger visual untuk Jupyter!

Ini hanya rilis pertama, tetapi debugger sudah memungkinkan Anda untuk mengatur breakpoint dalam sel notebook dan file sumber. Ini memungkinkan Anda memeriksa isi variabel, melihat tumpukan panggilan. Dan kemampuannya tidak terbatas pada ini.


Jupyter Visual Debugger beraksi

Menguji debugger di situs proyek binder



Proyek pengikat Anda dapat

mencoba debugger baru dalam kasus ini di situs web proyek pengikat. Ini adalah notepad demo yang dapat digunakan untuk percobaan.

Instalasi


Frontend dari debugger dapat diinstal sebagai ekstensi JupyterLab:

jupyter labextension install @jupyterlab/debugger

Dalam rilis mendatang, frontend debugger akan dimasukkan dalam JupyterLab secara default.

Di backend, agar debugger berfungsi, harus ada kernel di mana Protokol Jupyter Debug diimplementasikan (kita akan berbicara lebih banyak tentangnya di bawah). Sejauh ini, satu-satunya kernel yang mengimplementasikan protokol ini adalah xeus-python . Ini adalah inti Jupyter untuk bahasa pemrograman Python. (Rencana pengembangan proyek juga menyertakan dukungan untuk protokol debugger di ipykernel.)

Anda dapat menginstal kernel xeus-python seperti ini:

conda install xeus-python -c conda-forge

Setelah xeus-python dan ekstensi debugger diinstal, semuanya harus siap untuk bekerja dengan debugger visual Jupyter.

Perhatikan fakta bahwa ada juga "roda" PyPI untuk xeus-python, tetapi mereka masih memiliki status eksperimental, dan ketersediaannya tergantung pada platform.

Rincian Protokol Debug Jupyter


▍Baru jenis pesan untuk saluran Kontrol dan IOP


Kernel Jupyter (bagian dari infrastruktur yang mengeksekusi kode pengguna) berkomunikasi dengan bagian lain dari sistem menggunakan protokol komunikasi antarproses yang dikembangkan dengan baik .

Ada beberapa saluran komunikasi:

  • Saluran Shellyang berfungsi sesuai dengan skema permintaan / respons dan digunakan, misalnya, untuk permintaan eksekusi kode.
  • Saluran IOPub, yang merupakan saluran komunikasi satu arah yang berjalan dari inti ke klien. Ini digunakan, misalnya, untuk mengarahkan aliran keluaran standar ( stdoutdan stderr).
  • Saluran Controlserupa dengan saluran Shelltetapi beroperasi pada soket yang berbeda. Karena itu, pesannya tidak diantrikan bersama dengan permintaan untuk eksekusi kode dan memiliki prioritas yang lebih tinggi. Saluran Controltelah digunakan untuk kueri Interruptdan Shutdown. Kami memutuskan bahwa kami akan menggunakannya untuk perintah yang dikirim ke debugger.

Dua jenis pesan baru telah ditambahkan ke protokol:


▍ Debug Adapter Protocol


Prinsip utama arsitektur Jupyter adalah kurangnya ikatan pada bahasa pemrograman tertentu. Karena itu, penting agar protokol debugger mendukung adaptasi ke berbagai implementasi kernel.

Standar debugging yang populer adalah Debug Adapter Protocol (DAP), yang dikembangkan oleh Microsoft. Ini adalah protokol berbasis JSON yang, misalnya, mendasari subsistem debugging Visual Studio Code. Protokol ini mendukung banyak backend yang dirancang untuk berbagai bahasa.

Akibatnya, sangat wajar bagi kami untuk menggunakan pesan DAP melalui pesan debug_[request/reply]dan debug_event.

Namun, dalam kasus Jupyter ini tidak cukup:

  • , , , Jupyter ( , , ). debug_request.
  • , , Jupyter, , , , , , .

Isi permintaan untuk debugger dan jawabannya, selain dua perbedaan ini, sesuai dengan DAP.

Semua ekstensi ini ke protokol kernel Jupyter telah diusulkan sebagai kandidat untuk dimasukkan dalam spesifikasi resmi. Proposal pengembangan Jupyter terkait (JEPyter Enhancement Proposal, JEP) dapat ditemukan di sini .

Xeus-python adalah kernel Jupyter pertama yang mendukung debugging


Xeus adalah implementasi C ++ dari protokol kernel Jupyter. Ini, dalam dirinya sendiri, bukan intinya. Ini adalah perpustakaan yang membantu mengembangkan kernel. Perpustakaan ini berguna dalam mengembangkan kernel untuk bahasa yang memiliki API C atau C ++ - (seperti Python, Lua, atau SQL). Dia mengurus tugas-tugas memakan waktu pelaksanaan yang protokol pesan Jupyter. Hal ini memungkinkan penulis kernel untuk fokus pada tugas-tugas yang terkait dengan interpretasi konstruksi bahasa: pada eksekusi kode, analisisnya, dan sebagainya.

Beberapa kernel dikembangkan menggunakan xeus, termasuk inti xeus-cling populer untuk C ++, berdasarkan pada interpreter cling C ++ yang dibuat di CERN. The xeus-python kernel merupakan alternatif ipykernel berdasarkan xeus. Sinimateri tentang rilis pertama xeus-python kernel.

Kernel xeus-python cocok untuk implementasi pertama dari protokol debugger karena beberapa alasan:

  • Ini mendukung eksekusi kode kompetitif, yang memungkinkan Anda untuk melakukan pekerjaan dengan saluran Controldi utas terpisah.
  • Ini fitur basis kode yang ringkas. Berkat ini, kernel ini adalah "kotak pasir" yang bagus di mana nyaman untuk mengimplementasikan sesuatu yang baru. Menerapkan versi pertama protokol debugger di ipykernel akan memerlukan refactoring yang lebih serius dan lebih banyak upaya untuk mengoordinasikan perubahan pada tahap awal pengembangan.

▍ Paket pengembangan kernel Xeus-python


Di antara tujuan pengembangan jangka pendek xeus-python adalah sebagai berikut:

  • Menambahkan dukungan untuk fitur IPython. Sekarang ini, dibandingkan dengan ipykernel, adalah fitur utama yang hilang dari xeus-python.
  • Peningkatan PyPI- "roda" dari xeus-python.

▍Tentang core lainnya


Apa yang telah dilakukan dalam hal dukungan untuk debugging di frontend dapat digunakan dengan kernel apa saja yang mengimplementasikan protokol kernel yang diperluas.

Tahun ini kami akan bekerja untuk memberikan dukungan debug sebanyak mungkin.

Dukungan debugging akan segera hadir untuk kernel berbasis xeus lainnya yang memiliki banyak kesamaan dengan kernel xeus-python. Misalnya, untuk seperti xeus-cling.

Rincian Arsitektur Front End Debugger


Ekstensi debugger untuk JupyterLab memberi pengguna mekanisme yang biasanya diharapkan dari IDE:

  • Bilah samping dengan jendela yang menerapkan fitur-fitur berikut: variabel pemantauan, melihat breakpoint, melihat kode, menganalisis tumpukan panggilan.
  • Kemampuan untuk mengatur breakpoints langsung dalam kode, khususnya dalam kode yang terletak di sel notepad dan di konsol.
  • Penanda visual yang menunjukkan posisi di mana eksekusi kode berhenti.

Saat bekerja dengan notebook Jupyter, informasi tentang status eksekusi kode disimpan dalam kernel. Tetapi kode sel dapat dieksekusi, setelah itu sel ini dapat dihapus dari notebook. Apa yang harus terjadi jika pengguna, selama debugging, ingin memasukkan blok kode jarak jauh?

Ekstensi mendukung skenario khusus ini dan dapat menampilkan kode sel yang sebelumnya dieksekusi dalam mode hanya baca.


Beralih ke kode yang terletak di sel jarak jauh Anda

dapat men-debug kode yang terletak di konsol dan dalam file.


Kode debug dari konsol di JupyterLab


Debugging di JupyterLab kode dalam file

Debugging dapat diaktifkan di tingkat notepad, yang akan memungkinkan pengguna untuk men-debug notepad dan, pada saat yang sama, bekerja dengan notepad lain.


Men-debug beberapa buku catatan sekaligus

Variabel dapat dilihat menggunakan tampilan hierarki atau tabel.


Alat untuk mengeksplorasi variabel

. Ekstensi debugger untuk JupyterLab dirancang untuk bekerja dengan kernel apa pun yang mendukung debugging.

Karena fakta bahwa ekstensi bergantung pada protokol DAP, ekstensi abstrak dari berbagai bahasa dan memberikan pengguna antarmuka debugging yang konsisten.

Diagram berikut menunjukkan aliran pesan yang dikirim selama sesi debug antara pengguna, ekstensi JupyterLab, dan kernel.


Menggunakan Debug Adapter Protocol di debugger ( sumber )

Rencana masa depan


Pada tahun 2020, kami berencana untuk meningkatkan debugger secara serius. Yaitu, kita berbicara tentang hal berikut:

  • Dukungan untuk menghasilkan berbagai jenis MIME di jendela penjelajah variabel.
  • Dukungan untuk bekerja dengan breakpoint bersyarat di antarmuka debugger.
  • Meningkatkan kegunaan antarmuka debugger.
  • Menerapkan kemampuan untuk men-debug aplikasi Voila dari ekstensi @jupyter-voila/jupyterlab-preview.

Pembaca yang budiman! Sudahkah Anda mencoba debugger visual Jupyter?


All Articles