Чи є Python в онлайні? Так, і це ЄPython

Опублікував gromko

Привіт, усім, кого цікавить ІТ, програмування і взагалі, тим, кому цікаво прочитати про чийсь досвід перед сном. Мова йтиме про програмування та Python, але це зовсім не про “пройдіть наш курс за три тижні та будете отримувати по $3000 щомісяця!”

Так, мова буде про Python, і мабуть, не буде потрібно наголошувати, що простий синтаксис та зрозуміла семантика зробили цю мову популярною не тільки серед досвідчених розробників, а й тими, хто тільки-но ступає  на захопливий шлях програмування — школярам та студентам.

Втім, для багатьох перше знайомство з Python часто нагадує квест, в якому потрібно спочатку знайти та встановити середовище програмування, а потім — ще й середовище для розробки програм. Дехто скаже, що це потрібний user experience, але ми будемо говорити про тих, чий попередній досвід обмежується Paint, Word і браузером для перегляду відео на YouTube.

Насправді я вчитель, який викладає інформатику (і програмування також) протягом останніх 35 років (так, у ті часи теж існували комп’ютери), тож мені щоразу приходиться стикатися з безліччю проблем — як суто технічних (підтримка в життєздатному стані раритетної техніки, якій давно місце на звалищі), так психологічного плану — мотивувати учнів до навчання, при тому, що вони по 8-9 годин на добу проводять у ТікТоці.

Однією з  таких проблем є добір необхідного програмного забезпечення, яке працювало б на наших комп’ютерах і було як достатньо сучасним, так і достатньо простим для вивчення. Щодо програмування, то протягом останніх років де-факто “стандартом” стало вивчення Python з використанням навчальних середовищ, таких як Thonny, DrPython або Mu (є і таке), дехто орієнтується на більш професійні IDE (PyCharm, Visual Studio Code). І все було достатньо тихо і спокійно, доки хтось в Ухані не з’їв смажених кажанів.

2020 рік — COVID, пандемія, карантин і навчання онлайн

Коли у 2020 році світ “закрився” на карантин, постала проблема організації дистанційного навчання, і якщо по історії чи географії учням можна було демонструвати навчальні презентації чи відео, то в інформатиці ми отримали купу проблем — інформатика є технологічною дисципліною, де важливі не лише теоретичні знання, а й навички та вміння їх застосовувати при роботі з апаратним та програмним забезпеченням.

Історія про те, як ми виходили з такої ситуації, потребуватиме багато часу, тож ми зупинимось на потребі навчити/навчитись програмувати при тому, що 90% учнів вдома не мають комп’ютерів або ноутбуків, маючи один доступний пристій – мобільний телефон (смартфон).

Дистанційне навчання не чекало і вимагало негайного рішення, тож ми, як і інші школи та викладачі, кинулися шукати та тестувати наявні онлайн-середовища для програмування у Python.

Вимоги до навчального онлайн-середовища програмування:

  • інтегроване середовище, яке поєднує створення та редагування коду з можливістю його виконання та налагодження;
  • підтримка Python вище версії 3.10;
  • підтримка необхідних на для вивчення шкільного курсу бібліотек – turtle, tkinter, matplotlib, тощо;
  • легка реєстрація або навіть без неї;
  • безкоштовність.

Ви скажете, що таких сервісів можна нарахувати дуже багато – Replit, PythonAnywhere, Trinket,  Google Colab та сотні простих “online-компіляторів/інтерпретаторів” — інструментів, де можна набрати або вставити код, запустити його на виконання і відразу побачити результат. Онлайн-середовища мають безліч переваг – швидкий старт без встановлення, доступність на будь-якому пристрої й не потрібно налаштовувати середовище, бібліотеки, шляхи, версії.

Всі ці середовища побудовані на основі трьох технологій:

Виконання на віддаленому сервері, а не у браузері (приклад – Replit). Для виконання коду використовується стандартний інтерпретатор Python, встановлений у контейнері (Docker/Kubernetes), для двостороннього зв’язку в реальному часі між браузером і контейнером на сервері використовується WebSocket. У цьому випадку користувач не бачить жодної різниці порівняно з виконанням на “десктопі”, і це могло б бути рішенням, але більшість подібних сервісів є платними, що відразу виключає їх використання.

Pyodide — проєкт, який використовує Python, скомпільований у WebAssembly (Wasm). Wasm — це низькорівневий байт-код, який браузери можуть виконувати майже зі швидкістю нативного коду.У Pyodideтакі бібліотеки, як NumPy, SciPy, Pandas, Matplotlib, scikit-learn також скомпільовані у WebAssembly. Виконання коду відбувається у браузері, тобто на стороні клієнта.

