Это гостевое сообщение в блоге Фабио Ниефаус из Группы архитектуры программного обеспечения, возглавляемой Робертом Хиршфельдом, из Института Хассо Платтнера при Потсдамском университете, Германия.

В летнем семестре 2019 года мы провели семинар по программированию полиглотов в рамках нашей выпускной программы в Институте Хассо Платтнера в Потсдаме, Германия. Основной целью семинара было изучение области программирования полиглотов с использованием различных технологий GraalVM и GraalSqueak, нашей реализации Squeak / Smalltalk для GraalVM. Это помогло нам лучше понять как преимущества, так и проблемы программирования полиглотов. Поскольку Опыт программирования - одна из наших ключевых тем исследования, мы сосредоточились на языковом взаимодействии и инструментах, которые предоставляет GraalVM. Чтобы лучше понять и то, и другое, мы призвали наших студентов обсудить, как они используют GraalVM, и поделиться своими уроками, извлеченными в ходе семинара. Семь студенческих команд приняли участие в семинаре и работали над своими проектами в течение четырех месяцев. В этом сообщении блога мы обобщаем результаты и выделяем некоторые из этих проектов.

Ядро Polyglot Jupyter

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

В предыдущей работе мы создали PolyJuS, многоязычную записную систему, написанную на Squeak / Smalltalk. Эта система может использовать не только Polyglot API GraalVM. Что еще более важно, это помогает пользователю понять взаимодействие между объектами и данными из разных языков программирования.

Студенческий проект преследовал двоякую цель: создать многоязычное ядро ​​GraalVM для Jupyter и предложить аналогичные возможности PolyJuS в обычных записных книжках Jupyter. Вот что придумали наши студенты:

Вместо того, чтобы писать ядро ​​Jupyter с нуля, наши студенты решили включить IJavaScript в IPolyglot, который работает на NodeJS GraalVM. Это позволило им сосредоточиться на интеграции Polyglot API. Один из аспектов, оказывающих влияние на пользователя, - это способ разделения объектов между ячейками кода. Polyglot API предоставляет вызовы для экспорта значений с одного языка и для повторного импорта этих значений в другие. Однако необходимость явного использования этого API является обузой для пользователя. Вместо этого мы разработали механизм, который автоматизирует совместное использование переменных между языками. Для этого IPolyglot собирает переменные, предопределенные в глобальном пространстве имен каждого языка. Затем он может определять новые переменные на основе этой информации, которая автоматически экспортируется соответствующим образом. Перед выполнением каждой ячейки кода все эти переменные автоматически импортируются на целевой язык. Хотя этот подход имеет некоторые ограничения, в общих случаях он работает достаточно хорошо. Тем не менее, пользователь всегда может вернуться к явному совместному использованию объектов, если это необходимо.

Чтобы помочь пользователям отслеживать объекты и данные, совместно используемые языками, наши студенты также разделили инспектор переменных из расширений записной книжки Jupyter и превратили его в инспектор Polyglot. Подобно проводнику PolyJuS для привязок полиглотов, этот инспектор можно использовать для исследования, какие переменные являются (автоматически) общими и, следовательно, доступны во всех ячейках кода. Мы считаем, что это упрощает понимание того, какие объекты используются совместно и на какие сообщения они отвечают.

Если вы хотите попробовать IPolyglot, вот как вы можете запустить его в Docker.

Редактор кода для программирования полиглотов

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

В рамках этого проекта студенты создали редактор кода в GraalSqueak, который интегрирует API-интерфейс Polyglot. Вот что они придумали:

Переключение на другой язык программирования в рамках той же кодовой базы означает переключение на другой синтаксис, а также на другую семантику. Мы решили использовать цвета для визуализации этого типа изменений в редакторе кода полиглота. Кроме того, редактор запрашивает ввод данных пользователем при использовании функций, предоставляемых Polyglot API. Хотя этот API доступен на всех официально поддерживаемых языках GraalVM, фактические способы взаимодействия с ним немного отличаются (например, из-за языковых ограничений). Однако редактор всегда одним и тем же способом запрашивает у пользователя одни и те же функции. Затем он автоматически генерирует вызов API на соответствующем языке и может даже при необходимости обновлять импорт. Он также отслеживает, какие переменные были экспортированы в привязки полиглотов GraalVM, и выводит их список, когда пользователь запрашивает импорт.

Вдохновленный языковыми полями, редактор кода также поддерживает Code Boxes. Блоки кода - это способ нашего редактора интегрировать вызовы API для оценки кода. Обычно пользователю необходимо создать новый файл и переключиться на него в редакторе. С другой стороны, блоки кода полностью управляются редактором. Редактор создает новый файл для каждой ячейки кода в фоновом режиме и соответственно вставляет вызовы API Polyglot. Блоки кода поддерживают несколько уровней вложенности. Итак, в качестве примера вы можете написать файл JavaScript с вложенным блоком кода Python, который снова содержит блок кода JavaScript.

Реализация нашего редактора также является полиглотом: например, он использует библиотеку Ruby для выделения синтаксиса и Python для управления окончаниями строк.