Все гарно, але при спробі використати бібліотеку tkinter користувач отримує повідомлення “TclError: no display name and no $DISPLAY environment variable” —  Модуль tkinter у Python є обгорткою над графічною бібліотекою Tcl/Tk і потребує графічного сервера, а браузер його не має. Єдиний графічний API, який доступний Pyodide, — це браузерний API (DOM, Canvas, WebGL, CSS).

А як тоді працює Matplotlib? Він може рендерити графіки, використовуючи HTML Canvas/SVG, а не системний графічний сервер.

На наше щастя, є ще один спосіб виконувати код Python безпосередньо у браузері — Skulpt, який не потребує компіляції CPython та виділених серверів, адже це незалежна реалізація інтерпретатора Python, в якій код Python виконується за допомогою JavaScript – він спочатку парситься та перетворюється в абстрактне синтаксичне дерево (AST), а потім інтерпретується віртуальною машиною, написаною на JS, або ж транспілюється безпосередньо у JS-код, який і виконується.

Інтерпретатор має незначний обсяг, швидко працює, але така реалізація накладає певні обмеження — Skulpt підтримує лише “чисті” Python-бібліотеки або власні імплементації бібліотек, які написані на JS. Саме на основі Skulpt створено велику кількість онлайнових інтерпретаторів та “компіляторів” Python – на відміну від сервісів на базі Pyodide, вони завантажуються миттєво і працюють з прийнятною швидкістю.

Вибір — Skulpt

Виходячи з всього вищепереліченого ми зупинились на середовищах, що використовують Skulpt — їх дуже багато, але при спробі запустити код, що використовує tkinter (він нам конче потрібен у 8-ому класі – ми пам’ятаємо, що школа у нас у пріоритеті), як правило, отримуємо повідомлення ModuleNotFoundError: No module named ‘tkinter’ — середовище не містить такого модуля. Втім, знаючи Python, Skulpt та JavaScript можна реалізувати бібліотеку-модуль, яка емулюватиме tkinter.

Отже, вибір був за тим, щоб створити власний застосунок “з нуля”, поєднавши редактор коду (Code Mirror або Ace) та Skulpt, або зробити форк готового застосунку, “допилявши” йог до потрібного стану.

Оскільки ми не хотіли повторюватись та наступати на “граблі”, як це було зроблено до нас, то покопавшись в Мережі та на GitHub, звернули увагу на проєкт Create With Code ( https://create.withcode.uk/) вчителя інформатики зі школи Фулфорд (Північний Йоркшир, Велика Британія) Пітера “Піта” Дрінга, який було створено з метою підтримки навчання програмуванню мовою Python (це те, що цікавило і нас!).

Він був започаткований ще 2018 року, але його привабливість вийшла за межі освіти Британії, адже він спрощує не стільки навчання, а позбавляє необхідності встановлювати Python і надає можливість працювати онлайн. Крім того,  для нас безумовним “плюсом” було те, що програмний код цього застосунку було розміщено на GitHub і вільно поширювався.

Основні можливості Create With Code:

  • не потрібно реєструватися — будь-хто може писати і відразу запускати код, реєстрація потрібна лише для можливості збереження створеного програмного коду на сервері;
  • після збереження коду генерується унікальна URL-адреса, якою можна поділитися з іншими користувачами або надіслати вчителю;
  • середовище можна вбудовувати у сайт, блог чи інший освітній ресурс;
  • є можливість покрокового виконання та перегляду значень змінних;
  • мінімалістичний інтерфейс та можливість налаштування шрифтів і кольорів редактора та консолі(є світлі, так і темні кольорові схеми);
  • часткова імплементація модулів tkinter, pgzrun, music, microbit;
  • код, що виконується, зберігається в локальному сховищі браузера – можна відновити до 50 останніх запущених на виконання програм на Python.

Окрім цих, є також інші “фішки”, і ми певний час користувались ним. Втім, ми хотіли дещо іншого:

  • має бути адаптивний дизайн – має бути однаково зручно працювати на “десктопі”, ноутбуці, планшеті чи мобільнику;
  • можливість збереження створеного програмного коду на локальному пристрої користувача – на жорсткому диску комп’ютера чи в пам’яті мобільного телефону без додаткової реєстрації;
  • покращена реалізація додаткових бібліотек, які використовуються або можуть бути використані при вивченні програмування на Python(turtle, tkinter, matplotlib, PygameZero, тощо);
  • емуляція файлової системи в локальному сховищі браузера для реалізації можливості вивчення роботи з файлами;
  • автоматичний вибір англомовного або україномовного інтерфейсу.

Завдання, як бачите, були досить амбітними, зважаючи на те, що це робилося силами двох ентузіастів у позаробочий час. За цей час було створено онлайн-застосунок ЄPython — початковий програмний код Create With Code було фактично переписано на 90%, хоча в його основі залишилась “зв’язка” CodeMirror + Skulpt і інтерфейс продовжує бути мінімалістичним.

Також було створено програмний інтерфейс для можливості легкого підключення додаткових бібліотек-модулів, а код Skulpt було модифіковано для можливості роботи з файлами — працювати з файлами на локальних пристроях не можна через обмеження, які накладаються системою безпеки браузера, але можна виконувати файлові операції з файлами, що розміщені у localStorage, і за потреби створені файли можна зберегти на комп’ютері, використовуючи інструменти Розпорядника файлів.

Але найбільше зусиль було витрачено на додаткові бібліотеки. На сьогодні зроблено:

  • turtle – “черепашкова” графіка;
  • tkinter- створення графічного інтерфейсу;
  • p5 – реалізація можливостей креативного програмування у P5.js на Python;
  • SimpleGraphics- проста графічна бібліотека від Бена Стефенсона;
  • pgzrun – реалізація PygameZero;
  • music – можливість створення та відтворення музики у нотації MML(Music Macro Language) ;
  • soundfx – відтворення звукових ефектів;
  • matplotlib – реалізація бібліотеки для побудови діаграм та графіків;
  • sqlite3 – підтримка роботи з базами даних;
  • microbit- емуляція плати micro:bit;
  • numpy- частково, розроблялось для підтримки бібліотеки matplotlib.

Чому саме такий набір? Це обумовлено методичними та дидактичними потребами викладання програмування в шкільному курсі інформатики (насправді навіть більше) — учень має можливість набрати та виконати будь-який код на Python з прикладів, наведених у чинних (або майбутніх) підручниках з інформатики.

За потреби середовище можна вбудувати у будь-який сайт чи блог через <iframe>  – як з логотипом ЄPython, так і без нього. Вчитель може створювати “запускачі”(launchers) які відкривають середовище вже з готовим кодом — це може бути знадобитися як для демонстрації або дослідження роботи програмного коду, так і для навчання – учням може надаватися програмний код з помилками, який потрібно виправити, або програмний код, який потрібно певним чином модифікувати.

Середовище легко налаштовується — можна обрати розмір шрифту редактора та консолі, це може бути доречним не тільки для слабозорих учнів, а й для демонстрації коду. Користувачі можуть обрати одну з трьох кольорових схем як для редактора, так і для консолі.

Створений програмний код запускається у браузері — немає ніяких серверів, немає завантажень бібліотек зі сторонніх ресурсів – всі потрібні бібліотеки знаходяться на сайті застосунку(це викликано тим, що в бібліотеках, використовуваних ЄPython. можуть змінюватись API, і це може призвести до проблем у роботі застосунку, а так ми маємо “заморожені” версії бібліотек.

Чому “ЄPython”?

Назва “ЄPython” утворилась зі слогану “Є Python — програмувати просто!” (There is Python – programming is easy!), англійською читається як “YePython” (<ye> вимовляється як у слові “yes”). Інше значення “Є” — вказати на належність до україномовного програмного забезпечення, оскільки літера “є” належить до унікальних, питомо українських, літер абетки.

ЄPython — це безкоштовне онлайнове середовище програмування (Integrated Development Environment, IDE), створене для навчання мові програмування Python. Простий та інтуїтивно зрозумілий інтерфейс ЄPython, відсутність потреби в інсталяції будь-яких додаткових компонентів, надає можливість легкого входу до світу Python, усуваючи складність, яка зазвичай пов’язана з використанням професійних IDE.

Призначення ЄPython:

  • навчання мові програмування Python у закладах загальної середньої, професійно-технічної та вищої освіти;
  • використання в онлайн-курсах та на платформах дистанційної освіти;
  • використання на домашніх пристроях здобувачів знань, які не мають комп’ютера або постійного доступу до Інтернету;
  • швидке прототипування для нескладних задач;
  • демонстрація роботи коду під час презентацій.

ЄPython знаходиться у вільному доступі для всіх, а код застосунку поширюється вільно. Він не збирає особисту інформацію, всі користувачі є анонімними, програмний код виконується лише на пристрої користувача.

Усі файли зберігаються  лише на пристроях користувача (це відрізняє його від Create With Code). Копії створених користувачами програм зберігаються також у локальному сховищі вебоглядача (браузера) і можуть бути вилучені користувачем у будь-який час. Ці файли використовуються лише ЄPython.

Ось тут можна перевірити простенькі приклади на ЄPython:

Користуючись ЄPython, маємо пам’ятати, що це не 100% реалізація Python та відповідних бібліотек за допомогою JavaScript — це було б надто грандіозне завдання, яке, зрештою, і не потрібно, це навчальне середовище, і його функціональності достатньо для вивчення Python. Код, що працює в Є Python, можна без модифікації запускати в “дорослих” середовищах програмування, але не завжди навпаки.

Контент сайту призначений для осіб віком від 21 року. Переглядаючи матеріали, ви підтверджуєте свою відповідність віковим обмеженням.

Cуб'єкт у сфері онлайн-медіа; ідентифікатор медіа - R40-06029.