Помощь разработчикам в поиске правильного кода

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

Инструмент Polyglot Code Finder позволяет пользователю искать фрагменты кода, написанные на языках, поддерживаемых базовой GraalVM в StackOverflow. Он интегрирован в редактор кода и в нашу систему блокнотов PolyJuS. В редакторе кода инструмент автоматически создает новые поля кода и новые ячейки кода в системе записной книжки. Подобно редактору кода, инструмент поиска кода является полиглотом: его пользовательский интерфейс написан на Squeak / Smalltalk, а серверная часть использует Python и Ruby для поиска, проверки и очистки фрагментов кода. Представьте, что у вас есть такой инструмент в IDE или редакторе по вашему выбору с поддержкой StackOverflow, GitHub и языковой документации!

Тестирование Oracle Database MLE

Oracle Labs работает над интеграцией GraalVM в Oracle Database. Это позволяет писать хранимые процедуры и определяемые пользователем функции на языках высокого уровня, таких как JavaScript или Python.

В рамках нашего семинара студенческая команда протестировала Oracle Database Multilingual Engine (MLE), используя два разных алгоритма, взятых из реальных приложений: Elo - это шахматная рейтинговая система, которая подсчитывает оценки игроков на основе их предыдущего результата и случайная величина. Таким образом, этот тест вызывает много операций чтения и записи при использовании в настройке базы данных, но относительно низкое использование ЦП. Доступный к обещанию (ATP) - это бизнес-алгоритм определения объемов и сроков поставки для запросов заказов. Для этого алгоритму необходимо один раз прочитать все необходимые данные, чтобы иметь возможность рассчитать результат. Однако расчет основан на отслеживании с возвратом. Таким образом, этот тест имеет относительно низкое использование базы данных, но высокие требования к процессору.

Наши студенты решили реализовать оба теста на JavaScript, чтобы иметь возможность сравнивать MLE с установкой NodeJS. На рисунке 1 показана их настройка тестов: тесты выполнялись на вычислительном инстансе в Oracle Cloud с использованием супервизора тестов. Этот супервизор, в свою очередь, запускал оба теста с разными размерами проблем отдельно в образе докера MLE и в стандартном NodeJS, подключенном к той же базе данных Oracle, размещенной на Docker.

Вот краткое изложение того, что измерили наши студенты:

Наши студенты обнаружили, что MLE более эффективен, чем установка NodeJS в тесте Elo. Мы считаем, что это связано с тем, что можно избежать накладных расходов, связанных с сетевым подключением.

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

Инструменты рендеринга Squeak / Smalltalk в Java Swing

Программирование на полиглотах позволяет разработчикам повторно использовать программные библиотеки и фреймворки на разных языках. В этом проекте наши студенты экспериментировали с использованием другого фреймворка пользовательского интерфейса (UI) в GraalSqueak. Традиционно Squeak / Smalltalk использует ToolBuilder, основной компонент, следующий за шаблоном построителя, для создания инструментов из спецификации. Фреймворк пользовательского интерфейса по умолчанию в Squeak / Smalltalk называется Morphic и предоставляет морфы в качестве основных элементов пользовательского интерфейса, подобных контейнерам div в HTML. MorphicToolBuilder собирает большинство инструментов Squeak / Smalltalk, включая рабочую область, обозреватель кода и отладчик с использованием Morphs. В рамках нашего семинара студенты реализовали JavaToolBuilder, который использует те же спецификации инструмента, но строит их с помощью Java Swing. Вот демонстрация того, как это выглядит:

Как и в оригинальной Спецификации Smalltalk-80, морфы по-прежнему переносятся на растровое изображение дисплея. Таким образом, оборудование для рендеринга не выигрывает от сегодняшнего ускорения графического процессора. Это особенно проблема дисплеев с высоким разрешением, которые могут отображать значительно больше пикселей, чем исходный Xerox Alto. JavaToolBuilder, с другой стороны, позволяет нам отображать инструменты Squeak / Smalltalk в собственных окнах без необходимости реализации нового графического интерфейса. Мы считаем, что это еще один пример того, что возможно с полиглотным программированием и GraalVM в будущем.

Заключение

Как мы и надеялись, наши студенты получили массу удовольствия от изучения GraalVM и программирования полиглотов в рамках семинара. Помимо поиска и исправления ошибок взаимодействия в языках GraalVM, они дали очень разнообразные и интересные результаты: ядро ​​Jupyter на основе GraalVM, редактор кода для многоязычного программирования, инструмент для поиска кода в Интернете, эксперименты с фреймворками пользовательского интерфейса и тесты производительности MLE. . Кроме того, мы выявили различные проблемы удобства использования (например, управление зависимостями полиглотов) и разработали первые идеи о том, как GraalVM может их решать в будущем.

Здесь мы хотели бы поблагодарить Марио Вольчко и команду GraalVM за их поддержку и отзывы в ходе семинара, а также наших студентов за их выдающуюся работу. Мы с нетерпением ждем следующих шагов по развитию программирования полиглотов!